From: Yu Watanabe Date: Fri, 14 May 2021 00:05:20 +0000 (+0900) Subject: json: make JSON_VARIANT_ARRAY/OBJECT_FOREACH() nestable X-Git-Tag: v249-rc1~230^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fec7a9e0ace8da8a7562f821c37f868c78efdb96;p=thirdparty%2Fsystemd.git json: make JSON_VARIANT_ARRAY/OBJECT_FOREACH() nestable --- diff --git a/src/shared/json.h b/src/shared/json.h index 148701a54fe..c679f8f1ab9 100644 --- a/src/shared/json.h +++ b/src/shared/json.h @@ -146,22 +146,26 @@ struct json_variant_foreach_state { size_t idx; }; +#define _JSON_VARIANT_ARRAY_FOREACH(i, v, state) \ + for (struct json_variant_foreach_state state = { (v), 0 }; \ + json_variant_is_array(state.variant) && \ + state.idx < json_variant_elements(state.variant) && \ + ({ i = json_variant_by_index(state.variant, state.idx); \ + true; }); \ + state.idx++) #define JSON_VARIANT_ARRAY_FOREACH(i, v) \ - for (struct json_variant_foreach_state _state = { (v), 0 }; \ - json_variant_is_array(_state.variant) && \ - _state.idx < json_variant_elements(_state.variant) && \ - ({ i = json_variant_by_index(_state.variant, _state.idx); \ + _JSON_VARIANT_ARRAY_FOREACH(i, v, UNIQ_T(state, UNIQ)) + +#define _JSON_VARIANT_OBJECT_FOREACH(k, e, v, state) \ + for (struct json_variant_foreach_state state = { (v), 0 }; \ + json_variant_is_object(state.variant) && \ + state.idx < json_variant_elements(state.variant) && \ + ({ k = json_variant_string(json_variant_by_index(state.variant, state.idx)); \ + e = json_variant_by_index(state.variant, state.idx + 1); \ true; }); \ - _state.idx++) - + state.idx += 2) #define JSON_VARIANT_OBJECT_FOREACH(k, e, v) \ - for (struct json_variant_foreach_state _state = { (v), 0 }; \ - json_variant_is_object(_state.variant) && \ - _state.idx < json_variant_elements(_state.variant) && \ - ({ k = json_variant_string(json_variant_by_index(_state.variant, _state.idx)); \ - e = json_variant_by_index(_state.variant, _state.idx + 1); \ - true; }); \ - _state.idx += 2) + _JSON_VARIANT_OBJECT_FOREACH(k, e, v, UNIQ_T(state, UNIQ)) int json_variant_get_source(JsonVariant *v, const char **ret_source, unsigned *ret_line, unsigned *ret_column);