FFstrbuf: fix bug of AppendF when string len == ffStrbufGetFree

This commit is contained in:
李通洲
2022-12-02 22:20:01 +08:00
parent 2a8235ae38
commit 8b0d034a94
2 changed files with 34 additions and 17 deletions
+7 -10
View File
@@ -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
View File
@@ -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);