diff --git a/jv.c b/jv.c index 999c776b..b66b0738 100644 --- a/jv.c +++ b/jv.c @@ -774,14 +774,14 @@ jv jv_string_append_str(jv a, const char* str) { return jv_string_append_buf(a, str, strlen(str)); } -jv jv_string_fmt(const char* fmt, ...) { +jv jv_string_vfmt(const char* fmt, va_list ap) { int size = 1024; while (1) { char* buf = jv_mem_alloc(size); - va_list args; - va_start(args, fmt); - int n = vsnprintf(buf, size, fmt, args); - va_end(args); + va_list ap2; + va_copy(ap2, ap); + int n = vsnprintf(buf, size, fmt, ap2); + va_end(ap2); if (n < size) { jv ret = jv_string_sized(buf, n); jv_mem_free(buf); @@ -793,6 +793,14 @@ jv jv_string_fmt(const char* fmt, ...) { } } +jv jv_string_fmt(const char* fmt, ...) { + va_list args; + va_start(args, fmt); + jv res = jv_string_vfmt(fmt, args); + va_end(args); + return res; +} + /* * Objects (internal helpers) */ diff --git a/jv.h b/jv.h index 92d0e058..6b06eea3 100644 --- a/jv.h +++ b/jv.h @@ -1,6 +1,7 @@ #ifndef JV_H #define JV_H +#include #include typedef enum { @@ -84,6 +85,7 @@ unsigned long jv_string_hash(jv); const char* jv_string_value(jv); jv jv_string_slice(jv j, int start, int end); jv jv_string_concat(jv, jv); +jv jv_string_vfmt(const char*, va_list); jv jv_string_fmt(const char*, ...); jv jv_string_append_codepoint(jv a, uint32_t c); jv jv_string_append_buf(jv a, const char* buf, int len);