netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: Roopa Prabhu <roopa@cumulusnetworks.com>
Cc: netdev@vger.kernel.org, anuradhak@cumulusnetworks.com,
	nikolay@cumulusnetworks.com, julien@cumulusnetworks.com
Subject: Re: [PATCH iproute2 net-next 1/5] json_writer: allow base json data type to be array or object
Date: Tue, 31 May 2016 11:56:43 -0700	[thread overview]
Message-ID: <20160531115643.3682df90@xeon-e3> (raw)
In-Reply-To: <1464410236-65044-2-git-send-email-roopa@cumulusnetworks.com>

On Fri, 27 May 2016 21:37:12 -0700
Roopa Prabhu <roopa@cumulusnetworks.com> wrote:

> From: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
> 
> This patch adds a type qualifier to json_writer. Type can be a
> json object or array. This can be extended to other types like
> json-string, json-number etc in the future.
> 
> Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
> ---
>  include/json_writer.h |  5 +++--
>  lib/json_writer.c     | 39 +++++++++++++++++++++++++++++++++++----
>  misc/ifstat.c         |  6 +++---
>  misc/lnstat.c         |  2 +-
>  misc/nstat.c          |  4 ++--
>  5 files changed, 44 insertions(+), 12 deletions(-)
> 
> diff --git a/include/json_writer.h b/include/json_writer.h
> index ab9a008..e04a40a 100644
> --- a/include/json_writer.h
> +++ b/include/json_writer.h
> @@ -21,8 +21,9 @@
>  /* Opaque class structure */
>  typedef struct json_writer json_writer_t;
>  
> -/* Create a new JSON stream */
> -json_writer_t *jsonw_new(FILE *f);
> +/* Create a new JSON stream with data type */
> +json_writer_t *jsonw_new_object(FILE *f);
> +json_writer_t *jsonw_new_array(FILE *f);
>  /* End output to JSON stream */
>  void jsonw_destroy(json_writer_t **self_p);
>  
> diff --git a/lib/json_writer.c b/lib/json_writer.c
> index 2af16e1..420cd87 100644
> --- a/lib/json_writer.c
> +++ b/lib/json_writer.c
> @@ -22,11 +22,17 @@
>  
>  #include "json_writer.h"
>  
> +enum jsonw_data_type {
> +	JSONW_TYPE_OBJECT,
> +	JSONW_TYPE_ARRAY
> +};
> +
>  struct json_writer {
>  	FILE		*out;	/* output file */
>  	unsigned	depth;  /* nesting */
>  	bool		pretty; /* optional whitepace */
>  	char		sep;	/* either nul or comma */
> +	int		type;	/* currently either object or array */
>  };
>  
>  /* indentation for pretty print */
> @@ -94,7 +100,7 @@ static void jsonw_puts(json_writer_t *self, const char *str)
>  }
>  
>  /* Create a new JSON stream */
> -json_writer_t *jsonw_new(FILE *f)
> +static json_writer_t *jsonw_new(FILE *f, int type)
>  {
>  	json_writer_t *self = malloc(sizeof(*self));
>  	if (self) {
> @@ -102,11 +108,29 @@ json_writer_t *jsonw_new(FILE *f)
>  		self->depth = 0;
>  		self->pretty = false;
>  		self->sep = '\0';
> -		putc('{', self->out);
> +		self->type = type;
> +		switch (self->type) {
> +		case JSONW_TYPE_OBJECT:
> +			putc('{', self->out);
> +			break;
> +		case JSONW_TYPE_ARRAY:
> +			putc('[', self->out);
> +			break;
> +		}
>  	}
>  	return self;
>  }
>  
> +json_writer_t *jsonw_new_object(FILE *f)
> +{
> +	return jsonw_new(f, JSONW_TYPE_OBJECT);
> +}
> +
> +json_writer_t *jsonw_new_array(FILE *f)
> +{
> +	return jsonw_new(f, JSONW_TYPE_ARRAY);
> +}
> +
>  /* End output to JSON stream */
>  void jsonw_destroy(json_writer_t **self_p)
>  {
> @@ -114,7 +138,14 @@ void jsonw_destroy(json_writer_t **self_p)
>  
>  	assert(self->depth == 0);
>  	jsonw_eol(self);
> -	fputs("}\n", self->out);
> +	switch (self->type) {
> +	case JSONW_TYPE_OBJECT:
> +		fputs("}\n", self->out);
> +		break;
> +	case JSONW_TYPE_ARRAY:
> +		fputs("]\n", self->out);
> +		break;
> +	}
>  	fflush(self->out);
>  	free(self);
>  	*self_p = NULL;
> @@ -267,7 +298,7 @@ void jsonw_null_field(json_writer_t *self, const char *prop)
>  #ifdef TEST
>  int main(int argc, char **argv)
>  {
> -	json_writer_t *wr = jsonw_new(stdout);
> +	json_writer_t *wr = jsonw_new_object(stdout);
>  
>  	jsonw_pretty(wr, true);
>  	jsonw_name(wr, "Vyatta");
> diff --git a/misc/ifstat.c b/misc/ifstat.c
> index abbb4e7..29aa63c 100644
> --- a/misc/ifstat.c
> +++ b/misc/ifstat.c
> @@ -240,7 +240,7 @@ static void load_raw_table(FILE *fp)
>  
>  static void dump_raw_db(FILE *fp, int to_hist)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct ifstat_ent *n, *h;
>  
>  	h = hist_db;
> @@ -447,7 +447,7 @@ static void print_one_if(FILE *fp, const struct ifstat_ent *n,
>  
>  static void dump_kern_db(FILE *fp)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct ifstat_ent *n;
>  
>  	if (jw) {
> @@ -473,7 +473,7 @@ static void dump_kern_db(FILE *fp)
>  static void dump_incr_db(FILE *fp)
>  {
>  	struct ifstat_ent *n, *h;
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  
>  	h = hist_db;
>  	if (jw) {
> diff --git a/misc/lnstat.c b/misc/lnstat.c
> index 659a01b..2988e9e 100644
> --- a/misc/lnstat.c
> +++ b/misc/lnstat.c
> @@ -110,7 +110,7 @@ static void print_line(FILE *of, const struct lnstat_file *lnstat_files,
>  static void print_json(FILE *of, const struct lnstat_file *lnstat_files,
>  		       const struct field_params *fp)
>  {
> -	json_writer_t *jw = jsonw_new(of);
> +	json_writer_t *jw = jsonw_new_object(of);
>  	int i;
>  
>  	jsonw_start_object(jw);
> diff --git a/misc/nstat.c b/misc/nstat.c
> index a9e0f20..7ca6204 100644
> --- a/misc/nstat.c
> +++ b/misc/nstat.c
> @@ -279,7 +279,7 @@ static void load_netstat(void)
>  
>  static void dump_kern_db(FILE *fp, int to_hist)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct nstat_ent *n, *h;
>  
>  	h = hist_db;
> @@ -323,7 +323,7 @@ static void dump_kern_db(FILE *fp, int to_hist)
>  
>  static void dump_incr_db(FILE *fp)
>  {
> -	json_writer_t *jw = json_output ? jsonw_new(fp) : NULL;
> +	json_writer_t *jw = json_output ? jsonw_new_object(fp) : NULL;
>  	struct nstat_ent *n, *h;
>  
>  	h = hist_db;

I would prefer that this not be done.
Why not make everything an an object.

It adds more code and makes it different from how the Java version works.

      reply	other threads:[~2016-05-31 18:56 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-28  4:37 [PATCH iproute2 net-next 1/5] json_writer: allow base json data type to be array or object Roopa Prabhu
2016-05-31 18:56 ` Stephen Hemminger [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160531115643.3682df90@xeon-e3 \
    --to=stephen@networkplumber.org \
    --cc=anuradhak@cumulusnetworks.com \
    --cc=julien@cumulusnetworks.com \
    --cc=netdev@vger.kernel.org \
    --cc=nikolay@cumulusnetworks.com \
    --cc=roopa@cumulusnetworks.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).