]> granicus.if.org Git - jq/commitdiff
Add jv_string_vfmt()
authorNicolas Williams <nico@cryptonector.com>
Thu, 5 Dec 2013 00:14:10 +0000 (18:14 -0600)
committerNicolas Williams <nico@cryptonector.com>
Thu, 5 Dec 2013 00:21:41 +0000 (18:21 -0600)
jv.c
jv.h

diff --git a/jv.c b/jv.c
index 999c776b72e30c14f51732d4656436b596dad263..b66b073820c781f9f9bbb1c56d1838ef0b264df1 100644 (file)
--- 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 92d0e05884e55d3677ab3359ee96e38e3a48c389..6b06eea32a1390766a8face4e8df6524002e7b5f 100644 (file)
--- a/jv.h
+++ b/jv.h
@@ -1,6 +1,7 @@
 #ifndef JV_H
 #define JV_H
 
+#include <stdarg.h>
 #include <stdint.h>
 
 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);