Trivial Solutions The LoseThos 64-bit PC Operating System File:/LT/Adam/Ltf/LtfMain.APZ This, and all LoseThos files, are public domain. Do whatever you like. God is watching; God is just; God is never out-done in generosity. He talks! LoseThos code compiles with the 64-bit LoseThos compiler/assembler I wrote. Boot the LoseThos CD and you can compile it. Not in Kansas anymore! Click here for preliminary compiler information you need. #help_index "Ltf/Cmd Line (Typically);Cmd Line (Typically)" Ltf *EdJoin(U8 *filename,BoolI8 bail) { //bail is for LinkChk() U8 *buf=StrNew(filename), *temp_filename=StrNew(filename), *tfn_ptr=temp_filename, *ptr; I64 i,num=1; SrcSymHashEntry *temph; BoolI8 cont; Ltf *l=NULL; i=LK_FILE; if (StrLen(filename)>3 && filename[2]==':') { buf[2]=0; i=DefineMatch(buf,"ST_LINK_TYPES",LEF_IGNORE_CASE); tfn_ptr=temp_filename+3; switch (i) { case LK_MAN_PAGE: if (temph=HashFind(tfn_ptr,Fs->hash_table,HTT_SRC_SYM)) { if (temph->type&HTT_DEFINE_STR && temph><(DefineStrHashEntry *)->caller) { Free(buf); if (buf=SrcEdLink(temph><(DefineStrHashEntry *)->caller,DFT_ADDR_LINK_BIN_SIZE)) l=EdJoin(buf,bail); } else l=EdJoin(temph->src_link,bail); } goto et_done; case LK_ADDR: if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; i=A2I(ptr+1); } else i=DFT_ADDR_LINK_BIN_SIZE; Free(buf); if (buf=SrcEdLink(ExePrintF("%s;",tfn_ptr),i)) l=EdJoin(buf,bail); goto et_done; case LK_DEF: if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; i=A2I(ptr+1); } else i=-1; l=LtfNew; StrCpy(l->desc,"DictDef"); WsdDisplayDefs(l,tfn_ptr,i); goto ej_ltf; case LK_HELP_INDEX: l=LtfNew; StrCpy(l->desc,"HelpIdx"); LtfHelpIndex(l,tfn_ptr); ej_ltf: Free(temp_filename); Free(buf); if (bail) return l; else { LtfDo(l); LtfDel(l); return NULL; } case LK_BIBLE_FIND: *buf=0; if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; StrCpy(buf,ptr+1); } num=DefineMatch(tfn_ptr,"ST_BIBLE_BOOKS",LEF_IGNORE_CASE); if (num<0) num=0; num=A2I(DefineSub(num,"ST_BIBLE_BOOK_LINES")); tfn_ptr=Define("ST_BIBLE_FILE"); break; case LK_FILE_LINE: case LK_PLAIN_LINE: *buf=0; if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; num=A2I(ptr+1); } break; case LK_FILE_ANCHOR: *buf=0; if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; StrCpy(buf,ptr+1); } break; case LK_FILE_FIND: case LK_PLAIN_FIND: *buf=0; if (ptr=StrLastOcc(tfn_ptr,",")) { *ptr=0; StrCpy(buf,ptr+1); if (ptr=StrLastOcc(buf,":")) { *ptr=0; num=A2I(ptr+1); } } break; } } tfn_ptr=StrNew(tfn_ptr); cont=TRUE; if (!IsTextFile(tfn_ptr) && !PopUpCancelOk(ST_WARN_ST "Not Text File\n\n")) cont=FALSE; if (cont) l=LtfFileEd(i,tfn_ptr,buf,num,bail); else l=NULL; WinTextClear(Fs); Free(tfn_ptr); et_done: Free(temp_filename); Free(buf); return l; } public BoolI64 Ed(U8 *filename) { if (IsRaw) return EdLite(filename); else return ToBool(EdJoin(filename,FALSE)); } Ltf *LtfLinkChk(U8 *filename) { return EdJoin(filename,TRUE); } U8 *EdLinkFile(U8 *filename,I64 *_line_num=NULL) { U8 *result=NULL; Ltf *l=EdJoin(filename,TRUE); I64 line_num=0; if (l) { result=StrNew(l->filename.name); line_num=l->cur_entry->y+1; LtfDel(l); } if (_line_num) *_line_num=line_num; return result; } public U0 Plain(U8 *filename) //Open a document in plain text mode, //so that dollar signs are not special. { U8 *buf=MSPrintF("PI:%s",filename); Ed(buf); Free(buf); } #help_index "Ltf/Task" public Ltf *SysAuxLtfInit(BoolI8 has_menu) { LtfEntry *ll; Ltf *aux,*l=LtfCur; aux=LtfNew; aux->flags|=LTFF_AUX_LTF; if (l) { LtfPutS(aux,"$CM+H+BY+RX+NC,-7,1$"); ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->user_data=l; ll->tag_cb=&EdFilterCB; ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->user_data=l; ll->tag_cb=&EdOverStrikeCB; ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->user_data=l; ll->tag_cb=&EdDollarCB; } LtfPutS(aux,"$CM+H+BY+RX+NC,-4,1$"); ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->tag_cb=&EdQuotesCB; ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->tag_cb=&EdBracesCB; ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->tag_cb=&EdSemicolonCB; if (l) { LtfPutS(aux,"$CM+H+BY+RX+NC,-18,1$"); ll=LtfPutS(aux,"$TX+BD+TC,\" \"$"); ll->user_data=l; ll->tag_cb=&EdMoreCB; ll=LtfPutS(aux,"$TX+H+BD+TC,\" \"$"); ll->user_data=l; ll->tag_cb=&EdDollarTypeCB; } if (Fs->user_num) LtfPrintF(aux,"$CM+H+TY+LX+NC,5,-1$$TX+H+BD,\"#%d\"$",Fs->user_num); LtfPutS(aux,"$CM+H+TY+NC,0,-1$"); ll=LtfPutS(aux,"$DA+H-T-P+BD+RD+CX+SCX+IV,140,\"%s...\",16$"); ll->data=&Fs->task_title; LtfDataFmt(ll); LtfPrintF(aux,"$CM+H+NC,1,0$$TX+H+BD+IV,\"%X\"$",Fs); aux->settings_root.dft_text_attr=Fs->border_attr; if (Bt(&Fs->display_flags,DISPLAYf_HAS_CLOSE_WIN)) LtfPutS(aux,"$TX+H+RX+BD,\"[X]\"$"); if (has_menu) { LtfPutS(aux,"$BK,1$$TX+H+LX+BD,\"MENU\"$$BK,0$"); LBts(&Fs->display_flags,DISPLAYf_HAS_MENU); } return aux; } public U0 UseTermLtf(U8 *ltf_menu_file=NULL,U8 *pulldown_menu_file=NULL) { BoolI8 old_preempt=Preempt(OFF); Ltf *l=LtfNew,*m; l->start_text_attr=WHITE<<4+BLUE; LtfInsQue(l,Fs->last_ltf); l->right_click_link=&TermRightClickLink; l->max_entries=4096; l->flags|=LTFF_ATTR_BY_PRT; StrCpy(l->desc,"Term"); if (ltf_menu_file) { m=LtfRead(ltf_menu_file); m->start_text_attr=WHITE<<4+BLUE; m->flags|=LTFF_ATTR_BY_PRT|LTFF_ALLOW_UNDO; l->menu_ltf=m; LtfInsQueRev(SysAuxLtfInit(TRUE),Fs->next_ltf); } else LtfInsQueRev(SysAuxLtfInit(FALSE),Fs->next_ltf); if (pulldown_menu_file) Fs->cur_menu=MenuFile(pulldown_menu_file); else Fs->cur_menu=MenuFile("::/LT/Doc/EdPullDown.TXZ"); Fs->update_win=&LtfUpdateTaskLtfs; Fs->scroll_speed=7; WinScrollsInit(Fs); Preempt(old_preempt); Raw(OFF); } #help_index "Ltf/Input" public U8 *LtfGetLine(Ltf *l,LtfEntry *cl,I64 *cur_col=NULL,LtfEntry **_cl_end=NULL) { LtfEntry *cl2=cl; BoolI8 unlock=LtfLock(l); U8 *result,*dst,*src,*start; U64 i=0; if (cur_col) *cur_col=-1; while (cl2!=l && cl2->type_u8!=LTFT_NEW_LINE) { if (Bt(ltf_tag_types,cl2->type_u8)) { src=cl2->tag; i+=StrLen(src); } else if (cl2->type_u8==LTFT_TAB) i++; cl2=cl2->next; } result=MAlloc(i+1); dst=result; while (cl!=l && cl->type_u8!=LTFT_NEW_LINE) { start=dst; if (Bt(ltf_tag_types,cl->type_u8)) { src=cl->tag; while (*src) *dst++=*src++; } else if (cl->type_u8==LTFT_TAB) *dst++=CH_TAB; if (cl==l->cur_entry && cur_col) *cur_col=start-result+l->cur_data_col; cl=cl->next; } if (_cl_end) *_cl_end=cl; *dst=0; if (cl==l->cur_entry && cur_col && !l->cur_data_col) *cur_col=dst-result; if (unlock) LtfUnlock(l); return result; } #help_index "Ltf/Output" public U0 LtfDump(Ltf *l,U64 uS_delay=0) { U8 *st; LtfEntry *cl,*cl2; BoolI8 unlock=LtfLock(l); cl=l->root.next; while (cl!=l) { st=LtfGetLine(l,cl,NULL,&cl2); "" st; Free(st); cl=cl2; if (cl->type_u8==LTFT_NEW_LINE) { NewLine; BusyWait(uS_delay); cl=cl->next; } } if (unlock) LtfUnlock(l); } public LtfEntry *LtfPutLine(LtfEntry *cl) { U8 ch,*ptr,*ptr2; while (cl->type_u8!=LTFT_ERROR && cl->type_u8!=LTFT_NEW_LINE) { if (Bt(ltf_tag_types,cl->type_u8)) { ptr=cl->tag; do { ptr2=ptr; while (ch=*ptr) if (ch=='$') break; else ptr++; *ptr=0; "" ptr2; *ptr=ch; if (ch=='$') { "$$"; ptr++; } } while (ch); } else if (cl->type_u8==LTFT_TAB) '' CH_TAB; cl=cl->next; } NewLine; return cl->type_u8==LTFT_ERROR ? cl:cl->next; } #help_index "Ltf/Input" public U8 *LtfMGetS(U64 flags=0) //Flags { Ltf *l; LtfEntry *cl,*cl_end; BoolI8 old_preempt=IsPreempt; U8 *result,*st; U64 ch,sc; "$FU$"; do { ch=LtfGetKey(&sc); if (ch==CH_ESC) { l=Fs->next_ltf; while (l!=(&Fs->next_ltf)><(U8 *)-offset(Ltf.next_ltf) && l->ltf_in_queue_signature==LTF_IN_QUEUE_SIGNATURE_VAL) { LtfLock(l); if (!(l->flags<FF_DONT_SHOW) && (!l->best_d || !(l->flags<FF_AUX_LTF)) && l->ltf_in_queue_signature==LTF_IN_QUEUE_SIGNATURE_VAL && l->cur_entry!=l) { cl=LtfEntryCopy(l,l->cur_entry); if (l->flags<FF_AUX_LTF && LtfCur) LtfBottom; else LtfBottom(l); LtfEntryRun(l,cl,TRUE); LtfEntryDel(l,cl); LtfUnlock(l); break; } LtfUnlock(l); l=l->next_ltf; } if (flags&GETSF_WITH_CR) break; } if (ch==CH_SHIFT_ESC) { if (flags&GETSF_SHIFT_ESC_EXIT) Exit; else { result=StrNew(""); goto mgets_done; } } //<CTRL-SHIFT-CR> is a blank line without entry } while (flags&GETSF_WITH_CR || ch!=CH_CR || sc & SCF_CTRL && sc & SCF_SHIFT); Preempt(OFF); l=LtfCur; LtfLock(l); if (flags&GETSF_WITH_CR) { cl=l->cur_entry; do cl=cl->last; while (cl!=l && cl->type_u8!=LTFT_USER_FOREGROUND); cl=cl->next; if (result=LtfGetLine(l,cl,NULL,&cl_end)) { while (cl_end!=l && cl_end->type_u8==LTFT_NEW_LINE) { result=StrAdd(result,"\n"); if (st=LtfGetLine(l,cl_end->next,NULL,&cl_end)) { result=StrAdd(result,st); Free(st); } } } } else { cl=l->cur_entry; do cl=cl->last; while (cl!=l && cl->type_u8!=LTFT_NEW_LINE && cl->type_u8!=LTFT_USER_FOREGROUND); if (cl!=l && cl->type_u8!=LTFT_USER_FOREGROUND) { do cl=cl->last; while (cl!=l && cl->type_u8!=LTFT_NEW_LINE && cl->type_u8!=LTFT_USER_FOREGROUND); } cl=cl->next; result=LtfGetLine(l,cl,NULL); } LtfUnlock(l); mgets_done: "$FU$$FG$$BG$"; Preempt(old_preempt); return result; } #help_index "Char/Input" public I64 PmtI64(U8 *msg,I64 dft,I64 lo=MIN_I64,I64 hi=MAX_I64) { I64 result; BoolI8 okay; U8 *st; while (TRUE) { "" msg,dft; st=MGetS; if (!*st) { Free(st); return dft; } try { okay=FALSE; result=ExePrintF3("ToI64(%s);",st); okay=TRUE; } catch Fs->catch_except=TRUE; Free(st); if (okay && lo<=result<=hi) return result; } } public F64 PmtF64(U8 *msg,F64 dft,F64 lo=MIN_F64,F64 hi=MAX_F64) { F64 result; BoolI8 okay; U8 *st; while (TRUE) { "" msg,dft; st=MGetS; if (!*st) { Free(st); return dft; } try { okay=FALSE; result=ExePrintF3("ToF64(%s);",st)><(F64); okay=TRUE; } catch Fs->catch_except=TRUE; Free(st); if (okay && lo<=result<=hi) return result; } } public U8 *PmtStr(U8 *msg=NULL,U8 *dft=NULL) { U8 *st; if (msg) { if (dft) "" msg,dft; else "" msg; } st=MGetS; if (!*st) { Free(st); if (dft) return StrNew(dft); else return StrNew(""); } return st; } public LTDate PmtLTDate(U8 *msg,LTDate dft,LTDate lo=MIN_I64,LTDate hi=MAX_I64) { LTDate result; U8 *st; while (TRUE) { "" msg,dft,dft; st=MGetS; if (!*st) { Free(st); return dft; } result=A2LTDate(st); Free(st); if (result>=lo && result<=hi) return result; } } #help_index "Ltf" #define RIGHT_INCLUDE 0 #define RIGHT_DEBUG 1 #define RIGHT_COMPILE 2 #define RIGHT_LOAD 3 #define RIGHT_AINCLUDE 4 #define RIGHT_AUTOFILE 5 #define RIGHT_COPY 6 #define RIGHT_MOVE 7 #define RIGHT_DELETE 8 I64 PopUpCancelIncludeDelAuto(U8 *header=NULL,U8 *footer=NULL) { I64 i; Ltf *l=LtfNew; if (header) LtfPutS(l,header); LtfPutS(l,"$CM+LX,1,3 $$BT,\"INCLUDE (.CPZ)\",RIGHT_INCLUDE$" "$CM+LX,25,0$$BT,\"DEBUG \",RIGHT_DEBUG$" "$CM+LX,1,3 $$BT,\"STATIC COMPILE(.SPZ)\",RIGHT_COMPILE$" "$CM+LX,25,0$$BT,\"LOAD (.BIZ)\",RIGHT_LOAD$" "$CM+LX,1,3 $$BT,\"ADAM_INCLUDE (.APZ)\",RIGHT_AINCLUDE$" "$CM+LX,25,0$$BT,\"AUTOFILE (.AUZ)\",RIGHT_AUTOFILE$" "$CM+LX,1,3 $$BT,\"COPY \",RIGHT_COPY$" "$CM+LX,25,0$$BT,\"MOVE \",RIGHT_MOVE$" "$CM+LX,1,3 $$BT,\"DELETE \",RIGHT_DELETE$" "$CM+LX,25,0$$BT,\"CANCEL \",LTFM_CANCEL$\n"); if (footer) LtfPutS(l,footer); i=PopUpMenu(l); LtfDel(l); return i; } I64 EdLeftClickLink(Ltf *l,LtfEntry *cl) { //called with l locked, exit unlocked BoolI8 result; U8 *st; if (cl->flags & LTFLF_AUX_STR) st=StrNew(cl->aux_str); else st=StrNew(cl->tag); LtfUnlock(l); result=Ed(st); Free(st); return result; } I64 TermRightClickLink(Ltf *l,LtfEntry *cl) { //called with l locked, exit unlocked BoolI8 send_cr=FALSE,result=FALSE; U8 *st; I64 i; EdFileNameStruct fn; if (cl->flags & LTFLF_AUX_STR) st=cl->aux_str; else st=cl->tag; st= st[2]==':' ? st+3:st; LtfUnlock(l); if ((i=PopUpCancelIncludeDelAuto(st))>=0) { LtfBottom(l); switch (i) { case RIGHT_INCLUDE: if (FileExtDot(st) && !WildCardMatch("*.CP?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .CP? File\n\n")) { send_cr=TRUE; break; } } "#include \"%s\";\n$FU$$FG$$BG$",st; WinZBufUpdate; ExeFile(st); result=TRUE; break; case RIGHT_DELETE: Del(st); result=TRUE; break; case RIGHT_AUTOFILE: if (FileExtDot(st) && !WildCardMatch("*.AU?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .AU? File\n\n")) { send_cr=TRUE; break; } } "AutoFile(\"%s\");\n$FU$$FG$$BG$",st; WinZBufUpdate; AutoStr("%F\r",st); result=TRUE; break; case RIGHT_AINCLUDE: if (FileExtDot(st) && !WildCardMatch("*.AP?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .AP? File\n\n")) { send_cr=TRUE; break; } } "Adam(\"#include \\\"%s\\\"\" );\n$FU$$FG$$BG$",st; WinZBufUpdate; AdamFile(st,FALSE); result=TRUE; break; case RIGHT_COMPILE: if (FileExtDot(st) && !WildCardMatch("*.SP?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .SP? File\n\n")) { send_cr=TRUE; break; } } "Cmp(\"%s\");\n$FU$$FG$$BG$",st; Cmp(st); result=TRUE; break; case RIGHT_LOAD: if (FileExtDot(st) && !WildCardMatch("*.BI?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .BI? File\n\n")) { send_cr=TRUE; break; } } "Load(\"%s\");\n$FU$$FG$$BG$",st; WinZBufUpdate; Load(st); result=TRUE; break; case RIGHT_COPY: StrCpy(fn.name,st); if (LtfFormDo(fn.name,"EdFileNameStruct")) { Copy(st,fn.name); result=TRUE; } break; case RIGHT_MOVE: StrCpy(fn.name,st); if (LtfFormDo(fn.name,"EdFileNameStruct")) { Move(st,fn.name); result=TRUE; } break; case RIGHT_DEBUG: if (FileExtDot(st) && !WildCardMatch("*.CP?",st)) { if (!PopUpCancelOk(ST_WARN_ST "Not .CP? File\n\n")) { send_cr=TRUE; break; } } "IDE(\"%s\");\n$FU$$FG$$BG$",st; WinZBufUpdate; IDE(st); result=TRUE; break; } } else send_cr=TRUE; LtfBottom(l); "$FU$$FG$$BG$"; if (send_cr) '' CH_CR; return result; } #help_index "Ltf/Cmd Line (Typically);Cmd Line (Typically)" public U0 Man(U8 *st) //Enter the name of a sym and this //will jump to the src code. { U8 *name=MAlloc(3+StrLen(st)+1); StrCpy(name,"MN:"); StrCat(name,st); Ed(name); Free(name); } #help_index "Debugging;Ltf/Cmd Line (Typically);Ltf/Output;Cmd Line (Typically)" public U0 LtfDm(U8 *buf,U64 cnt=0x80) //Dumps a chunk of mem, showing //addresses. It is live and can be //edited. { LtfEntry *ll; Ltf *l=LtfCur; BoolI8 unlock=LtfLock(l); ll=LtfPrintF(l,"$HX-Z,%d,16$",cnt); ll->data=buf; l->cur_entry=ll->next; LtfRecalc(l); if (unlock) LtfUnlock(l); } public U0 LtfD(U8 *buf,U64 cnt=0x80) //Dumps a chunk of mem, showing //offsets. It is live and can be //edited. { LtfEntry *ll; Ltf *l=LtfCur; BoolI8 unlock=LtfLock(l); ll=LtfPrintF(l,"$HX,%d,16$",cnt); ll->data=buf; l->cur_entry=ll->next; LtfRecalc(l); if (unlock) LtfUnlock(l); } #help_index "Ltf/Output" BoolI64 AKDLtfPutS(U8 *st) { Ltf *l; if (l=LtfCur) LtfPutSPartial(l,st); return FALSE; } KeyDevAdd(&AKDLtfPutKey,&AKDLtfPutS,0x80000000,TRUE); fp_mgets=&LtfMGetS; fp_ltf_cur=&LtfCur; #help_index "Ltf"