FFstrbuf: add new methods ffStrbufPrependC and ffStrbufInsertNC

This commit is contained in:
李通洲 2024-09-26 14:34:51 +08:00
parent 8295f66320
commit 4d7d367e72
3 changed files with 49 additions and 0 deletions

View File

@ -211,6 +211,14 @@ void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value)
strbuf->length += length;
}
void ffStrbufPrependC(FFstrbuf* strbuf, char c)
{
ffStrbufEnsureFree(strbuf, 1);
memmove(strbuf->chars + 1, strbuf->chars, strbuf->length + 1); // + 1 for the null byte
strbuf->chars[0] = c;
strbuf->length += 1;
}
void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value)
{
ffStrbufClear(strbuf);
@ -511,3 +519,15 @@ void ffStrbufLowerCase(FFstrbuf* strbuf)
for (uint32_t i = 0; i < strbuf->length; ++i)
strbuf->chars[i] = (char) tolower(strbuf->chars[i]);
}
void ffStrbufInsertNC(FFstrbuf* strbuf, uint32_t index, uint32_t num, char c)
{
if(num == 0) return;
if (index >= strbuf->length)
index = strbuf->length;
ffStrbufEnsureFree(strbuf, num);
memmove(strbuf->chars + index + num, strbuf->chars + index, strbuf->length - index + 1);
memset(&strbuf->chars[index], c, num);
strbuf->length += num;
}

View File

@ -47,6 +47,9 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments);
const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until);
void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value);
void ffStrbufPrependC(FFstrbuf* strbuf, char c);
void ffStrbufInsertNC(FFstrbuf* strbuf, uint32_t index, uint32_t num, char c);
void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value);
void ffStrbufSet(FFstrbuf* strbuf, const FFstrbuf* value);

View File

@ -279,6 +279,20 @@ int main(void)
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST"));
VERIFY(strbuf.length == 9);
VERIFY(strbuf.allocated >= 10);
ffStrbufAppendC(&strbuf, '_');
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST_"));
ffStrbufDestroy(&strbuf);
VERIFY(strbuf.length == 0);
VERIFY(strbuf.allocated == 0);
//ffStrbufCreateStatic / Prepend
ffStrbufInitStatic(&strbuf, "TEST");
ffStrbufPrependS(&strbuf, "TEST_");
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST"));
VERIFY(strbuf.length == 9);
VERIFY(strbuf.allocated >= 10);
ffStrbufPrependC(&strbuf, '_');
VERIFY(ffStrbufEqualS(&strbuf, "_TEST_TEST"));
ffStrbufDestroy(&strbuf);
VERIFY(strbuf.length == 0);
VERIFY(strbuf.allocated == 0);
@ -416,6 +430,18 @@ int main(void)
VERIFY(ffStrbufEqualS(&strbuf, "__TEST__"));
ffStrbufDestroy(&strbuf);
//ffStrbufInsertNC
ffStrbufInitStatic(&strbuf, "123456");
ffStrbufInsertNC(&strbuf, 0, 2, 'A');
VERIFY(ffStrbufEqualS(&strbuf, "AA123456"));
ffStrbufInsertNC(&strbuf, 4, 2, 'B');
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456"));
ffStrbufInsertNC(&strbuf, strbuf.length, 2, 'C');
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CC"));
ffStrbufInsertNC(&strbuf, 999, 2, 'D');
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CCDD"));
ffStrbufDestroy(&strbuf);
//Success
puts("\e[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET);
}