From 0e2552e84a621fdb70c4c91258224b8e515869ab Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 3 Nov 2020 13:27:16 -0500 Subject: dstring: New dstrvprintf() function --- dstring.c | 24 +++++++++++++++--------- dstring.h | 13 +++++++++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/dstring.c b/dstring.c index bfcf9bd..2ec0d72 100644 --- a/dstring.c +++ b/dstring.c @@ -129,6 +129,16 @@ int dstrapp(char **str, char c) { } char *dstrprintf(const char *format, ...) { + va_list args; + + va_start(args, format); + char *str = dstrvprintf(format, args); + va_end(args); + + return str; +} + +char *dstrvprintf(const char *format, va_list args) { // Guess a length to try to avoid calling vsnprintf() twice int len, cap = 2*strlen(format); char *str = dstralloc(cap); @@ -136,26 +146,22 @@ char *dstrprintf(const char *format, ...) { return NULL; } - va_list args; + va_list args2; + va_copy(args2, args); - va_start(args, format); len = vsnprintf(str, cap + 1, format, args); - va_end(args); - if (len > cap) { if (dstreserve(&str, len) != 0) { goto fail; } cap = len; - - va_start(args, format); - len = vsnprintf(str, cap + 1, format, args); - va_end(args); - + len = vsnprintf(str, cap + 1, format, args2); assert(len == cap); } + va_end(args2); + if (len < 0) { goto fail; } diff --git a/dstring.h b/dstring.h index 19fd6d7..b556313 100644 --- a/dstring.h +++ b/dstring.h @@ -22,6 +22,7 @@ #define BFS_DSTRING_H #include "util.h" +#include #include /** @@ -129,6 +130,18 @@ int dstrapp(char **str, char c); BFS_FORMATTER(1, 2) char *dstrprintf(const char *format, ...); +/** + * Create a dynamic string from a format string and a va_list. + * + * @param format + * The format string to fill in. + * @param args + * The arguments for the format string. + * @return + * The created string, or NULL on failure. + */ +char *dstrvprintf(const char *format, va_list args); + /** * Free a dynamic string. * -- cgit v1.2.3