Skip to content

Commit 4d7d367

Browse files
committed
FFstrbuf: add new methods ffStrbufPrependC and ffStrbufInsertNC
1 parent 8295f66 commit 4d7d367

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

src/util/FFstrbuf.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,14 @@ void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value)
211211
strbuf->length += length;
212212
}
213213

214+
void ffStrbufPrependC(FFstrbuf* strbuf, char c)
215+
{
216+
ffStrbufEnsureFree(strbuf, 1);
217+
memmove(strbuf->chars + 1, strbuf->chars, strbuf->length + 1); // + 1 for the null byte
218+
strbuf->chars[0] = c;
219+
strbuf->length += 1;
220+
}
221+
214222
void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value)
215223
{
216224
ffStrbufClear(strbuf);
@@ -511,3 +519,15 @@ void ffStrbufLowerCase(FFstrbuf* strbuf)
511519
for (uint32_t i = 0; i < strbuf->length; ++i)
512520
strbuf->chars[i] = (char) tolower(strbuf->chars[i]);
513521
}
522+
523+
void ffStrbufInsertNC(FFstrbuf* strbuf, uint32_t index, uint32_t num, char c)
524+
{
525+
if(num == 0) return;
526+
if (index >= strbuf->length)
527+
index = strbuf->length;
528+
529+
ffStrbufEnsureFree(strbuf, num);
530+
memmove(strbuf->chars + index + num, strbuf->chars + index, strbuf->length - index + 1);
531+
memset(&strbuf->chars[index], c, num);
532+
strbuf->length += num;
533+
}

src/util/FFstrbuf.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments);
4747
const char* ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until);
4848

4949
void ffStrbufPrependNS(FFstrbuf* strbuf, uint32_t length, const char* value);
50+
void ffStrbufPrependC(FFstrbuf* strbuf, char c);
51+
52+
void ffStrbufInsertNC(FFstrbuf* strbuf, uint32_t index, uint32_t num, char c);
5053

5154
void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value);
5255
void ffStrbufSet(FFstrbuf* strbuf, const FFstrbuf* value);

tests/strbuf.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,20 @@ int main(void)
279279
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST"));
280280
VERIFY(strbuf.length == 9);
281281
VERIFY(strbuf.allocated >= 10);
282+
ffStrbufAppendC(&strbuf, '_');
283+
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST_"));
284+
ffStrbufDestroy(&strbuf);
285+
VERIFY(strbuf.length == 0);
286+
VERIFY(strbuf.allocated == 0);
287+
288+
//ffStrbufCreateStatic / Prepend
289+
ffStrbufInitStatic(&strbuf, "TEST");
290+
ffStrbufPrependS(&strbuf, "TEST_");
291+
VERIFY(ffStrbufEqualS(&strbuf, "TEST_TEST"));
292+
VERIFY(strbuf.length == 9);
293+
VERIFY(strbuf.allocated >= 10);
294+
ffStrbufPrependC(&strbuf, '_');
295+
VERIFY(ffStrbufEqualS(&strbuf, "_TEST_TEST"));
282296
ffStrbufDestroy(&strbuf);
283297
VERIFY(strbuf.length == 0);
284298
VERIFY(strbuf.allocated == 0);
@@ -416,6 +430,18 @@ int main(void)
416430
VERIFY(ffStrbufEqualS(&strbuf, "__TEST__"));
417431
ffStrbufDestroy(&strbuf);
418432

433+
//ffStrbufInsertNC
434+
ffStrbufInitStatic(&strbuf, "123456");
435+
ffStrbufInsertNC(&strbuf, 0, 2, 'A');
436+
VERIFY(ffStrbufEqualS(&strbuf, "AA123456"));
437+
ffStrbufInsertNC(&strbuf, 4, 2, 'B');
438+
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456"));
439+
ffStrbufInsertNC(&strbuf, strbuf.length, 2, 'C');
440+
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CC"));
441+
ffStrbufInsertNC(&strbuf, 999, 2, 'D');
442+
VERIFY(ffStrbufEqualS(&strbuf, "AA12BB3456CCDD"));
443+
ffStrbufDestroy(&strbuf);
444+
419445
//Success
420446
puts("\e[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET);
421447
}

0 commit comments

Comments
 (0)