mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
FFstrbuf: fix bug of AppendF when string len == ffStrbufGetFree
This commit is contained in:
+7
-10
@@ -138,21 +138,18 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments)
|
||||
va_copy(copy, arguments);
|
||||
|
||||
uint32_t free = ffStrbufGetFree(strbuf);
|
||||
uint32_t written = (uint32_t) vsnprintf(strbuf->chars + strbuf->length, free, format, arguments);
|
||||
int written = vsnprintf(strbuf->chars + strbuf->length, strbuf->allocated > 0 ? free + 1 : 0, format, arguments);
|
||||
|
||||
if(strbuf->length + written > free)
|
||||
if(written > 0 && strbuf->length + (uint32_t) written > free)
|
||||
{
|
||||
ffStrbufEnsureFree(strbuf, written);
|
||||
written = (uint32_t) vsnprintf(strbuf->chars + strbuf->length, ffStrbufGetFree(strbuf), format, copy);
|
||||
ffStrbufEnsureFree(strbuf, (uint32_t) written);
|
||||
written = vsnprintf(strbuf->chars + strbuf->length, (uint32_t) written + 1, format, copy);
|
||||
}
|
||||
|
||||
va_end(copy);
|
||||
|
||||
if(written == 0)
|
||||
return;
|
||||
|
||||
strbuf->length += written;
|
||||
strbuf->chars[strbuf->length] = '\0';
|
||||
if(written > 0)
|
||||
strbuf->length += (uint32_t) written;
|
||||
}
|
||||
|
||||
void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until)
|
||||
@@ -438,5 +435,5 @@ void ffStrbufDestroy(FFstrbuf* strbuf)
|
||||
//Avoid free-after-use. These 3 assignments are cheap so don't remove them
|
||||
strbuf->allocated = strbuf->length = 0;
|
||||
free(strbuf->chars);
|
||||
strbuf->chars = NULL;
|
||||
strbuf->chars = CHAR_NULL_PTR;
|
||||
}
|
||||
|
||||
+27
-7
@@ -63,7 +63,7 @@ int main(int argc, char** argv)
|
||||
|
||||
VERIFY(strbuf.length == 5);
|
||||
VERIFY(strbuf.allocated >= 6);
|
||||
VERIFY(ffStrbufCompS(&strbuf, "12345") == 0);
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "12345"));
|
||||
|
||||
//appendNS
|
||||
|
||||
@@ -72,7 +72,7 @@ int main(int argc, char** argv)
|
||||
|
||||
VERIFY(strbuf.length == 9);
|
||||
VERIFY(strbuf.allocated >= 10);
|
||||
VERIFY(ffStrbufCompS(&strbuf, "123456789") == 0);
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "123456789"));
|
||||
|
||||
//appendS long
|
||||
|
||||
@@ -87,7 +87,7 @@ int main(int argc, char** argv)
|
||||
VERIFY(strbuf.length == 9);
|
||||
VERIFY(strbuf.allocated >= 110);
|
||||
VERIFY(strbuf.chars[strbuf.length] == 0);
|
||||
VERIFY(ffStrbufCompS(&strbuf, "123456789") == 0);
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "123456789"));
|
||||
|
||||
//startsWithC
|
||||
|
||||
@@ -166,10 +166,16 @@ int main(int argc, char** argv)
|
||||
VERIFY(!ffStrbufEndsWithIgnCaseS(&strbuf, "0aBcDeFg"));
|
||||
|
||||
//ensure
|
||||
ffStrbufEnsureEndsWithC(&strbuf, '^');
|
||||
VERIFY(ffStrbufCompS(&strbuf, "^aBcDeFg"));
|
||||
ffStrbufEnsureEndsWithC(&strbuf, '$');
|
||||
VERIFY(ffStrbufCompS(&strbuf, "^aBcDeFg$"));
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG$"));
|
||||
ffStrbufEnsureEndsWithC(&strbuf, '$');
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "AbCdEfG$"));
|
||||
|
||||
//clear
|
||||
ffStrbufClear(&strbuf);
|
||||
VERIFY(strbuf.allocated > 0);
|
||||
VERIFY(strbuf.length == 0);
|
||||
VERIFY(strbuf.chars && strbuf.chars[0] == 0);
|
||||
|
||||
//Destroy
|
||||
|
||||
@@ -177,7 +183,21 @@ int main(int argc, char** argv)
|
||||
|
||||
VERIFY(strbuf.allocated == 0);
|
||||
VERIFY(strbuf.length == 0);
|
||||
VERIFY(strbuf.chars == NULL);
|
||||
VERIFY(strbuf.chars && strbuf.chars[0] == 0);
|
||||
|
||||
//initA
|
||||
ffStrbufInitA(&strbuf, 32);
|
||||
|
||||
VERIFY(strbuf.allocated == 32);
|
||||
VERIFY(strbuf.length == 0);
|
||||
VERIFY(strbuf.chars && strbuf.chars[0] == 0);
|
||||
|
||||
//appendF
|
||||
ffStrbufAppendF(&strbuf, "%s", "1234567890123456789012345678901");
|
||||
VERIFY(strbuf.allocated == 32);
|
||||
VERIFY(ffStrbufEqualS(&strbuf, "1234567890123456789012345678901"));
|
||||
|
||||
ffStrbufDestroy(&strbuf);
|
||||
|
||||
//Success
|
||||
puts("\033[32mAll tests passed!"FASTFETCH_TEXT_MODIFIER_RESET);
|
||||
|
||||
Reference in New Issue
Block a user