From 21e2151107712b07e000de79037e786fe7f21482 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 4 Jul 2019 17:56:16 +0200 Subject: [PATCH] json: add new helper json_variant_append_array() --- src/shared/json.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/shared/json.h | 2 ++ 2 files changed, 45 insertions(+) diff --git a/src/shared/json.c b/src/shared/json.c index 7ea13139705..3ccda282cfc 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -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; diff --git a/src/shared/json.h b/src/shared/json.h index e95e3baed1d..c1999a7411b 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -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); -- 2.39.2