diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index b86a7454c..27150ef24 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -26,14 +26,23 @@ void ffStrbufInitF(FFstrbuf* strbuf, const char* format, ...) { assert(format != NULL); - ffStrbufInit(strbuf); - va_list arguments; va_start(arguments, format); - ffStrbufAppendVF(strbuf, format, arguments); + ffStrbufInitVF(strbuf, format, arguments); va_end(arguments); } +void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments) +{ + assert(format != NULL); + + int len = vasprintf(&strbuf->chars, format, arguments); + assert(len >= 0); + + strbuf->allocated = (uint32_t)(len + 1); + strbuf->length = (uint32_t)len; +} + uint32_t ffStrbufGetFree(const FFstrbuf* strbuf) { assert(strbuf != NULL); @@ -168,10 +177,13 @@ void ffStrbufSetF(FFstrbuf* strbuf, const char* format, ...) { assert(format != NULL); - ffStrbufClear(strbuf); - va_list arguments; va_start(arguments, format); + + if(strbuf->allocated == 0) + return ffStrbufInitVF(strbuf, format, arguments); + + ffStrbufClear(strbuf); ffStrbufAppendVF(strbuf, format, arguments); va_end(arguments); } diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index 80503e55d..8116311da 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -32,6 +32,7 @@ typedef struct FFstrbuf void ffStrbufInitA(FFstrbuf* strbuf, uint32_t allocate); void ffStrbufInitCopy(FFstrbuf* strbuf, const FFstrbuf* src); void ffStrbufInitF(FFstrbuf* strbuf, const char* format, ...); +void ffStrbufInitVF(FFstrbuf* strbuf, const char* format, va_list arguments); void ffStrbufEnsureFree(FFstrbuf* strbuf, uint32_t free); diff --git a/tests/strbuf.c b/tests/strbuf.c index 5474d313e..c02d31510 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -199,6 +199,13 @@ int main(int argc, char** argv) ffStrbufDestroy(&strbuf); + //initF + ffStrbufInitF(&strbuf, "%s", "1234567890123456789012345678901"); + VERIFY(strbuf.allocated == 32); + VERIFY(ffStrbufEqualS(&strbuf, "1234567890123456789012345678901")); + + ffStrbufDestroy(&strbuf); + //Success puts("\033[32mAll tests passed!"FASTFETCH_TEXT_MODIFIER_RESET); }