Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
DocPutS.txt338 linesDownload Raw Back to DolDoc
1 2#help_index "DolDoc/Output;StdOut/DolDoc"3 4CDocEntry *DocPutS(CDoc *doc,U8 *st)5{//Don't use this.  Use DocPrint().6//Does not handle partial Doc entries.7  //Returns last newly created dollar-sign CDocEntry or NULL.8  U8 *ptr=st,*ptr2,*st2,*ptr3,*ptr4,*src,9        *char_bmp;10  Bool unlock;11  I64 ch,j;12  CDocEntry *doc_e=NULL,*res=NULL,*doc_ce;13  if (!st || !doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)14    return NULL;15  unlock=DocLock(doc);16  if (doc->flags & DOCF_PLAIN_TEXT_TABS)17    char_bmp=char_bmp_zero_cr_nl_cursor;18  else if (doc->flags & DOCF_PLAIN_TEXT)19    char_bmp=char_bmp_zero_tab_cr_nl_cursor;20  else21    char_bmp=char_bmp_zero_tab_cr_nl_cursor_dollar;22  doc_ce=doc->cur_entry;23  while (*ptr) {24    ptr2=ptr;25    do ch=*ptr++;26    while (!Bt(char_bmp,ch) || ch==CH_CURSOR && doc->flags&DOCF_NO_CURSOR);27    ptr--;28    if (!ch) {29      if (j=ptr-ptr2) {30        doc_e=DocEntryNewBase(doc,31              DOCT_TEXT|doc->settings_head.dft_text_attr<<8);32        if (doc->flags & DOCF_NO_CURSOR) {33          src=MAlloc(j+1);34          MemCpy(src,ptr2,j+1);35          StrUtil(src,SUF_REM_CTRL_CHARS);36          j=StrLen(src);37        } else38          src=ptr2;39        doc_e->tag=MAlloc(j+1,doc->mem_task);40        MemCpy(doc_e->tag,src,j+1);41        doc_e->max_col=j;42        DocInsEntry(doc,doc_e);43        if (doc->flags & DOCF_NO_CURSOR)44          Free(src);45      }46    } else {47      if (j=ptr-ptr2) {48        *ptr=0;49        doc_e=DocEntryNewBase(doc,50              DOCT_TEXT|doc->settings_head.dft_text_attr<<8);51        if (doc->flags & DOCF_NO_CURSOR) {52          src=MAlloc(j+1);53          MemCpy(src,ptr2,j+1);54          ptr3=src;55          ptr4=src;56          while (*ptr3)57            if (*ptr3!=CH_CURSOR)58              *ptr4++=*ptr3++;59            else60              ptr3++;61          *ptr4=0;62          j=ptr4-src;63        } else64          src=ptr2;65        doc_e->tag=MAlloc(j+1,doc->mem_task);66        MemCpy(doc_e->tag,src,j+1);67        doc_e->max_col=j;68        DocInsEntry(doc,doc_e);69        if (doc->flags & DOCF_NO_CURSOR)70          Free(src);71        *ptr=ch;72      }73      switch (ch) {74        case CH_CURSOR:75          doc_e=DocEntryNewBase(doc,76                DOCT_CURSOR|doc->settings_head.dft_text_attr<<8);77          DocInsEntry(doc,doc_e);78          ptr++;79          break;80        case '\t':81          doc_e=DocEntryNewBase(doc,82                DOCT_TAB|doc->settings_head.dft_text_attr<<8);83          DocInsEntry(doc,doc_e);84          ptr++;85          break;86        case '$':87          ptr++; //skip first dollar88          ptr2=ptr;89          while (*ptr && *ptr!='$')90            ptr++;91          if (*ptr) {92            *ptr=0; //zero second dollar93            if (ptr-1==ptr2 && *ptr2==CH_CURSOR) {94              doc_e=DocEntryNewBase(doc,95                    DOCT_CURSOR|doc->settings_head.dft_text_attr<<8);96              DocInsEntry(doc,doc_e);97              ptr2++;98            }99            if (ptr==ptr2) {100              doc_e=DocEntryNewBase(doc,101                    DOCT_TEXT|doc->settings_head.dft_text_attr<<8);102              doc_e->max_col=1;103              if (doc->flags & DOCF_DBL_DOLLARS)104                doc_e->tag=StrNew("$$",doc->mem_task);105              else106                doc_e->tag=StrNew("$",doc->mem_task);107              DocInsEntry(doc,doc_e);108            } else {109              st2=MAlloc(ptr-ptr2+1);110              ptr3=ptr2;111              ptr4=st2;112              while (ch=*ptr3++) {113                if (ch==CH_CURSOR) {114                  doc_e=DocEntryNewBase(doc,115                        DOCT_CURSOR|doc->settings_head.dft_text_attr<<8);116                  DocInsEntry(doc,doc_e);117                } else118                  *ptr4++=ch;119              }120              *ptr4=0;121              if (doc_e=PrsDollarCmd(doc,st2)) {122                res=doc_e;123                DocInsEntry(doc,doc_e);124              }125              Free(st2);126            }127            *ptr++='$';128          }129          break;130        default:131          doc_e=DocEntryNewBase(doc,132                DOCT_NEW_LINE|doc->settings_head.dft_text_attr<<8);133          DocInsEntry(doc,doc_e);134          if (ch=='\r')135            while (*ptr=='\r')136              ptr++;137          if (*ptr=='\n')138            ptr++;139          while (*ptr=='\r')140            ptr++;141      }142    }143  }144  if (unlock)145    DocUnlock(doc);146  return res;147}148 149public CDocEntry *DocPrint(CDoc *doc=NULL,U8 *fmt,...)150{//You must not print partial doc cmds.151//Returns last newly created dollar-sign CDocEntry or NULL.152  U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);153  CDocEntry *res=DocPutS(doc,buf);154  Free(buf);155  return res;156}157 158public U0 DocPrintPartial(CDoc *doc=NULL,U8 *fmt,...)159{//Lets you print half a doc cmd, if you like.160  U8 *buf,*st,*src,*dst,*ptr,*ptr2;161  Bool unlock;162  CDocEntry *doc_ce,*doc_ne;163  I64 ch,i,j;164  if (!doc && !(doc=DocPut))165    return;166  buf=StrPrintJoin(NULL,fmt,argc,argv);167  ptr=buf;168  if (doc->user_put_s && (*doc->user_put_s)(doc,doc->user_put_data,buf)) {169    Free(buf);170    return;171  }172  unlock=DocLock(doc);173  if (doc->cur_entry->type_u8==DOCT_DATA)174    while (ch=*ptr++)175      DocPutKey(doc,ch,0);176  else177    while (ch=*ptr) {178      if (!Bt(char_bmp_safe_dollar,ch) ||179            doc->flags & (DOCF_OVERSTRIKE|DOCF_IN_DOLLAR)) {180        DocPutKey(doc,ch,0);181        ptr++;182      } else {183        ptr2=ptr++;184        while (TRUE) {185          ch=*ptr++;186          if (!Bt(char_bmp_safe_dollar,ch))187            break;188        }189        ptr--;190        *ptr=0;191        doc_ce=doc->cur_entry;192        j=ptr-ptr2;193        if (IsEditableText(doc_ce)) {194          dst=st=MAlloc(doc_ce->max_col+j+1,doc->mem_task);195          src=doc_ce->tag;196          i=doc->cur_col;197          doc->cur_col+=j;198          doc_ce->max_col+=j;199          while (i-->0)200            *dst++=*src++;201          while (j-->0)202            *dst++=*ptr2++;203          while (*dst++=*src++);204          Free(doc_ce->tag);205          doc_ce->tag=st;206        } else {207          doc_ne=DocEntryNewTag(doc,doc_ce,ptr2);208          doc_ne->type=DOCT_TEXT|doc->settings_head.dft_text_attr<<8;209          doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];210          QueIns(doc_ne,doc_ce->last);211          doc->cur_entry=doc_ne;212          doc->cur_col=StrLen(ptr2);213        }214        *ptr=ch;215        DocRemSoftNewLines(doc,doc->cur_entry);216      }217    }218  if (unlock)219    DocUnlock(doc);220  if (!(doc->flags&DOCF_DONT_SWAP_OUT))221    Yield;222  Free(buf);223}224 225Bool KDDocPutS(U8 *st)226{227  CDoc *doc;228  if (doc=DocPut)229    DocPrintPartial(doc,"%s",st);230  return FALSE;231}232 233public U0 DocPrintAtomic(CDoc *doc=NULL,U8 *fmt,...)234{//Prints multiple whole cmds all-at-once. Might need this when printing trees.235  U8 *buf;236  Bool unlock;237  I64 old_flags;238  if (!doc && !(doc=DocPut))239    return;240  buf=StrPrintJoin(NULL,fmt,argc,argv);241  unlock=DocLock(doc);242  old_flags=doc->flags;243  doc->flags|=DOCF_NO_CURSOR;244  DocPrint(doc,"%s",buf);245  DocRecalc(doc);246  doc->flags=old_flags;247  if (unlock)248    DocUnlock(doc);249  Free(buf);250}251 252U0 DocDump(CDoc *doc,I64 uS_delay=0)253{254  U8 *st;255  CDocEntry *doc_e,*doc_e2;256  Bool unlock=DocLock(doc);257  doc_e=doc->head.next;258  while (doc_e!=doc) {259    st=DocScanLine(doc,doc_e,NULL,&doc_e2);260    "%s",st;261    Free(st);262    doc_e=doc_e2;263    if (doc_e->type_u8==DOCT_NEW_LINE) {264      '\n';265      Busy(uS_delay);266      doc_e=doc_e->next;267    }268  }269  if (unlock)270    DocUnlock(doc);271}272 273public CDocEntry *DocPutLine(CDoc *doc=NULL,CDocEntry *doc_e)274{//Send line from other doc to StdOut DocPut.275  I64 ch;276  U8 *ptr,*ptr2;277  Bool unlock;278  if (!doc && !(doc=DocPut) || doc->doc_signature!=DOC_SIGNATURE_VAL)279    return NULL;280  unlock=DocLock(doc);281  while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {282    if (doc_e->de_flags&DOCEF_TAG) {283      ptr=doc_e->tag;284      do {285        ptr2=ptr;286        while (ch=*ptr)287          if (ch=='$')288            break;289          else290            ptr++;291        *ptr=0;292        "%s",ptr2;293        *ptr=ch;294        if (ch=='$') {295          "$$";296          ptr++;297        }298      } while (ch);299    } else if (doc_e->type_u8==DOCT_TAB)300      '\t';301    doc_e=doc_e->next;302  }303  '\n';304  if (doc_e!=doc)305    doc_e=doc_e->next;306  if (unlock)307    DocUnlock(doc);308  return doc_e;309}310 311#help_index "Debugging/Dump;DolDoc/Cmd Line (Typically);"\312        "Cmd Line (Typically);DolDoc/Output;StdOut/DolDoc"313public U0 DocDm(U8 *buf,I64 cnt=0x80)314{//Dump live chunk of mem showing addresses. Can be edited.315  CDocEntry *doc_e;316  CDoc *doc=DocPut;317  Bool unlock=DocLock(doc);318  doc_e=DocPrint(doc,"$HX-Z,%d,16$",cnt);319  doc_e->data=buf;320  doc->cur_entry=doc_e->next;321  DocRecalc(doc);322  if (unlock)323    DocUnlock(doc);324}325 326public U0 DocD(U8 *buf,I64 cnt=0x80)327{//Dump live chunk of mem showing offsets. Can be edited.328  CDocEntry *doc_e;329  CDoc *doc=DocPut;330  Bool unlock=DocLock(doc);331  doc_e=DocPrint(doc,"$HX,%d,16$",cnt);332  doc_e->data=buf;333  doc->cur_entry=doc_e->next;334  DocRecalc(doc);335  if (unlock)336    DocUnlock(doc);337}338