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