From a05b8b0f7bf4550b934f309131bff0b75ea082b8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 16 Sep 2024 12:37:03 +0200 Subject: [PATCH] json: move utils to separate file The core json functions are in json.h and the more highlevel functions building on them are in json-utils.h --- spa/include/spa/utils/json-utils.h | 170 +++++++++++++++++++++++++++++ spa/include/spa/utils/json.h | 121 +------------------- 2 files changed, 172 insertions(+), 119 deletions(-) create mode 100644 spa/include/spa/utils/json-utils.h diff --git a/spa/include/spa/utils/json-utils.h b/spa/include/spa/utils/json-utils.h new file mode 100644 index 000000000..f09840d4e --- /dev/null +++ b/spa/include/spa/utils/json-utils.h @@ -0,0 +1,170 @@ +/* Simple Plugin API */ +/* SPDX-FileCopyrightText: Copyright © 2020 Wim Taymans */ +/* SPDX-License-Identifier: MIT */ + +#ifndef SPA_UTILS_JSON_UTILS_H +#define SPA_UTILS_JSON_UTILS_H + +#ifdef __cplusplus +extern "C" { +#else +#include +#endif +#include +#include +#include +#include +#include +#include + +#include + +/** \defgroup spa_json_utils JSON Utils + * Relaxed JSON variant parsing Utils + */ + +/** + * \addtogroup spa_json + * \{ + */ + +static inline int spa_json_begin(struct spa_json * iter, const char *data, size_t size, const char **val) +{ + spa_json_init(iter, data, size); + return spa_json_next(iter, val); +} + +/* float */ +static inline int spa_json_get_float(struct spa_json *iter, float *res) +{ + const char *value; + int len; + if ((len = spa_json_next(iter, &value)) <= 0) + return len; + return spa_json_parse_float(value, len, res); +} + +/* int */ +static inline int spa_json_get_int(struct spa_json *iter, int *res) +{ + const char *value; + int len; + if ((len = spa_json_next(iter, &value)) <= 0) + return len; + return spa_json_parse_int(value, len, res); +} + +/* bool */ +static inline int spa_json_get_bool(struct spa_json *iter, bool *res) +{ + const char *value; + int len; + if ((len = spa_json_next(iter, &value)) <= 0) + return len; + return spa_json_parse_bool(value, len, res); +} + +/* string */ +static inline int spa_json_get_string(struct spa_json *iter, char *res, int maxlen) +{ + const char *value; + int len; + if ((len = spa_json_next(iter, &value)) <= 0) + return len; + return spa_json_parse_stringn(value, len, res, maxlen); +} + + +static inline int spa_json_enter_container(struct spa_json *iter, struct spa_json *sub, char type) +{ + const char *value; + int len; + if ((len = spa_json_next(iter, &value)) <= 0) + return len; + if (!spa_json_is_container(value, len)) + return -EPROTO; + if (*value != type) + return -EINVAL; + spa_json_enter(iter, sub); + return 1; +} + +static inline int spa_json_begin_container(struct spa_json * iter, + const char *data, size_t size, char type, bool relax) +{ + int res; + spa_json_init(iter, data, size); + res = spa_json_enter_container(iter, iter, type); + if (res == -EPROTO && relax) + spa_json_init(iter, data, size); + else if (res <= 0) + return res; + return 1; +} +/** + * Return length of container at current position, starting at \a value. + * + * \return Length of container including {} or [], or 0 on error. + */ +static inline int spa_json_container_len(struct spa_json *iter, const char *value, int len SPA_UNUSED) +{ + const char *val; + struct spa_json sub; + int res; + spa_json_enter(iter, &sub); + while ((res = spa_json_next(&sub, &val)) > 0); + if (res < 0) + return 0; + return sub.cur + 1 - value; +} + +/* object */ +static inline int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub) +{ + return spa_json_enter_container(iter, sub, '{'); +} +static inline int spa_json_begin_object_relax(struct spa_json * iter, const char *data, size_t size) +{ + return spa_json_begin_container(iter, data, size, '{', true); +} +static inline int spa_json_begin_object(struct spa_json * iter, const char *data, size_t size) +{ + return spa_json_begin_container(iter, data, size, '{', false); +} + +static inline int spa_json_object_next(struct spa_json *iter, char *key, int maxkeylen, const char **value) +{ + int res1, res2; + while (true) { + res1 = spa_json_get_string(iter, key, maxkeylen); + if (res1 <= 0 && res1 != -ENOSPC) + return res1; + res2 = spa_json_next(iter, value); + if (res2 <= 0 || res1 != -ENOSPC) + return res2; + } +} + +/* array */ +static inline int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub) +{ + return spa_json_enter_container(iter, sub, '['); +} +static inline int spa_json_begin_array_relax(struct spa_json * iter, const char *data, size_t size) +{ + return spa_json_begin_container(iter, data, size, '[', true); +} +static inline int spa_json_begin_array(struct spa_json * iter, const char *data, size_t size) +{ + return spa_json_begin_container(iter, data, size, '[', false); +} + +/** + * \} + */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* SPA_UTILS_JSON_UTILS_H */ diff --git a/spa/include/spa/utils/json.h b/spa/include/spa/utils/json.h index b9ecbc53f..4d5f73e92 100644 --- a/spa/include/spa/utils/json.h +++ b/spa/include/spa/utils/json.h @@ -308,7 +308,7 @@ error: } /** - * Return it there was a parse error, and its possible location. + * Return if there was a parse error, and its possible location. * * \since 1.1.0 */ @@ -358,95 +358,22 @@ static inline bool spa_json_get_error(struct spa_json *iter, const char *start, return true; } -static inline int spa_json_begin(struct spa_json * iter, const char *data, size_t size, const char **val) -{ - spa_json_init(iter, data, size); - return spa_json_next(iter, val); -} - static inline int spa_json_is_container(const char *val, int len) { return len > 0 && (*val == '{' || *val == '['); } -static inline int spa_json_enter_container(struct spa_json *iter, struct spa_json *sub, char type) -{ - const char *value; - int len; - if ((len = spa_json_next(iter, &value)) <= 0) - return len; - if (!spa_json_is_container(value, len)) - return -EPROTO; - if (*value != type) - return -EINVAL; - spa_json_enter(iter, sub); - return 1; -} - -static inline int spa_json_begin_container(struct spa_json * iter, - const char *data, size_t size, char type, bool relax) -{ - int res; - spa_json_init(iter, data, size); - res = spa_json_enter_container(iter, iter, type); - if (res == -EPROTO && relax) - spa_json_init(iter, data, size); - else if (res <= 0) - return res; - return 1; -} -/** - * Return length of container at current position, starting at \a value. - * - * \return Length of container including {} or [], or 0 on error. - */ -static inline int spa_json_container_len(struct spa_json *iter, const char *value, int len SPA_UNUSED) -{ - const char *val; - struct spa_json sub; - int res; - spa_json_enter(iter, &sub); - while ((res = spa_json_next(&sub, &val)) > 0); - if (res < 0) - return 0; - return sub.cur + 1 - value; -} - /* object */ static inline int spa_json_is_object(const char *val, int len) { return len > 0 && *val == '{'; } -static inline int spa_json_enter_object(struct spa_json *iter, struct spa_json *sub) -{ - return spa_json_enter_container(iter, sub, '{'); -} -static inline int spa_json_begin_object_relax(struct spa_json * iter, const char *data, size_t size) -{ - return spa_json_begin_container(iter, data, size, '{', true); -} -static inline int spa_json_begin_object(struct spa_json * iter, const char *data, size_t size) -{ - return spa_json_begin_container(iter, data, size, '{', false); -} /* array */ static inline bool spa_json_is_array(const char *val, int len) { return len > 0 && *val == '['; } -static inline int spa_json_enter_array(struct spa_json *iter, struct spa_json *sub) -{ - return spa_json_enter_container(iter, sub, '['); -} -static inline int spa_json_begin_array_relax(struct spa_json * iter, const char *data, size_t size) -{ - return spa_json_begin_container(iter, data, size, '[', true); -} -static inline int spa_json_begin_array(struct spa_json * iter, const char *data, size_t size) -{ - return spa_json_begin_container(iter, data, size, '[', false); -} /* null */ static inline bool spa_json_is_null(const char *val, int len) @@ -483,14 +410,6 @@ static inline bool spa_json_is_float(const char *val, int len) float dummy; return spa_json_parse_float(val, len, &dummy); } -static inline int spa_json_get_float(struct spa_json *iter, float *res) -{ - const char *value; - int len; - if ((len = spa_json_next(iter, &value)) <= 0) - return len; - return spa_json_parse_float(value, len, res); -} static inline char *spa_json_format_float(char *str, int size, float val) { @@ -525,14 +444,6 @@ static inline bool spa_json_is_int(const char *val, int len) int dummy; return spa_json_parse_int(val, len, &dummy); } -static inline int spa_json_get_int(struct spa_json *iter, int *res) -{ - const char *value; - int len; - if ((len = spa_json_next(iter, &value)) <= 0) - return len; - return spa_json_parse_int(value, len, res); -} /* bool */ static inline bool spa_json_is_true(const char *val, int len) @@ -558,14 +469,6 @@ static inline int spa_json_parse_bool(const char *val, int len, bool *result) return 1; return -1; } -static inline int spa_json_get_bool(struct spa_json *iter, bool *res) -{ - const char *value; - int len; - if ((len = spa_json_next(iter, &value)) <= 0) - return len; - return spa_json_parse_bool(value, len, res); -} /* string */ static inline bool spa_json_is_string(const char *val, int len) @@ -660,15 +563,6 @@ static inline int spa_json_parse_string(const char *val, int len, char *result) return spa_json_parse_stringn(val, len, result, len+1); } -static inline int spa_json_get_string(struct spa_json *iter, char *res, int maxlen) -{ - const char *value; - int len; - if ((len = spa_json_next(iter, &value)) <= 0) - return len; - return spa_json_parse_stringn(value, len, res, maxlen); -} - static inline int spa_json_encode_string(char *str, int size, const char *val) { int len = 0; @@ -714,18 +608,7 @@ static inline int spa_json_encode_string(char *str, int size, const char *val) return len-1; } -static inline int spa_json_object_next(struct spa_json *iter, char *key, int maxkeylen, const char **value) -{ - int res1, res2; - while (true) { - res1 = spa_json_get_string(iter, key, maxkeylen); - if (res1 <= 0 && res1 != -ENOSPC) - return res1; - res2 = spa_json_next(iter, value); - if (res2 <= 0 || res1 != -ENOSPC) - return res2; - } -} +#include /** * \}