]> granicus.if.org Git - jq/commitdiff
jv_string_fmt (create printf-formatted JSON strings)
authorStephen Dolan <mu@netsoc.tcd.ie>
Mon, 10 Sep 2012 15:01:56 +0000 (16:01 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Mon, 10 Sep 2012 15:01:56 +0000 (16:01 +0100)
c/Makefile
c/jv.c
c/jv.h
c/jv_test.c

index cad23302bf50a6c88eb8a3a700a9734c316e7ea7..c80642dc1ae075d0103e719063a6c293e94a2e93 100644 (file)
@@ -27,7 +27,7 @@ parsertest: parser.tab.c lexer.yy.c main.c opcode.c bytecode.c compile.c execute
 jq: parser.tab.c lexer.yy.c main.c opcode.c bytecode.c compile.c execute.c builtin.c jv.c jv_parse.c jv_print.c jv_dtoa.c jv_unicode.c
        $(CC) -DJQ_DEBUG=0 -o $@ $^
 
-jv_test: jv_test.c jv.c jv_print.c jv_dtoa.c
+jv_test: jv_test.c jv.c jv_print.c jv_dtoa.c jv_unicode.c
        $(CC) -DNO_JANSSON -o $@ $^
 
 jv_parse: jv_parse.c jv.c jv_print.c jv_dtoa.c
diff --git a/c/jv.c b/c/jv.c
index 53e2ef7d86fb5556c15e1fe8f843de21146d793e..73805a0a3c8ea43c39af54ae8581c2f548a5fbf2 100644 (file)
--- a/c/jv.c
+++ b/c/jv.c
@@ -4,6 +4,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdarg.h>
 
 #include "jv.h"
 
@@ -81,8 +82,8 @@ jv jv_invalid() {
   return jv_invalid_with_msg(jv_null());
 }
 
-jv jv_invalid_get_message(jv inv) {
-  jv x = ((jvp_invalid*)inv.val.complex.ptr)->errmsg;
+jv jv_invalid_get_msg(jv inv) {
+  jv x = jv_copy(((jvp_invalid*)inv.val.complex.ptr)->errmsg);
   jv_free(inv);
   return x;
 }
@@ -472,6 +473,25 @@ const char* jv_string_value(jv j) {
   return jvp_string_ptr(&j.val.complex)->data;
 }
 
+jv jv_string_fmt(const char* fmt, ...) {
+  int size = 1024;
+  while (1) {
+    char* buf = malloc(size);
+    va_list args;
+    va_start(args, fmt);
+    int n = vsnprintf(buf, size, fmt, args);
+    va_end(args);
+    if (n < size) {
+      jv ret = jv_string_sized(buf, n);
+      free(buf);
+      return ret;
+    } else {
+      free(buf);
+      size = n * 2;
+    }
+  }
+}
+
 /*
  * Objects (internal helpers)
  */
diff --git a/c/jv.h b/c/jv.h
index a3a5e79496323c12e8af6f6104193208157d690f..c415ee28f14694f1bfb606fff9045e16ac083b71 100644 (file)
--- a/c/jv.h
+++ b/c/jv.h
@@ -75,6 +75,7 @@ jv jv_string_sized(const char*, int);
 int jv_string_length(jv);
 uint32_t jv_string_hash(jv);
 const char* jv_string_value(jv);
+jv jv_string_fmt(const char*, ...);
 
 jv jv_object();
 jv jv_object_get(jv object, jv key);
index 2b5a6276cced9e8996577aecdf7d1e4a1fa6d649..725e5abafc384f2b05771a841ef18b974c901c9f 100644 (file)
@@ -108,6 +108,15 @@ int main(){
     jv_free(a1);
     jv_free(a2);
     jv_free(b);
+
+    assert(jv_equal(jv_string("hello42!"), jv_string_fmt("hello%d%s", 42, "!")));
+    char big[20000];
+    for (int i=0; i<sizeof(big); i++) big[i] = 'a';
+    big[sizeof(big)-1] = 0;
+    jv str = jv_string_fmt("%s", big);
+    assert(jv_string_length(jv_copy(str)) == sizeof(big) - 1);
+    assert(!strcmp(big, jv_string_value(str)));
+    jv_free(str);
   }
 
   /// Objects