hschumann2/TempleOS-Source-Code
0847
1 2#help_index "DolDoc"3 4U0 EdUndoFilter(CDoc *doc)5{6 Bool unlock=DocLock(doc);7 CDocEntry *doc_ce=doc->head.next;8 while (doc_ce!=doc) {9 doc_ce->de_flags&=~DOCEF_FILTER_SKIP;10 doc_ce=doc_ce->next;11 }12 doc->find_replace->filter_lines=0;13 if (unlock)14 DocUnlock(doc);15}16 17public I64 DocGetKey(I64 *_sc=NULL)18{//Called by View. You probably don't need this.19 I64 ch,sc;20 Bool cont,old_key_desc;21 do {22 old_key_desc=LBtr(&Fs->win_inhibit,WIf_SELF_KEY_DESC);23 do ch=GetKey(&sc,TRUE);24 while (sc&SCF_KEY_DESC);25 LBEqu(&Fs->win_inhibit,WIf_SELF_KEY_DESC,old_key_desc);26 27 DocRecalc(DocPut);28 cont=FALSE;29 if ((ch==CH_ESC || ch==CH_SHIFT_ESC) && //Check for exit filter mode30 DocPut && DocPut->find_replace->filter_lines) {31 EdUndoFilter(DocPut);32 cont=TRUE;33 }34 } while (cont);35 if (_sc) *_sc=sc;36 return ch;37}38 39#help_index "DolDoc/Input;StdIn/DolDoc"40public U8 *DocScanLine(CDoc *doc,CDocEntry *doc_e,41 I64 *cur_col=NULL,CDocEntry **_do_e_end=NULL)42{//Start at entry in doc,make and return one line as str.43 CDocEntry *doc_e2=doc_e;44 Bool unlock=DocLock(doc);45 U8 *dst,*src,*start,*res;46 I64 i=0;47 if (cur_col)48 *cur_col=-1;49 while (doc_e2!=doc && doc_e2->type_u8!=DOCT_NEW_LINE) {50 if (doc_e2->de_flags&DOCEF_TAG && doc_e2->tag) {51 src=doc_e2->tag;52 i+=StrLen(src);53 } else if (doc_e2->type_u8==DOCT_TAB)54 i++;55 else if (doc_e2->type_u8==DOCT_SHIFTED_X ||56 doc_e2->type_u8==DOCT_SHIFTED_Y) {57 if (doc_e2->attr<0)58 i++;59 i+=6; //$SY,3$60 }61 doc_e2=doc_e2->next;62 }63 res=MAlloc(i+1);64 dst=res;65 while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE) {66 start=dst;67 if (doc_e->de_flags&DOCEF_TAG && doc_e->tag) {68 src=doc_e->tag;69 while (*src)70 *dst++=*src++;71 } else if (doc_e->type_u8==DOCT_TAB)72 *dst++='\t';73 else if (doc_e->type_u8==DOCT_SHIFTED_Y) {74 *dst(U32 *)++='$SY,';75 if (doc_e->attr<0)76 *dst++='-';77 *dst++='0'+AbsI64(doc_e->attr); //Supposedly -7 to 7 (single digit)78 *dst++='$';79 } else if (doc_e->type_u8==DOCT_SHIFTED_X) {80 *dst(U32 *)++='$SX,';81 if (doc_e->attr<0)82 *dst++='-';83 *dst++='0'+AbsI64(doc_e->attr); //Supposedly -7 to 7 (single digit)84 *dst++='$';85 }86 if (doc_e==doc->cur_entry && cur_col)87 *cur_col=start-res+doc->cur_col;88 doc_e=doc_e->next;89 }90 if (_do_e_end) *_do_e_end=doc_e;91 *dst=0;92 if (doc_e==doc->cur_entry && cur_col && !doc->cur_col)93 *cur_col=dst-res;94 if (unlock)95 DocUnlock(doc);96 return res;97}98 99U8 *DocGetStr2(I64 flags=0)100{//Flags101 CDoc *doc;102 CDocEntry *doc_e,*doc_e_end;103 U8 *st,*st2,*res;104 I64 ch,sc;105 "$PT$";106 do {107 ch=DocGetKey(&sc);108 if (ch==CH_ESC) {109 if (doc=DocPut) {110 DocLock(doc);111 if (doc->doc_signature==DOC_SIGNATURE_VAL && doc->cur_entry!=doc) {112 doc_e=DocEntryCopy(doc,doc->cur_entry);113 DocBottom(doc);114 DocEntryRun(doc,doc_e,TRUE);115 DocEntryDel(doc,doc_e);116 }117 DocUnlock(doc);118 }119 if (flags&GSF_WITH_NEW_LINE)120 break;121 } if (ch==CH_SHIFT_ESC) {122 if (flags&GSF_SHIFT_ESC_EXIT)123 Exit;124 else {125 res=StrNew("");126 goto gs_done;127 }128 }129//<CTRL-SHIFT-ENTER> is a blank line without entry130 } while (flags&GSF_WITH_NEW_LINE || ch!='\n' ||131 sc&SCF_CTRL && sc&SCF_SHIFT);132 133 doc=DocPut;134 DocLock(doc);135 if (flags&GSF_WITH_NEW_LINE) {136 doc_e=doc->cur_entry;137 do doc_e=doc_e->last;138 while (doc_e!=doc && doc_e->type_u8!=DOCT_PMT);139 doc_e=doc_e->next;140 if (res=DocScanLine(doc,doc_e,NULL,&doc_e_end)) {141 while (doc_e_end!=doc && doc_e_end->type_u8==DOCT_NEW_LINE) {142 st2=MStrPrint("%s\n",res);143 Free(res);144 res=st2;145 if (st=DocScanLine(doc,doc_e_end->next,NULL,&doc_e_end)) {146 st2=MStrPrint("%s%s",res,st);147 Free(st);148 Free(res);149 res=st2;150 }151 }152 }153 } else {154 doc_e=doc->cur_entry;155 do doc_e=doc_e->last;156 while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&157 doc_e->type_u8!=DOCT_PMT);158 if (doc_e!=doc && doc_e->type_u8!=DOCT_PMT) {159 do doc_e=doc_e->last;160 while (doc_e!=doc && doc_e->type_u8!=DOCT_NEW_LINE &&161 doc_e->type_u8!=DOCT_PMT);162 }163 doc_e=doc_e->next;164 res=DocScanLine(doc,doc_e,NULL);165 }166 DocUnlock(doc);167gs_done:168 "$PT$$FG$$BG$";169 return res;170}171 172#help_index "Keyboard Devices;Char/Input;StdIn"173public I64 GetI64(U8 *msg=NULL,I64 dft=0,I64 lo=I64_MIN,I64 hi=I64_MAX)174{//Prompt user for I64 expression.175 Bool okay;176 U8 *st;177 I64 res;178 while (TRUE) {179 if (msg)180 "" msg,dft;181 st=GetStr;182 if (!*st) {183 Free(st);184 return dft;185 }186 try {187 res=ExePrint2("ToI64(%s);",st);188 okay=TRUE;189 } catch {190 Fs->catch_except=TRUE;191 okay=FALSE;192 }193 Free(st);194 if (okay && lo<=res<=hi)195 return res;196 }197}198 199public F64 GetF64(U8 *msg=NULL,F64 dft=0,F64 lo=F64_MIN,F64 hi=F64_MAX)200{//Prompt user for F64 expression.201 Bool okay;202 U8 *st;203 F64 res;204 while (TRUE) {205 if (msg)206 "" msg,dft;207 st=GetStr;208 if (!*st) {209 Free(st);210 return dft;211 }212 try {213 res=ExePrint2("ToF64(%s);",st)(F64);214 okay=TRUE;215 } catch {216 Fs->catch_except=TRUE;217 okay=FALSE;218 }219 Free(st);220 if (okay && lo<=res<=hi)221 return res;222 }223}224 225public CDate GetDate(U8 *msg=NULL,CDate dft=I64_MIN,226 CDate lo=I64_MIN,CDate hi=I64_MAX)227{//Prompt user for date expression. (Use Now() if you want current time.)228 U8 *st;229 CDate res;230 if (dft==I64_MIN) dft=Now;231 while (TRUE) {232 if (msg)233 "" msg,dft,dft;234 st=GetStr;235 if (!*st) {236 Free(st);237 return dft;238 }239 res=Str2Date(st);240 Free(st);241 if (res>=lo && res<=hi)242 return res;243 }244}245 