FFstrbuf: improve performance of InitF

This commit is contained in:
李通洲
2022-12-06 16:26:51 +08:00
parent 4f0be4f72c
commit 983bd50a09
3 changed files with 25 additions and 5 deletions
+17 -5
View File
@@ -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);
}
+1
View File
@@ -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);
+7
View File
@@ -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);
}