[OpenWrt-Devel] [LEDE-DEV] [PATCH libubox 3/3] blobmsg_json: add new functions blobmsg_format_json_value*
Jo-Philipp Wich
jo at mein.io
Tue Jun 21 06:36:13 EDT 2016
On 06/20/2016 09:59 AM, Matthias Schiffer wrote:
> The current blobmsg_format_json* functions will return invalid JSON when
> the "list" argument is given as false (blobmsg_format_element() will
> output the name of the blob_attr as if the value is printed as part of a
> JSON object).
>
> To avoid breaking software relying on this behaviour, introduce new
> functions which will never print the blob_attr name and thus always
> produce valid JSON.
>
> Signed-off-by: Matthias Schiffer <mschiffer at universe-factory.net>
Acked-by: Jo-Philipp Wich <jo at mein.io>
> ---
> blobmsg_json.c | 61 ++++++++++++++++++++++++++++++++++++++++++++--------------
> blobmsg_json.h | 14 ++++++++++++++
> 2 files changed, 61 insertions(+), 14 deletions(-)
>
> diff --git a/blobmsg_json.c b/blobmsg_json.c
> index 33f3969..115d575 100644
> --- a/blobmsg_json.c
> +++ b/blobmsg_json.c
> @@ -210,7 +210,7 @@ static void blobmsg_format_string(struct strbuf *s, const char *str)
>
> static void blobmsg_format_json_list(struct strbuf *s, struct blob_attr *attr, int len, bool array);
>
> -static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, bool array, bool head)
> +static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, bool without_name, bool head)
> {
> const char *data_str;
> char buf[32];
> @@ -220,7 +220,7 @@ static void blobmsg_format_element(struct strbuf *s, struct blob_attr *attr, boo
> if (!blobmsg_check_attr(attr, false))
> return;
>
> - if (!array && blobmsg_name(attr)[0]) {
> + if (!without_name && blobmsg_name(attr)[0]) {
> blobmsg_format_string(s, blobmsg_name(attr));
> blobmsg_puts(s, ": ", s->indent ? 2 : 1);
> }
> @@ -289,27 +289,30 @@ static void blobmsg_format_json_list(struct strbuf *s, struct blob_attr *attr, i
> blobmsg_puts(s, (array ? "]" : "}"), 1);
> }
>
> +static void setup_strbuf(struct strbuf *s, struct blob_attr *attr, blobmsg_json_format_t cb, void *priv, int indent) {
> + s->len = blob_len(attr);
> + s->buf = malloc(s->len);
> + s->pos = 0;
> + s->custom_format = cb;
> + s->priv = priv;
> + s->indent = false;
> +
> + if (indent >= 0) {
> + s->indent = true;
> + s->indent_level = indent;
> + }
> +}
> +
> char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_json_format_t cb, void *priv, int indent)
> {
> struct strbuf s;
> bool array;
> char *ret;
>
> - s.len = blob_len(attr);
> - s.pos = 0;
> - s.custom_format = cb;
> - s.priv = priv;
> - s.indent = false;
> -
> - s.buf = malloc(s.len);
> + setup_strbuf(&s, attr, cb, priv, indent);
> if (!s.buf)
> return NULL;
>
> - if (indent >= 0) {
> - s.indent = true;
> - s.indent_level = indent;
> - }
> -
> array = blob_is_extended(attr) &&
> blobmsg_type(attr) == BLOBMSG_TYPE_ARRAY;
>
> @@ -333,3 +336,33 @@ char *blobmsg_format_json_with_cb(struct blob_attr *attr, bool list, blobmsg_jso
>
> return ret;
> }
> +
> +char *blobmsg_format_json_value_with_cb(struct blob_attr *attr, blobmsg_json_format_t cb, void *priv, int indent)
> +{
> + struct strbuf s;
> + char *ret;
> +
> + setup_strbuf(&s, attr, cb, priv, indent);
> + if (!s.buf)
> + return NULL;
> +
> + blobmsg_format_element(&s, attr, true, false);
> +
> + if (!s.len) {
> + free(s.buf);
> + return NULL;
> + }
> +
> + s.buf = realloc(s.buf, s.pos + 1);
> + s.buf[s.pos] = 0;
> +
> + ret = realloc(s.buf, s.pos + 1);
> + if (!ret) {
> + free(s.buf);
> + return NULL;
> + }
> +
> + ret[s.pos] = 0;
> +
> + return ret;
> +}
> diff --git a/blobmsg_json.h b/blobmsg_json.h
> index cd9ed33..9dfc02d 100644
> --- a/blobmsg_json.h
> +++ b/blobmsg_json.h
> @@ -42,4 +42,18 @@ static inline char *blobmsg_format_json_indent(struct blob_attr *attr, bool list
> return blobmsg_format_json_with_cb(attr, list, NULL, NULL, indent);
> }
>
> +char *blobmsg_format_json_value_with_cb(struct blob_attr *attr,
> + blobmsg_json_format_t cb, void *priv,
> + int indent);
> +
> +static inline char *blobmsg_format_json_value(struct blob_attr *attr)
> +{
> + return blobmsg_format_json_value_with_cb(attr, NULL, NULL, -1);
> +}
> +
> +static inline char *blobmsg_format_json_value_indent(struct blob_attr *attr, int indent)
> +{
> + return blobmsg_format_json_value_with_cb(attr, NULL, NULL, indent);
> +}
> +
> #endif
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list