]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: make JSON_VARIANT_ARRAY/OBJECT_FOREACH() nestable
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 May 2021 00:05:20 +0000 (09:05 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 May 2021 00:18:29 +0000 (09:18 +0900)
src/shared/json.h

index 148701a54fed71ba4faf834bda77971da477764f..c679f8f1ab9c655320823aa20d71323a63f16c1a 100644 (file)
@@ -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);