Skip to content

Commit 0e8b9be

Browse files
committed
FFstrbuf: add function ffStrbufSubstr
1 parent a3182c3 commit 0e8b9be

3 files changed

Lines changed: 69 additions & 1 deletion

File tree

src/util/FFstrbuf.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,8 @@ bool ffStrbufSubstrBefore(FFstrbuf* strbuf, uint32_t index)
398398
if(strbuf->allocated == 0)
399399
{
400400
//static string
401-
ffStrbufInitNS(strbuf, strbuf->length, strbuf->chars);
401+
if (index < strbuf->length)
402+
ffStrbufInitNS(strbuf, index, strbuf->chars);
402403
return true;
403404
}
404405

@@ -461,6 +462,26 @@ bool ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c)
461462
return true;
462463
}
463464

465+
bool ffStrbufSubstr(FFstrbuf* strbuf, uint32_t start, uint32_t end)
466+
{
467+
if (__builtin_expect(start >= end, false))
468+
{
469+
ffStrbufClear(strbuf);
470+
return false;
471+
}
472+
473+
if (__builtin_expect(start == 0, false)) return ffStrbufSubstrBefore(strbuf, end);
474+
if (__builtin_expect(end >= strbuf->length, false)) return ffStrbufSubstrAfter(strbuf, start - 1);
475+
476+
uint32_t len = end - start;
477+
ffStrbufEnsureFixedLengthFree(strbuf, len); // In case of static string
478+
memmove(strbuf->chars, strbuf->chars + start, len);
479+
480+
strbuf->length = len;
481+
strbuf->chars[len] = '\0';
482+
return true;
483+
}
484+
464485
uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c)
465486
{
466487
uint32_t result = 0;

src/util/FFstrbuf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ bool ffStrbufSubstrAfter(FFstrbuf* strbuf, uint32_t index); // Not including the
7373
bool ffStrbufSubstrAfterFirstC(FFstrbuf* strbuf, char c);
7474
bool ffStrbufSubstrAfterFirstS(FFstrbuf* strbuf, const char* str);
7575
bool ffStrbufSubstrAfterLastC(FFstrbuf* strbuf, char c);
76+
bool ffStrbufSubstr(FFstrbuf* strbuf, uint32_t start, uint32_t end);
7677

7778
FF_C_NODISCARD uint32_t ffStrbufCountC(const FFstrbuf* strbuf, char c);
7879

tests/strbuf.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,52 @@ int main(void)
665665
VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abc", ':') == true);
666666
}
667667

668+
{
669+
ffStrbufSetStatic(&strbuf, "abc");
670+
ffStrbufSubstr(&strbuf, 0, 1); // start, end
671+
VERIFY(ffStrbufEqualS(&strbuf, "a"));
672+
673+
ffStrbufSetStatic(&strbuf, "abc");
674+
ffStrbufSubstr(&strbuf, 1, 1);
675+
VERIFY(ffStrbufEqualS(&strbuf, ""));
676+
677+
ffStrbufSetStatic(&strbuf, "abc");
678+
ffStrbufSubstr(&strbuf, 2, 1);
679+
VERIFY(ffStrbufEqualS(&strbuf, ""));
680+
681+
ffStrbufSetStatic(&strbuf, "abc");
682+
ffStrbufSubstr(&strbuf, 2, 3);
683+
VERIFY(ffStrbufEqualS(&strbuf, "c"));
684+
685+
ffStrbufSetStatic(&strbuf, "abc");
686+
ffStrbufSubstr(&strbuf, 0, 3);
687+
VERIFY(ffStrbufEqualS(&strbuf, "abc"));
688+
}
689+
690+
{
691+
ffStrbufSetS(&strbuf, "abc");
692+
ffStrbufSubstr(&strbuf, 0, 1); // start, end
693+
VERIFY(ffStrbufEqualS(&strbuf, "a"));
694+
695+
ffStrbufSetS(&strbuf, "abc");
696+
ffStrbufSubstr(&strbuf, 1, 1);
697+
VERIFY(ffStrbufEqualS(&strbuf, ""));
698+
699+
ffStrbufSetS(&strbuf, "abc");
700+
ffStrbufSubstr(&strbuf, 2, 1);
701+
VERIFY(ffStrbufEqualS(&strbuf, ""));
702+
703+
ffStrbufSetS(&strbuf, "abc");
704+
ffStrbufSubstr(&strbuf, 2, 3);
705+
VERIFY(ffStrbufEqualS(&strbuf, "c"));
706+
707+
ffStrbufSetS(&strbuf, "abc");
708+
ffStrbufSubstr(&strbuf, 0, 3);
709+
VERIFY(ffStrbufEqualS(&strbuf, "abc"));
710+
711+
ffStrbufDestroy(&strbuf);
712+
}
713+
668714
//Success
669715
puts("\e[32mAll tests passed!" FASTFETCH_TEXT_MODIFIER_RESET);
670716
}

0 commit comments

Comments
 (0)