Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
DocPlain.txt613 linesDownload Raw Back to DolDoc
1 2#help_index "DolDoc"3 4I64 PrsDocFlagSingle(CCmpCtrl *cc,I64 *_de_flags,U32 *_type,Bool turn_on)5{6  I64 res=-1;7  CHashGeneric *tmph;8  if (cc->token==TK_IDENT &&9        (tmph=HashFind(cc->cur_str,doldoc.hash,DHT_DOC_FLAG))) {10    res=tmph->user_data0;11    if (res<64) {12      BEqu(_de_flags,res,turn_on);13      switch (res) {14        case DOCEf_BLINK:15        case DOCEf_INVERT:16        case DOCEf_UNDERLINE:17        case DOCEf_SEL:18          BEqu(_type,res,turn_on);19          break;20      }21    }22    Lex(cc);    //skip flag23  }24  return res;25}26 27I64 PrsDocFlags(CCmpCtrl *cc,I64 *_de_flags,U32 *_type)28{29  I64 res=-1;30  Bool turn_on;31  while (TRUE) {32    if (cc->token=='+')33      turn_on=TRUE;34    else if (cc->token=='-')35      turn_on=FALSE;36    else37      break;38    Lex(cc);39    res=PrsDocFlagSingle(cc,_de_flags,_type,turn_on);40  }41  return res;42}43 44U8 *Doc2PlainText(CDoc *doc,CDocEntry *doc_e)45{//TODO: break strs46  I64 i,j,attr=doc_e->attr,47        t1,f1,de_flags,type;48  U8 *buf,*buf2;49 50  if (doc_e->type_u8==DOCT_FOREGROUND &&51        doc->flags&DOCF_COLOR_NAMES && 0<=attr<COLORS_NUM) {52    buf=StrNew(DefineSub(attr,"ST_COLORS"));53    attr=DOC_DFT;54  } else55    buf=StrNew(DefineSub(doc_e->type_u8,"ST_DOC_CMDS"));56  if (doc_e->type_u8!=DOCT_ERROR) {57    f1=doldoc.dft_de_flags[doc_e->type_u8];58    t1=doc_e->type_u8|doldoc.dft_type_flags[doc_e->type_u8];59 60    de_flags=doc_e->de_flags&~(DOCG_BL_IV_UL|DOCEF_SEL|61          DOCEF_HIGHLIGHT|DOCEF_WORD_WRAP|DOCEF_SKIP|DOCEF_FILTER_SKIP);62    for (i=0;i<DOCEf_FLAGS_NUM;i++)63      if (Bt(&f1,i)!=Bt(&de_flags,i)) {64        if (Bt(&de_flags,i)) {65          if (!(1<<i&DOCEG_HAS_ARG)) {66            buf2=MStrPrint("%s+%Z",buf,i,"ST_DOC_FLAGS");67            Free(buf); buf=buf2;68          }69        } else {70          buf2=MStrPrint("%s-%Z",buf,i,"ST_DOC_FLAGS");71          Free(buf); buf=buf2;72        }73      }74    type=doc_e->type&~DOCET_SEL;75    for (i=DOCEt_BLINK;i<=DOCEt_UNDERLINE;i++)76      if (Bt(&t1,i)!=Bt(&type,i)) {77        if (Bt(&type,i))78          buf2=MStrPrint("%s+%Z",buf,i,"ST_DOC_FLAGS");79        else80          buf2=MStrPrint("%s-%Z",buf,i,"ST_DOC_FLAGS");81        Free(buf); buf=buf2;82      }83    buf2=MStrPrint("%s,",buf);84    Free(buf); buf=buf2;85    switch [doc_e->type_u8] {86      case DOCT_HEX_ED:87        buf2=MStrPrint("%s%d,",buf,doc_e->len);88        Free(buf); buf=buf2;89        buf2=MStrPrint("%s%d,",buf,doc_e->hex_ed_width);90        Free(buf); buf=buf2;91        break;92      case DOCT_FOREGROUND:93      case DOCT_BACKGROUND:94      case DOCT_DFT_FOREGROUND:95      case DOCT_DFT_BACKGROUND:96        if (doc->flags&DOCF_COLOR_NAMES && 0<=attr<COLORS_NUM) {97          buf2=MStrPrint("%s%Z,",buf,doc_e->attr,"ST_COLORS");98          Free(buf); buf=buf2;99          break;100        }101      case DOCT_PAGE_LEN:102      case DOCT_LEFT_MARGIN:103      case DOCT_RIGHT_MARGIN:104      case DOCT_HEADER:105      case DOCT_FOOTER:106      case DOCT_INDENT:107      case DOCT_WORD_WRAP:108      case DOCT_HIGHLIGHT:109      case DOCT_BLINK:110      case DOCT_INVERT:111      case DOCT_UNDERLINE:112      case DOCT_SHIFTED_X:113      case DOCT_SHIFTED_Y:114        if (attr!=DOC_DFT) {115          buf2=MStrPrint("%s%d,",buf,doc_e->attr);116          Free(buf); buf=buf2;117        }118      case DOCT_TYPES_NUM-1: //nobound switch119        break;120    }121    de_flags=doc_e->de_flags & DOCEG_HAS_ARG;122    while (de_flags) {123      j=Bsf(de_flags);124      Btr(&de_flags,j);125      switch [j] {126        case DOCEf_TAG:127          if (doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_MACRO &&128                (doc_e->de_flags&DOCEF_LEFT_MACRO &&129                !StrCmp(doc_e->tag,doc_e->left_macro) ||130                doc_e->de_flags&DOCEF_RIGHT_MACRO &&131                !StrCmp(doc_e->tag,doc_e->right_macro)) ||132                doc_e->de_flags&DOCEF_LST && !StrCmp(doc_e->tag,"[]") &&133                doc_e->de_flags&DOCEF_DEFINE) {134            buf2=buf;135            buf=NULL;136          } else {137            if (doc_e->type_u8==DOCT_CHECK_BOX) {138              if (StrLen(doc_e->tag)>=4)139                buf2=doc_e->tag+4;140              else141                buf2="";142            } else if (doc_e->de_flags & DOCEF_TREE) {143              if (StrLen(doc_e->tag)>=3)144                buf2=doc_e->tag+3;145              else146                buf2="";147            } else148              buf2=doc_e->tag;149            if (Bt(&doldoc.dft_de_flags[doc_e->type_u8],DOCEf_TAG))150              buf2=MStrPrint("%s\"%$Q\",",buf,buf2);151            else152              buf2=MStrPrint("%sT=\"%$Q\",",buf,buf2);153          }154          break;155        case DOCEf_LEN:156          buf2=MStrPrint("%sLEN=%d,",buf,doc_e->len);157          break;158        case DOCEf_AUX_STR:159          buf2=MStrPrint("%sA=\"%$Q\",",buf,doc_e->aux_str);160          break;161        case DOCEf_DEFINE:162          buf2=MStrPrint("%sD=\"%$Q\",",buf,doc_e->define_str);163          break;164        case DOCEf_HTML_LINK:165          buf2=MStrPrint("%sHTML=\"%$Q\",",buf,doc_e->html_link);166          break;167        case DOCEf_LEFT_EXP:168          buf2=MStrPrint("%sLE=%d,",buf,doc_e->left_exp);169          break;170        case DOCEf_LEFT_MACRO:171          buf2=MStrPrint("%sLM=\"%$Q\",",buf,doc_e->left_macro);172          break;173        case DOCEf_RIGHT_EXP:174          buf2=MStrPrint("%sRE=%d,",buf,doc_e->right_exp);175          break;176        case DOCEf_RIGHT_MACRO:177          buf2=MStrPrint("%sRM=\"%$Q\",",buf,doc_e->right_macro);178          break;179        case DOCEf_HAS_BIN:180          buf2=MStrPrint("%sBI=%d,",buf,doc_e->bin_num);181          break;182        case DOCEf_BIN_PTR_LINK:183          buf2=MStrPrint("%sBP=\"%$Q\",",buf,doc_e->bin_ptr_link);184          break;185        case DOCEf_RAW_TYPE:186          if (doc_e->type_u8==DOCT_CHECK_BOX&&doc_e->raw_type!=RT_I8 ||187                doc_e->type_u8!=DOCT_CHECK_BOX&&doc_e->raw_type!=RT_I64)188            buf2=MStrPrint("%sRT=%Z,",buf,doc_e->raw_type,"ST_RAW_TYPES");189          break;190        case DOCEf_SHIFTED_X:191          j=doc_e->type.u16[1]&0x1F;192          if (j&0x10) j|=0xFFFFFFF0;193          buf2=MStrPrint("%sSX=%d,",buf,j);194          break;195        case DOCEf_SHIFTED_Y:196          j=doc_e->type>>21 &0x1F;197          if (j&0x10) j|=0xFFFFFFF0;198          buf2=MStrPrint("%sSY=%d,",buf,j);199          break;200        case DOCEf_SCROLLING_X:201          buf2=MStrPrint("%sSCX=%d,",buf,doc_e->scroll_len);202          break;203        case DOCEf_USER_DATA:204          buf2=MStrPrint("%sU=0x%X,",buf,doc_e->user_data);205          break;206        case DOCEf_FLAGS_NUM-1: //nobound switch207          break;208      }209      Free(buf); buf=buf2;210    }211    buf[StrLen(buf)-1]=0;  //Kill last comma212  }213  buf2=StrNew(buf,doc->mem_task); //exact allocation214  Free(buf);215  return buf2;216}217 218CDocEntry *PrsDollarCmd(CDoc *doc,U8 *st)219{//Uses Lex() to parse a string and make Doc entries.220  I64 i,j,de_flags,processed_flags,attr=DOC_DFT;221  U8 *ptr,*st2;222  CDocEntry *doc_e=NULL;223  CHashGeneric *tmph;224  CCmpCtrl *cc=CmpCtrlNew(st,CCF_DONT_FREE_BUF);225  CHashTable *old_hash_table_lst=cc->htc.hash_table_lst;226  try {227    cc->htc.hash_table_lst=NULL;228    if (Lex(cc)==TK_IDENT) {229      if (tmph=HashFind(cc->cur_str,doldoc.hash,DHT_DOC_CMD|DHT_COLOR)) {230        if (tmph->type&DHT_DOC_CMD)231          i=tmph->user_data0;232        else {//DHT_COLOR233          i=DOCT_FOREGROUND;234          attr=tmph->user_data0;235        }236      } else237        goto pd_err;238      Lex(cc); //skip cmd code239      doc_e=CAlloc(sizeof(CDocEntry),doc->mem_task);240      doc_e->type=i;241      doc_e->de_flags=doldoc.dft_de_flags[i];242      doc_e->type|=doldoc.dft_type_flags[i];243      doc_e->raw_type=RT_I64;244      doc_e->len=DOCE_LEN_DFT;245      j=PrsDocFlags(cc,&doc_e->de_flags,&doc_e->type);246      cc->htc.hash_table_lst=old_hash_table_lst;247      switch [i] {248        case DOCT_CHECK_BOX:249          doc_e->raw_type=RT_I8;250          break;251        case DOCT_HEX_ED:252          while (cc->token==',')253            Lex(cc);254          if (cc->token)255            doc_e->len=LexExpressionI64(cc);256          else257            goto pd_err;258          while (cc->token==',')259            Lex(cc);260          if (cc->token)261            doc_e->hex_ed_width=LexExpressionI64(cc);262          else263            goto pd_err;264          break;265        case DOCT_PAGE_LEN:266        case DOCT_LEFT_MARGIN:267        case DOCT_RIGHT_MARGIN:268        case DOCT_HEADER:269        case DOCT_FOOTER:270        case DOCT_INDENT:271        case DOCT_FOREGROUND:272        case DOCT_BACKGROUND:273        case DOCT_DFT_FOREGROUND:274        case DOCT_DFT_BACKGROUND:275        case DOCT_WORD_WRAP:276        case DOCT_HIGHLIGHT:277        case DOCT_BLINK:278        case DOCT_INVERT:279        case DOCT_UNDERLINE:280        case DOCT_SHIFTED_X:281        case DOCT_SHIFTED_Y:282          while (cc->token==',')283            Lex(cc);284          if (cc->token)285            doc_e->attr=LexExpressionI64(cc);286          else287            doc_e->attr=attr;288          break;289#assert DOCT_ERROR==DOCT_TYPES_NUM-1290        case DOCT_ERROR:291          goto pd_err;292      }293 294      processed_flags=0;295      while (TRUE) {296        cc->htc.hash_table_lst=NULL;297        while (cc->token==',')298          Lex(cc);299        cc->htc.hash_table_lst=old_hash_table_lst;300        j=PrsDocFlagSingle(cc,&doc_e->de_flags,&doc_e->type,TRUE);301        if (!(de_flags=~processed_flags & doc_e->de_flags & DOCEG_HAS_ARG))302          break;303        if (cc->token=='=')304          Lex(cc);305        else306          j=Bsf(de_flags);307        if (j<0 || Bts(&processed_flags,j))308          goto pd_err;309        switch [j] {//TODO: Might check for expression errors310          case DOCEf_TAG:311            if (!doc_e->tag) {312//If a $MA,LM=""$, Tag is filled when the LM is processed.313              //if doc_e->df_flags&DOCEF_LST,314              // Tag is filled when the Define is processed.315              //(The dft_flag1.tag calls this after.)316              if (cc->token==TK_STR) {317                st2=LexExtStr(cc);318                if (i==DOCT_CHECK_BOX) {319                  st=MStrPrint("[X] %s",st2);320                  Free(st2);321                  doc_e->min_col=1;322                } else if (doc_e->de_flags & DOCEF_LST) {323                  if (*st2!='[') {324                    st=MStrPrint("[%s]",st2);325                    Free(st2);326                  } else327                    st=st2;328                  doc_e->min_col=1;329                } else if (doc_e->de_flags & DOCEF_TREE) {330                  st=MStrPrint("+] %s",st2);331                  Free(st2);332                  doc_e->min_col=1;333                } else334                  st=st2;335                doc_e->tag=StrNew(st,doc->mem_task);336                Free(st);337              } else338                goto pd_err;339            }340            break;341          case DOCEf_LEN:342            if (cc->token) {343              doc_e->len=LexExpression(cc);344              doc_e->de_flags&=~DOCEF_DFT_LEN;345            } else346              goto pd_err;347            break;348          case DOCEf_AUX_STR:349            if (cc->token==TK_STR) {350              st2=LexExtStr(cc);351              doc_e->aux_str=StrNew(st2,doc->mem_task);352              Free(st2);353//Anchor354              if (i==DOCT_DATA) { //See DocForm()355                if (ptr=StrMatch(":",doc_e->aux_str))356                  doc_e->min_col=ptr-doc_e->aux_str+1;357                doc_e->tag=MAlloc(doc_e->len+doc_e->min_col+2,358                      doc->mem_task); //+2 because "_\0"359              }360            } else361              goto pd_err;362            break;363          case DOCEf_DEFINE:364            if (cc->token==TK_STR) {365              st2=LexExtStr(cc);366              doc_e->define_str=StrNew(st2,doc->mem_task);367              Free(st2);368              if (doc_e->de_flags&DOCEF_LST && !doc_e->tag)369                doc_e->tag=StrNew("[]",doc->mem_task);370            } else371              goto pd_err;372            break;373          case DOCEf_HTML_LINK:374            if (cc->token==TK_STR) {375              st2=LexExtStr(cc);376              doc_e->html_link=StrNew(st2,doc->mem_task);377              Free(st2);378            } else379              goto pd_err;380            break;381          case DOCEf_LEFT_EXP:382            if (cc->token)383              doc_e->left_exp=LexExpression(cc);384            else385              goto pd_err;386            break;387          case DOCEf_LEFT_MACRO:388            if (cc->token==TK_STR) {389              st2=LexExtStr(cc);390              doc_e->left_macro=StrNew(st2,doc->mem_task);391              Free(st2);392              if (i==DOCT_MACRO && !doc_e->tag)393                doc_e->tag=StrNew(doc_e->left_macro,doc->mem_task);394            } else395              goto pd_err;396            break;397          case DOCEf_RIGHT_EXP:398            if (cc->token)399              doc_e->right_exp=LexExpression(cc);400            else401              goto pd_err;402            break;403          case DOCEf_RIGHT_MACRO:404            if (cc->token==TK_STR) {405              st2=LexExtStr(cc);406              doc_e->right_macro=StrNew(st2,doc->mem_task);407              Free(st2);408              if (i==DOCT_MACRO && !doc_e->tag)409                doc_e->tag=StrNew(doc_e->right_macro,doc->mem_task);410            } else411              goto pd_err;412            break;413          case DOCEf_HAS_BIN:414            if (cc->token)415              doc_e->bin_num=LexExpressionI64(cc);416            else417              goto pd_err;418            break;419          case DOCEf_BIN_PTR_LINK:420            if (cc->token==TK_STR) {421              st2=LexExtStr(cc);422              doc_e->bin_ptr_link=StrNew(st2,doc->mem_task);423              Free(st2);424              if (!DocBinPtrRst(doc,doc_e))425                doc_e->type=DOCT_ERROR;426            } else427              goto pd_err;428            break;429          case DOCEf_RAW_TYPE:430            if (cc->token==TK_IDENT) {431              j=DefineMatch(cc->cur_str,"ST_RAW_TYPES");432              if (j<0)433                goto pd_err;434              doc_e->raw_type=j;435              doc_e->de_flags&=~DOCEF_DFT_RAW_TYPE;436              Lex(cc);437            } else438              goto pd_err;439            break;440          case DOCEf_SHIFTED_X:441            if (cc->token)442              doc_e->type|=(LexExpressionI64(cc) & 0x1F)<<16;443            else444              goto pd_err;445            break;446          case DOCEf_SHIFTED_Y:447            if (cc->token)448              doc_e->type|=(LexExpressionI64(cc) & 0x1F)<<21;449            else450              goto pd_err;451            break;452          case DOCEf_SCROLLING_X:453            if (cc->token)454              doc_e->scroll_len=LexExpressionI64(cc);455            else456              goto pd_err;457            break;458          case DOCEf_USER_DATA:459            if (cc->token)460              doc_e->user_data=LexExpression(cc);461            else462              goto pd_err;463            break;464          case DOCEf_FLAGS_NUM-1: //nobound switch465            break;466        }467      }468    } else {469pd_err:470      if (!doc_e)471        doc_e=CAlloc(sizeof(CDocEntry),doc->mem_task);472      doc_e->type=DOCT_ERROR;473      doc_e->de_flags=0;474    }475    if (doc_e->de_flags&DOCEF_LST && (doc_e->de_flags&DOCEF_REMALLOC_DATA ||476          !(doc_e->de_flags&DOCEF_DEREF_DATA))) {477      DocDataScan(doc,doc_e);478      DocDataFmt(doc,doc_e);479    }480    CmpCtrlDel(cc);481  } catch {482    Fs->catch_except=TRUE;483    if (!doc_e)484      doc_e=CAlloc(sizeof(CDocEntry),doc->mem_task);485    doc_e->type=DOCT_ERROR;486    doc_e->de_flags=0;487  }488  return doc_e;489}490 491U0 DocEntryToggle(CDoc *doc)492{493  Bool unlock=DocLock(doc),old_color_names;494  CDocEntry *doc_ce=doc->cur_entry,*cl1,*doc_ce2;495  U8 ch,*st,*st2;496  I64 i,j,k;497  if (doc_ce!=doc &&498        !(doc->flags&(DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_TABS))) {499    if (doc_ce->type_u8==DOCT_TEXT && !(doc_ce->de_flags &500          ~(DOCEF_TAG|DOCG_BL_IV_UL|DOCEF_WORD_WRAP|DOCEF_HIGHLIGHT|501          DOCEF_SKIP|DOCEF_FILTER_SKIP)) &&502          !(doc_ce->type&DOCG_BL_IV_UL)) {503      doc_ce2=doc_ce->last;504      for (k=0;k<20;k++) {505        if (doc_ce2!=doc) {506          cl1=doc_ce2->last;507          if (doc_ce2->type_u8==DOCT_TEXT &&508                doc_ce->de_flags==doc_ce2->de_flags &&509                doc_ce->type==doc_ce2->type) {510            i=StrLen(doc_ce2->tag);511            j=StrLen(doc_ce->tag);512            st=MAlloc(i+j+1,doc->mem_task);513            MemCpy(st,doc_ce2->tag,i);514            MemCpy(st+i,doc_ce->tag,j+1);515            Free(doc_ce->tag);516            doc_ce->tag=st;517            doc_ce->max_col=i+j;518            doc->cur_col+=i;519            DocEntryDel(doc,doc_ce2);520          } else if (doc_ce2->type_u8==DOCT_SOFT_NEW_LINE)521            DocEntryDel(doc,doc_ce2);522          else523            break;524          doc_ce2=cl1;525        } else526          break;527      }528      doc_ce2=doc_ce->next;529      for (k=0;k<20;k++) {530        if (doc_ce2!=doc) {531          cl1=doc_ce2->next;532          if (doc_ce2->type_u8==DOCT_TEXT &&533                doc_ce->de_flags==doc_ce2->de_flags &&534                doc_ce->type==doc_ce2->type) {535            i=StrLen(doc_ce->tag);536            j=StrLen(doc_ce2->tag);537            st=MAlloc(i+j+1,doc->mem_task);538            MemCpy(st,doc_ce->tag,i);539            MemCpy(st+i,doc_ce2->tag,j+1);540            Free(doc_ce->tag);541            doc_ce->tag=st;542            doc_ce->max_col=i+j;543            DocEntryDel(doc,doc_ce2);544          } else if (doc_ce2->type_u8==DOCT_SOFT_NEW_LINE)545            DocEntryDel(doc,doc_ce2);546          else547            break;548          doc_ce2=cl1;549        } else550          break;551      }552      i=doc->cur_col;553      while (i>doc_ce->min_col && doc_ce->tag[i]!='$')554        i--;555      j=doc->cur_col+1;556      while (j<doc_ce->max_col && doc_ce->tag[j]!='$')557        j++;558      if (i<j-1 && doc_ce->min_col<=i<j<doc_ce->max_col &&559            doc_ce->tag[i]=='$' && doc_ce->tag[j]=='$') {560        ch=doc_ce->tag[j+1];561        doc_ce->tag[j+1]=0;562        st=StrNew(doc_ce->tag+i);563        doc_ce->tag[j+1]=ch;564        StrCpy(doc_ce->tag+i,doc_ce->tag+j+1);565        doc->cur_col=i;566        st2=MStrPrint("%q",st);567        if (doc_ce=DocPrint(doc,st2)) {568          doc->cur_entry=doc_ce;569          doc->cur_col=doc_ce->min_col;570        }571        Free(st);572        Free(st2);573      }574    } else {575      old_color_names=LBts(&doc->flags,DOCf_COLOR_NAMES);576      st=Doc2PlainText(doc,doc_ce);577      LBEqu(&doc->flags,DOCf_COLOR_NAMES,old_color_names);578      DocEntryDel(doc,doc_ce);579      DocPrint(doc,"$$%$Q$$",st);580    }581    DocRecalc(doc);582  }583  if (unlock)584    DocUnlock(doc);585}586 587U0 DocFlagsToggle(CDoc *doc,I64 tog_flags)588{589  Bool  unlock=DocLock(doc);590  I64 size,flags=doc->flags^tog_flags;591  U8 *st;592  CDocUndo *u_next,*u_last;593 594  doc->flags=doc->flags&~DOCF_NO_CURSOR|DOCF_COLOR_NAMES;595  st=DocSave(doc,&size);596 597  u_next=doc->undo_head.next;598  u_last=doc->undo_head.last;599  doc->undo_head.next=doc->undo_head.last=&doc->undo_head;600 601  DocRst(doc,TRUE);602  doc->undo_head.next=u_next;603  doc->undo_head.last=u_last;604  DocUndoCntSet(doc);605  doc->flags=flags&~(DOCF_NO_CURSOR|DOCG_BL_IV_UL|DOCF_WORD_WRAP);606  DocLoad(doc,st,size);607  doc->flags|=flags&DOCF_NO_CURSOR;608  DocCenter(doc);609  if (unlock)610    DocUnlock(doc);611  Free(st);612}613