hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Cmd Line (Typically)"3 4#define FND_REPLACE 05#define FND_SKIP 16#define FND_ALL 27#define FND_ED 38#define FND_ABORT_FILE 49#define FND_SKIP_FILE 510 11I64 PopUpFindMenu()12{13 I64 i;14 CDoc *doc=DocNew;15 DocPrint(doc,"$CM+LX,2,4$$BT,\"REPLACE\",LE=FND_REPLACE$"16 "$CM+LX,22,0$$BT,\"SKIP\",LE=FND_SKIP$"17 "$CM+LX,2,4$$BT,\"ALL\",LE=FND_ALL$"18 "$CM+LX,22,0$$BT,\"ABORT ALL\",LE=DOCM_CANCEL$"19 "$CM+LX,2,4$$BT,\"EDIT\",LE=FND_ED$"20 "$CM+LX,22,0$$BT,\"ABORT FILE\",LE=FND_ABORT_FILE$"21 "$CM+LX,2,4$$BT,\"SKIP FILE\",LE=FND_SKIP_FILE$\n");22 i=PopUpMenu(doc);23 DocDel(doc);24 return i;25}26 27I64 FindFile(U8 *needle_str,U8 *haystack_filename,28 I64 *_fuf_flags,U8 *replace_text)29{//Have you confused with FileFind()?30 Bool first_on_line,write_this_file=FALSE,cont=!Bt(_fuf_flags,FUf_CANCEL);31 U8 *src,*dst,*dst2,*name_buf=NULL;32 I64 i,j,plen,rlen,dlen,cnt=0,old_flags,ss_flags;33 CDoc *cur_l,*doc=DocRead(haystack_filename,34 DOCF_PLAIN_TEXT_TABS|DOCF_NO_CURSOR);35 CDocEntry *doc_e;36 37 if (Bt(_fuf_flags,FUf_IGNORE))38 ss_flags=SFF_IGNORE_CASE;39 else40 ss_flags=0;41 if (Bt(_fuf_flags,FUf_WHOLE_LABELS))42 ss_flags|=SFG_WHOLE_LABELS;43 if (Bt(_fuf_flags,FUf_WHOLE_LABELS_BEFORE))44 ss_flags|=SFF_WHOLE_LABELS_BEFORE;45 if (Bt(_fuf_flags,FUf_WHOLE_LABELS_AFTER))46 ss_flags|=SFF_WHOLE_LABELS_AFTER;47 48 plen=StrLen(needle_str);49 if (replace_text)50 rlen=StrLen(replace_text);51 doc_e=doc->head.next;52 while (doc_e!=doc && cont) {53 if (doc_e->type_u8==DOCT_TEXT) {54 src=doc_e->tag;55 first_on_line=TRUE;56 while (src && cont) {57 if (src=StrFind(needle_str,src,ss_flags)) {58 cnt++;59 if (first_on_line || Bt(_fuf_flags,FUf_REPLACE)) {60 first_on_line=FALSE;61 PutFileLink(haystack_filename,,doc_e->y+1,TRUE);62 name_buf=MStrPrint("%s,%d",haystack_filename,doc_e->y+1);63 if (cur_l=DocPut) {64 old_flags=cur_l->flags&DOCF_PLAIN_TEXT;65 cur_l->flags|=DOCF_PLAIN_TEXT;66 }67 " %s\n",doc_e->tag;68 if (cur_l)69 cur_l->flags= cur_l->flags&~DOCF_PLAIN_TEXT |old_flags;70 }71 if (Bt(_fuf_flags,FUf_REPLACE)) {72 if (Bt(_fuf_flags,FUf_ALL))73 i=FND_ALL;74 else {75 i=PopUpFindMenu;76 if (i<0) {77 LBts(_fuf_flags,FUf_CANCEL);78 cont=FALSE;79 write_this_file=FALSE;80 } else if (i==FND_ALL)81 LBts(_fuf_flags,FUf_ALL);82 else if (i==FND_ABORT_FILE) {83 cont=FALSE;84 write_this_file=FALSE;85 } else if (i==FND_SKIP_FILE)86 cont=FALSE;87 }88 if (i==FND_REPLACE || i==FND_ALL) {89 dlen=StrLen(doc_e->tag);90 dst=MAlloc(dlen+1+rlen-plen);91 dst2=dst;92 j=src-doc_e->tag;93 for (i=0;i<j;i++)94 *dst++=doc_e->tag[i];95 for (i=0;i<rlen;i++)96 *dst++=replace_text[i];97 src=dst;98 for (i=j+plen;i<=dlen;i++)99 *dst++=doc_e->tag[i];100 Free(doc_e->tag);101 doc_e->tag=dst2;102 if (cur_l=DocPut) {103 old_flags=cur_l->flags&DOCF_PLAIN_TEXT;104 cur_l->flags|=DOCF_PLAIN_TEXT;105 }106 "%12s,%04d*%s\n",haystack_filename,doc_e->y+1,dst2;107 if (cur_l)108 cur_l->flags= cur_l->flags&~DOCF_PLAIN_TEXT |old_flags;109 write_this_file=TRUE;110 } else {111 src++;112 if (i==FND_ED) {113 Free(name_buf);114 name_buf=StrNew(doc->filename.name);115 doc->flags&=~DOCF_NO_CURSOR;116 doc->cur_entry=doc_e;117 doc->cur_col=doc_e->min_col;118 DocWrite(doc);119 DocDel(doc);120 "Wrote:%s\n",name_buf;121 Ed(name_buf);122 doc=DocRead(name_buf, DOCF_PLAIN_TEXT_TABS);123 doc_e=doc->cur_entry;124 if (doc_e->last!=doc) doc_e=doc_e->last;125 src=NULL;126 write_this_file=FALSE;127 }128 }129 } else130 src++;131 Free(name_buf);132 name_buf=NULL;133 }134 }135 }136 doc_e=doc_e->next;137 }138 if (write_this_file) {139 DocWrite(doc);140 "Wrote:%s\n",doc->filename.name;141 }142 DocDel(doc);143 return cnt;144}145 146public I64 Find(U8 *needle_str,U8 *files_find_mask="*",147 U8 *fu_flags=NULL,U8 *replace_text=NULL)148{/*Find occurrences of a string in files.149This does not do regular expressions.150Anyway, it's good for searching and replacing.151Let's say it stands for global replace ;-)152 153"+r" =recurse154"+i" =ignore case155"+l" =whole labels only.156This will check for a nonlabel character before157and after. If you have a var, "dd" and don't158want to match words like "Add", you159set this flag and it will see that the characters160before or after "dd" are label characters.161"+lb"=only checks for label chars before.162"+la"=only checks for label chars after.163*/164 I64 cnt=0,fuf_flags=0;165 CDirEntry *tmpde,*tmpde1;166 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r+i+f+F+T");167 ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);168 if (fuf_flags&~(FUG_FILES_FIND|FUF_IGNORE|FUF_ALL|169 FUF_WHOLE_LABELS|FUF_WHOLE_LABELS_BEFORE|FUF_WHOLE_LABELS_AFTER))170 throw('FUF');171 LBEqu(&fuf_flags,FUf_REPLACE,replace_text);172 tmpde=tmpde1=FilesFind(files_find_mask,fuf_flags&FUG_FILES_FIND);173 fuf_flags&=FUF_ALL|FUF_REPLACE|FUF_IGNORE|FUF_WHOLE_LABELS|174 FUF_WHOLE_LABELS_BEFORE|FUF_WHOLE_LABELS_AFTER;175 while (tmpde && !Bt(&fuf_flags,FUf_CANCEL)) {176 cnt+=FindFile(needle_str,tmpde->full_name,&fuf_flags,replace_text);177 tmpde=tmpde->next;178 }179 DirTreeDel(tmpde1);180 return cnt;181}182 183public I64 FileOcc(U8 *needle_str,184 U8 *files_find_mask="*",U8 *fu_flags="+r+i+l")185{/*Silently return occurrences of a string in files.186"+r"=recurse187"+i"=ignore case188"+l"=whole labels only.189"+lb"=only checks for label chars before.190"+la"=only checks for label chars after.191*/192 I64 cnt=0;193 Bool old_silent=Silent(TRUE);194 cnt=Find(needle_str,files_find_mask,fu_flags);195 Silent(old_silent);196 return cnt;197}198 199class CFind200{201 U8 find_text[STR_LEN] format "$DA-P,"202 "A=\"FIND :%s\"$\n";203 U8 replace_text[STR_LEN] format "$DA-P,"204 "A=\"REPLACE :%s\"$\n";205 Bool replace format "$CB,\"REPLACE\"$\n";206 Bool match_case format "$CB,\"MATCH CASE\"$\n";207 Bool whole_labels format "$CB,\"WHOLE LABELS\"$\n";208 U8 filemask[STR_LEN] format "$DA-P,A=\"FILE MASK :%s\"$\n";209 Bool recurse format "$CB,\"RECURSE\"$\n";210};211 212I64 FindWiz()213{214 CDoc *doc;215 U8 buf[32],*dir,*st;216 CFind *g=CAlloc(sizeof(CFind));217 I64 res=0;218 g->recurse=TRUE;219 StrCpy(g->filemask,FILEMASK_TXT);220 if (doc=DocPut) {221 StrCpy(g->find_text,doc->find_replace->find_text);222 StrCpy(g->replace_text,doc->find_replace->replace_text);223 g->replace=doc->find_replace->replace;224 g->match_case=doc->find_replace->match_case;225 g->whole_labels=doc->find_replace->whole_labels;226 }227 if (DocForm(g,,0,"$PURPLE$$TX+CX,\"Find\"$\n$FG$")) {228 if (doc) {229 StrCpy(doc->find_replace->find_text,g->find_text);230 StrCpy(doc->find_replace->replace_text,g->replace_text);231 doc->find_replace->replace=g->replace;232 doc->find_replace->match_case=g->match_case;233 doc->find_replace->whole_labels=g->whole_labels;234 }235 dir=PopUpPickDir;236 if (*dir) {237 *buf=0;238 if (g->match_case)239 CatPrint(buf,"-i");240 if (!g->recurse)241 CatPrint(buf,"-r");242 if (g->whole_labels)243 CatPrint(buf,"+l");244 if (g->replace)245 st=MStrPrint("\"$$WW+H,1$$\";Cd(\"%s\");"246 "Find(\"%Q\",\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",247 dir,g->find_text,g->filemask,buf,g->replace_text);248 else249 st=MStrPrint("\"$$WW+H,1$$\";Cd(\"%s\");"250 "Find(\"%Q\",\"%Q\",\"%Q\");UserTaskCont;",251 dir,g->find_text,g->filemask,buf);252 res=PopUp(st);253 }254 Free(dir);255 }256 Free(g);257 return res;258}259 