From fec7a9e0ace8da8a7562f821c37f868c78efdb96 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 14 May 2021 09:05:20 +0900 Subject: [PATCH] json: make JSON_VARIANT_ARRAY/OBJECT_FOREACH() nestable --- src/shared/json.h | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) 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); -- 2.47.3