hschumann2/TempleOS-Source-Code
0847
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 