]> granicus.if.org Git - jq/commitdiff
Make the '+' operator merge objects.
authorStephen Dolan <mu@netsoc.tcd.ie>
Sun, 9 Sep 2012 18:17:07 +0000 (19:17 +0100)
committerStephen Dolan <mu@netsoc.tcd.ie>
Sun, 9 Sep 2012 18:17:07 +0000 (19:17 +0100)
c/builtin.c
c/jv.c
c/jv.h
c/testdata

index 35e15471749083a6cd0849da58ee3a8a65a9cadb..26698680a0bc64ab27fda62a567d8d14eb3eaf16 100644 (file)
@@ -24,6 +24,8 @@ static void f_plus(jv input[], jv output[]) {
                           jv_number_value(b));
   } else if (jv_get_kind(a) == JV_KIND_ARRAY && jv_get_kind(b) == JV_KIND_ARRAY) {
     output[0] = jv_array_concat(a, b);
+  } else if (jv_get_kind(a) == JV_KIND_OBJECT && jv_get_kind(b) == JV_KIND_OBJECT) {
+    output[0] = jv_object_merge(a, b);
   } else {
     output[0] = jv_string("wtf gaize");
     jv_free(a);
diff --git a/c/jv.c b/c/jv.c
index 1d5c98166e63dea32ae178b9568a6a498457929e..762bad891bf2a10d99d87b46377dd30a68ca7ff2 100644 (file)
--- a/c/jv.c
+++ b/c/jv.c
@@ -729,6 +729,16 @@ int jv_object_length(jv object) {
   return n;
 }
 
+jv jv_object_merge(jv a, jv b) {
+  assert(jv_get_kind(a) == JV_KIND_OBJECT);
+  jv_object_foreach(i, b) {
+    a = jv_object_set(a, 
+                      jv_object_iter_key(b, i),
+                      jv_object_iter_value(b, i));
+  }
+  return a;
+}
+
 /*
  * Object iteration (internal helpers)
  */
diff --git a/c/jv.h b/c/jv.h
index 6872ec5c7ae3ed0121643d6d21681a9aaa76a716..2ec1862986f95a77854652d968ae5e39cfbe96c9 100644 (file)
--- a/c/jv.h
+++ b/c/jv.h
@@ -78,12 +78,18 @@ jv jv_object_get(jv object, jv key);
 jv jv_object_set(jv object, jv key, jv value);
 jv jv_object_delete(jv object, jv key);
 int jv_object_length(jv object);
+jv jv_object_merge(jv, jv);
 
 int jv_object_iter(jv);
 int jv_object_iter_next(jv, int);
 int jv_object_iter_valid(jv, int);
 jv jv_object_iter_key(jv, int);
 jv jv_object_iter_value(jv, int);
+#define jv_object_foreach(i,t) \
+  for (int i = jv_object_iter(t);               \
+       jv_object_iter_valid(t, i);              \
+       i = jv_object_iter_next(t, i))           \
 
 
 int jv_get_refcnt(jv);
index 5aa3efeda700e86511cc2acece1b58ca65172852..f80249e465def275dc54d2ccd94a06f370c390b4 100644 (file)
@@ -155,6 +155,10 @@ null
 null
 [1,2,3,null]
 
+{"a":1} + {"b":2} + {"c":3}
+"asdfasdf"
+{"a":1, "b":2, "c":3}
+
 #
 # User-defined functions
 # Oh god.