diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index c4a01592e..4387a5d7b 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -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; +} diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index a3b7179a4..a79ba2cc1 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -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); diff --git a/tests/strbuf.c b/tests/strbuf.c index 01db4e094..d901faab1 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -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); }