On 01/06/2016 22:27, 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.

what software relies on this function/behaviour ? maybe we should mark
the current implementation as deprected and drop support in time X.
producing broken json syntax seems very fragile.

        John

> 
> Signed-off-by: Matthias Schiffer <mschif...@universe-factory.net>
> ---
>  blobmsg_json.c | 49 ++++++++++++++++++++++++++++++++++++-------------
>  blobmsg_json.h | 14 ++++++++++++++
>  2 files changed, 50 insertions(+), 13 deletions(-)
> 
> diff --git a/blobmsg_json.c b/blobmsg_json.c
> index 5713948..538c816 100644
> --- a/blobmsg_json.c
> +++ b/blobmsg_json.c
> @@ -207,7 +207,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];
> @@ -217,7 +217,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);
>       }
> @@ -286,22 +286,26 @@ 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;
>  
> -     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;
> -     }
> +     setup_strbuf(&s, attr, cb, priv, indent);
>  
>       array = blob_is_extended(attr) &&
>               blobmsg_type(attr) == BLOBMSG_TYPE_ARRAY;
> @@ -321,3 +325,22 @@ char *blobmsg_format_json_with_cb(struct blob_attr 
> *attr, bool list, blobmsg_jso
>  
>       return s.buf;
>  }
> +
> +char *blobmsg_format_json_value_with_cb(struct blob_attr *attr, 
> blobmsg_json_format_t cb, void *priv, int indent)
> +{
> +     struct strbuf s;
> +
> +     setup_strbuf(&s, attr, cb, priv, indent);
> +
> +     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;
> +
> +     return s.buf;
> +}
> 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
> 

_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to