Added StrReplace(). Not heavily tested

This commit is contained in:
Void NV 2020-03-20 19:35:06 -05:00
parent ce63335991
commit c7a04c4ee7
9 changed files with 28 additions and 39 deletions

View File

@ -135,7 +135,7 @@ $FG,2$Merge(\"C:/*\",\"D:/*\",\"+r+d\");$FG$ to check my changes.
* You can use $FG,2$<CTRL-SHIFT-L>$FG$ to do a check for compile errors.
* You can use $LK,"DocOpt",A="MN:DocOpt"$() to optimize links. (Mostly just removes )
* You can use $LK,"DocOpt",A="MN:DocOpt"$() to optimize links.
* With $FG,2$start$FG$/$FG,2$end$FG$, common trailing code is fast. Common leading code is slow.$FG$

View File

@ -0,0 +1 @@
g

View File

@ -232,30 +232,3 @@ SMBIOSInit;

View File

@ -1,8 +1,6 @@
/*
If you are sure a fun won't be called
before import is resolved, you can use
"import". Otherwise, use a fun pointer
var and check it before calling.
If you are sure a fun won't be called before import is resolved, you can use
"import". Otherwise, use a fun pointer var and check it before calling.
*/
import U0 ClassRep(U8 *_d,U8 *class_name=lastclass,
I64 max_depth=2,Bool u8_chars=FALSE,Bool fun=FALSE,I64 offset=0);
@ -48,6 +46,7 @@ extern Bool FAT32DirNew(CDrive *drive,U8 *cur_dir,CDirEntry *tmpde,
extern Bool FAT32FileFind(CDrive *drive,I64 cur_dir_clus,U8 *name,
CDirEntry *_res,I64 fuf_flags=0);
extern U0 FAT32Init(CDrive *drive);
extern U0 Free(U8 *addr);
extern Bool FBlkRead(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 count=1);
extern Bool FBlkWrite(CFile *f,U8 *buf,I64 blk=FFB_NEXT_BLK,I64 count=1);
extern U0 FClose(CFile *f);

View File

@ -1681,6 +1681,7 @@ public class CAutoCompleteDictGlobals
#define OPTf_NO_BUILTIN_CONST 10 //Applied to funs, not statements
#define OPTf_USE_IMM64 11 //Not completely implemented
#define OPTf_DECIMAL_ONLY 12 //Only allow decimal numbers (no 0x or 0b prefixed numbers)
#define OPTf_NO_FLOATS 13 //No floating point numbers allowed
#define OPTF_ECHO (1<<OPTf_ECHO)

View File

@ -71,6 +71,7 @@ public extern U8 *StrFirstRemove(U8 *src,U8 *marker,U8 *dst=NULL);
public _extern _STRICOMPARE I64 StrICompare(U8 *st1,U8 *st2);
public _extern _STRIMATCH U8 *StrIMatch(U8 *needle,U8 *haystack_str);
public extern U8 *StrLastOcc(U8 *src,U8 *marker);
public extern U8 *StrReplace(U8 *str, U8 *old, U8 *new, I64 sff_flags=NONE);
public extern U8 *StrLastRemove(U8 *src,U8 *marker,U8 *dst=NULL);
public _extern _STRMATCH U8 *StrMatch(U8 *needle,U8 *haystack_str);
public _extern _STRNCOMPARE I64 StrNCompare(U8 *st1,U8 *st2,I64 n);

View File

@ -641,6 +641,24 @@ U8 *StrFind(U8 *needle,U8 *haystack_str,I64 flags=0)
return haystack_str;
}
U8 *StrReplace(U8 *str, U8 *old, U8 *new, I64 sff_flags=NONE)
{//Replace all instances of old with new in str. New MAlloc()ed string.
if (!*old)
return new;
U8 *str_start, *str_end, *str_loc, *tmpm = NULL;
while (str_loc = str_end = StrFind(old, str, sff_flags))
{
str_start = str;
str_end += StrLen(old); //Move start marker past old str, cutting it out
str_start[StrLen(str_start) - StrLen(str_loc)] = '\0'; //End str_start right before where old was
Free(tmpm);
tmpm = MStrPrint("%s%s%s", str_start, new, str_end);
str = tmpm;
}
return str;
}
Bool WildMatch(U8 *test_str,U8 *wild_str)
{//Wildcard match with '*' and '?'.
I64 ch1,ch2;

View File

@ -263,7 +263,7 @@ public I64 FR(U8 *text_to_replace, U8 *new_text, U8 *files_find_mask="/*",
//FR("Gr", "Graphics", "/Zenith/Gr/*");
CDirEntry *files, *files_head;
I64 i, count = 0, fuf_flags = 0;
U8 *str_loc, *name_start, *tmp_name, *name_end, *new_path;
U8 *tmp_name, *new_path;
Bool all_flag = FALSE;
ScanFlags(&fuf_flags, Define("ST_FILE_UTIL_FLAGS"), "+r+f+F");
@ -273,15 +273,11 @@ public I64 FR(U8 *text_to_replace, U8 *new_text, U8 *files_find_mask="/*",
while (files)
{
if (name_end = str_loc = StrFind(text_to_replace, files->name, sff_flags))
if (StrFind(text_to_replace, files->name, sff_flags))
{
PutFileLink(files->full_name);
name_start = files->name;
' -> ';
name_end += StrLen(text_to_replace); //Cut out the old text
name_start[StrLen(name_start) - StrLen(str_loc)] = '\0'; //End the name_start right before where the old text was
tmp_name = MStrPrint("%s%s%s", name_start, new_text, name_end);
tmp_name = StrReplace(files->name, text_to_replace, new_text, sff_flags);
new_path = MStrPrint("%s/%s", DirFile(files->full_name), tmp_name);
PutFileLink(new_path);