[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 03:36:13 PDT 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
> 




More information about the Lede-dev mailing list