Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
Find.txt259 linesDownload Raw Back to Utils
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