FFstrbuf: improve ffStrbufSubstr*

This commit is contained in:
李通洲
2024-07-16 15:39:06 +08:00
parent 0776dac95b
commit c795c20723
3 changed files with 68 additions and 39 deletions
+36 -22
View File
@@ -292,21 +292,22 @@ void ffStrbufTrimRightSpace(FFstrbuf* strbuf)
strbuf->chars[strbuf->length] = '\0';
}
void ffStrbufRemoveSubstr(FFstrbuf* strbuf, uint32_t startIndex, uint32_t endIndex)
bool ffStrbufRemoveSubstr(FFstrbuf* strbuf, uint32_t startIndex, uint32_t endIndex)
{
if(startIndex > strbuf->length || startIndex >= endIndex)
return;
return false;
if(endIndex > strbuf->length)
{
ffStrbufSubstrBefore(strbuf, startIndex);
return;
return true;
}
ffStrbufEnsureFree(strbuf, 0);
memmove(strbuf->chars + startIndex, strbuf->chars + endIndex, strbuf->length - endIndex);
strbuf->length -= (endIndex - startIndex);
strbuf->chars[strbuf->length] = '\0';
return true;
}
void ffStrbufRemoveS(FFstrbuf* strbuf, const char* str)
@@ -362,28 +363,29 @@ void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace)
*current_pos = replace;
}
void ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index)
bool ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index)
{
if(strbuf->length <= index)
return;
return false;
if(strbuf->allocated == 0)
{
//static string
ffStrbufInitNS(strbuf, strbuf->length, strbuf->chars);
return;
return true;
}
strbuf->length = index;
strbuf->chars[strbuf->length] = '\0';
return true;
}
void ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index)
bool ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index)
{
if(index >= strbuf->length)
{
ffStrbufClear(strbuf);
return;
return true;
}
if(strbuf->allocated == 0)
@@ -391,36 +393,45 @@ void ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index)
//static string
strbuf->length -= index + 1;
strbuf->chars += index + 1;
return;
return true;
}
memmove(strbuf->chars, strbuf->chars + index + 1, strbuf->length - index - 1);
strbuf->length -= (index + 1);
strbuf->chars[strbuf->length] = '\0';
return true;
}
void ffStrbufSubstrAfterFirstC(FFstrbuf* strbuf, char c)
bool ffStrbufSubstrAfterFirstC(FFstrbuf* strbuf, char c)
{
uint32_t index = ffStrbufFirstIndexC(strbuf, c);
if(index < strbuf->length)
ffStrbufSubstrAfter(strbuf, index);
if(index >= strbuf->length)
return false;
ffStrbufSubstrAfter(strbuf, index);
return true;
}
void ffStrbufSubstrAfterFirstS(FFstrbuf* strbuf, const char* str)
bool ffStrbufSubstrAfterFirstS(FFstrbuf* strbuf, const char* str)
{
if(*str == '\0')
return;
return false;
uint32_t index = ffStrbufFirstIndexS(strbuf, str) + (uint32_t) strlen(str) - 1; // -1, because firstIndexS is already pointing to str[0], we want to add only the remaining length
if(index < strbuf->length)
ffStrbufSubstrAfter(strbuf, index);
if(index >= strbuf->length)
return false;
ffStrbufSubstrAfter(strbuf, index);
return true;
}
void ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c)
bool ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c)
{
uint32_t index = ffStrbufLastIndexC(strbuf, c);
if(index < strbuf->length)
ffStrbufSubstrAfter(strbuf, index);
if(index >= strbuf->length)
return false;
ffStrbufSubstrAfter(strbuf, index);
return true;
}
uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c)
@@ -448,10 +459,13 @@ bool ffStrbufRemoveIgnCaseEndS(FFstrbuf* strbuf, const char* end)
return false;
}
void ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c)
bool ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c)
{
if(!ffStrbufEndsWithC(strbuf, c))
ffStrbufAppendC(strbuf, c);
if(ffStrbufEndsWithC(strbuf, c))
return false;
ffStrbufAppendC(strbuf, c);
return true;
}
void ffStrbufWriteTo(const FFstrbuf* strbuf, FILE* file)
+12 -11
View File
@@ -56,7 +56,7 @@ void ffStrbufTrimLeft(FFstrbuf* strbuf, char c);
void ffStrbufTrimRight(FFstrbuf* strbuf, char c);
void ffStrbufTrimRightSpace(FFstrbuf* strbuf);
void ffStrbufRemoveSubstr(FFstrbuf* strbuf, uint32_t startIndex, uint32_t endIndex);
bool ffStrbufRemoveSubstr(FFstrbuf* strbuf, uint32_t startIndex, uint32_t endIndex);
void ffStrbufRemoveS(FFstrbuf* strbuf, const char* str);
void ffStrbufRemoveStrings(FFstrbuf* strbuf, uint32_t numStrings, const char* strings[]);
@@ -67,17 +67,18 @@ FF_C_NODISCARD uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t
void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace);
void ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index);
void ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index); // Not including the index
void ffStrbufSubstrAfterFirstC(FFstrbuf* strbuf, char c);
void ffStrbufSubstrAfterFirstS(FFstrbuf* strbuf, const char* str);
void ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c);
// Returns true if the strbuf is modified
bool ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index);
bool ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index); // Not including the index
bool ffStrbufSubstrAfterFirstC(FFstrbuf* strbuf, char c);
bool ffStrbufSubstrAfterFirstS(FFstrbuf* strbuf, const char* str);
bool ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c);
FF_C_NODISCARD uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c);
bool ffStrbufRemoveIgnCaseEndS(FFstrbuf* strbuf, const char* end);
void ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c);
bool ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c);
void ffStrbufWriteTo(const FFstrbuf* strbuf, FILE* file);
void ffStrbufPutTo(const FFstrbuf* strbuf, FILE* file);
@@ -383,14 +384,14 @@ static inline FF_C_NODISCARD uint32_t ffStrbufLastIndexC(const FFstrbuf* strbuf,
return ffStrbufPreviousIndexC(strbuf, strbuf->length - 1, c);
}
static inline void ffStrbufSubstrBeforeFirstC(FFstrbuf* strbuf, char c)
static inline bool ffStrbufSubstrBeforeFirstC(FFstrbuf* strbuf, char c)
{
ffStrbufSubstrBefore(strbuf, ffStrbufFirstIndexC(strbuf, c));
return ffStrbufSubstrBefore(strbuf, ffStrbufFirstIndexC(strbuf, c));
}
static inline void ffStrbufSubstrBeforeLastC(FFstrbuf* strbuf, char c)
static inline bool ffStrbufSubstrBeforeLastC(FFstrbuf* strbuf, char c)
{
ffStrbufSubstrBefore(strbuf, ffStrbufLastIndexC(strbuf, c));
return ffStrbufSubstrBefore(strbuf, ffStrbufLastIndexC(strbuf, c));
}
static inline FF_C_NODISCARD bool ffStrbufStartsWithC(const FFstrbuf* strbuf, char c)