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)
+20 -6
View File
@@ -93,12 +93,26 @@ int main(void)
//substr
ffStrbufSubstrBefore(&strbuf, 9);
VERIFY(ffStrbufSubstrBefore(&strbuf, 9));
VERIFY(strbuf.length == 9);
VERIFY(strbuf.allocated >= 110);
VERIFY(strbuf.chars[strbuf.length] == 0);
VERIFY(ffStrbufEqualS(&strbuf, "123456789"));
VERIFY(!ffStrbufSubstrBeforeFirstC(&strbuf, '0'));
VERIFY(!ffStrbufSubstrBeforeLastC(&strbuf, '0'));
VERIFY(!ffStrbufSubstrAfterFirstC(&strbuf, '0'));
VERIFY(!ffStrbufSubstrAfterLastC(&strbuf, '0'));
VERIFY(ffStrbufEqualS(&strbuf, "123456789"));
VERIFY(ffStrbufSubstrBeforeFirstC(&strbuf, '9'));
VERIFY(ffStrbufSubstrBeforeLastC(&strbuf, '8'));
VERIFY(ffStrbufSubstrAfterFirstC(&strbuf, '1'));
VERIFY(ffStrbufSubstrAfterLastC(&strbuf, '2'));
VERIFY(ffStrbufEqualS(&strbuf, "34567"));
ffStrbufSetS(&strbuf, "123456789");
//startsWithC
VERIFY(ffStrbufStartsWithC(&strbuf, '1'));
@@ -313,7 +327,7 @@ int main(void)
//ffStrbufCreateStatic / Substr
ffStrbufInitStatic(&strbuf, "__TEST__");
ffStrbufRemoveSubstr(&strbuf, 0, 6);
VERIFY(ffStrbufRemoveSubstr(&strbuf, 0, 6));
VERIFY(ffStrbufEqualS(&strbuf, "__"));
VERIFY(strbuf.length == 2);
VERIFY(strbuf.allocated > 0);
@@ -321,7 +335,7 @@ int main(void)
//ffStrbufCreateStatic / Substr
ffStrbufInitStatic(&strbuf, "__TEST__");
ffStrbufRemoveSubstr(&strbuf, 2, 8);
VERIFY(ffStrbufRemoveSubstr(&strbuf, 2, 8));
VERIFY(ffStrbufEqualS(&strbuf, "__"));
VERIFY(strbuf.length == 2);
VERIFY(strbuf.allocated > 0);
@@ -329,13 +343,13 @@ int main(void)
//ffStrbufCreateStatic / Substr
ffStrbufInitStatic(&strbuf, "__TEST__");
ffStrbufRemoveSubstr(&strbuf, 2, 6);
VERIFY(ffStrbufRemoveSubstr(&strbuf, 2, 6));
VERIFY(ffStrbufEqualS(&strbuf, "____"));
VERIFY(strbuf.length == 4);
VERIFY(strbuf.allocated > 0);
ffStrbufDestroy(&strbuf);
//ffStrbufCreateStatic / Substr
//ffStrbufCreateStatic / ReplaceAllC
ffStrbufInitStatic(&strbuf, "__TEST__");
ffStrbufReplaceAllC(&strbuf, '_', '-');
VERIFY(ffStrbufEqualS(&strbuf, "--TEST--"));
@@ -403,5 +417,5 @@ int main(void)
ffStrbufDestroy(&strbuf);
//Success
puts("\033[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET);
puts("\e[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET);
}