]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: add new helper json_variant_append_array()
authorLennart Poettering <lennart@poettering.net>
Thu, 4 Jul 2019 15:56:16 +0000 (17:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Dec 2019 08:47:00 +0000 (09:47 +0100)
src/shared/json.c
src/shared/json.h

index 7ea131397051c03bbbc7b36906b4a9a74b2c3215..3ccda282cfcdd7c7ea48eee16bb90e3b954df40b 100644 (file)
@@ -1976,6 +1976,49 @@ int json_variant_merge(JsonVariant **v, JsonVariant *m) {
         return 1;
 }
 
+int json_variant_append_array(JsonVariant **v, JsonVariant *element) {
+        _cleanup_(json_variant_unrefp) JsonVariant *nv = NULL;
+        bool blank;
+        int r;
+
+        assert(v);
+        assert(element);
+
+
+        if (!*v || json_variant_is_null(*v))
+                blank = true;
+        else if (!json_variant_is_array(*v))
+                return -EINVAL;
+        else
+                blank = json_variant_elements(*v) == 0;
+
+        if (blank)
+                r = json_variant_new_array(&nv, (JsonVariant*[]) { element }, 1);
+        else {
+                _cleanup_free_ JsonVariant **array = NULL;
+                size_t i;
+
+                array = new(JsonVariant*, json_variant_elements(*v) + 1);
+                if (!array)
+                        return -ENOMEM;
+
+                for (i = 0; i < json_variant_elements(*v); i++)
+                        array[i] = json_variant_by_index(*v, i);
+
+                array[i] = element;
+
+                r = json_variant_new_array(&nv, array, i + 1);
+        }
+
+        if (r < 0)
+                return r;
+
+        json_variant_unref(*v);
+        *v = TAKE_PTR(nv);
+
+        return 0;
+}
+
 int json_variant_strv(JsonVariant *v, char ***ret) {
         char **l = NULL;
         size_t n, i;
index e95e3baed1dbb2047a96052ec3945407aa4ccbb0..c1999a7411bf2383f201c44de053413dd65df154 100644 (file)
@@ -179,6 +179,8 @@ int json_variant_set_field(JsonVariant **v, const char *field, JsonVariant *valu
 int json_variant_set_field_string(JsonVariant **v, const char *field, const char *value);
 int json_variant_set_field_unsigned(JsonVariant **v, const char *field, uintmax_t value);
 
+int json_variant_append_array(JsonVariant **v, JsonVariant *element);
+
 int json_variant_merge(JsonVariant **v, JsonVariant *m);
 
 int json_variant_strv(JsonVariant *v, char ***ret);