Quoth Mark Walters on Jul 25 at 8:03 pm: > On Wed, 25 Jul 2012, Austin Clements <amdragon@MIT.EDU> wrote: > > --- > > notmuch-show.c | 57 +++++++++++++++++++++++++++++++++----------------------- > > 1 file changed, 34 insertions(+), 23 deletions(-) > > > > diff --git a/notmuch-show.c b/notmuch-show.c > > index afbd9d0..fa1e6e9 100644 > > --- a/notmuch-show.c > > +++ b/notmuch-show.c > > @@ -110,34 +110,44 @@ _get_one_line_summary (const void *ctx, notmuch_message_t *message) > > } > > > > static void > > -format_message_json (const void *ctx, notmuch_message_t *message) > > +format_message_json (sprinter_t *sp, notmuch_message_t *message) > > { > > It might be nice to have a comment for this function (and other > similar ones) saying what it prints: is it a sequence of key: value > pairs, or a map or an array etc. On the other hand it might be that > it is best as it is where you just read the code to see. Ah, good point. I don't think this is so necessary for the other functions, but this one is weird because it requires the caller to begin the map (every other function simply emits a value, so it doesn't depend on the caller's context). > > + void *local = talloc_new (NULL); > > notmuch_tags_t *tags; > > - int first = 1; > > - void *ctx_quote = talloc_new (ctx); > > time_t date; > > const char *relative_date; > > > > date = notmuch_message_get_date (message); > > - relative_date = notmuch_time_relative_date (ctx, date); > > + relative_date = notmuch_time_relative_date (local, date); > > This makes the diff very easy to read but it might be nicer to have > these two assignments further down where they are used. Done, and it is nicer. (Apparently I had the 'date' assignment both here and below!) > Best wishes > > Mark > > > + > > + sp->map_key (sp, "id"); > > + sp->string (sp, notmuch_message_get_message_id (message)); > > + > > + sp->map_key (sp, "match"); > > + sp->boolean (sp, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH)); > > + > > + sp->map_key (sp, "excluded"); > > + sp->boolean (sp, notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED)); > > + > > + sp->map_key (sp, "filename"); > > + sp->string (sp, notmuch_message_get_filename (message)); > > + > > + sp->map_key (sp, "timestamp"); > > + date = notmuch_message_get_date (message); > > + sp->integer (sp, date); > > > > - printf ("\"id\": %s, \"match\": %s, \"excluded\": %s, \"filename\": %s, \"timestamp\": %ld, \"date_relative\": \"%s\", \"tags\": [", > > - json_quote_str (ctx_quote, notmuch_message_get_message_id (message)), > > - notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH) ? "true" : "false", > > - notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_EXCLUDED) ? "true" : "false", > > - json_quote_str (ctx_quote, notmuch_message_get_filename (message)), > > - date, relative_date); > > + sp->map_key (sp, "date_relative"); > > + sp->string (sp, relative_date); > > > > + sp->map_key (sp, "tags"); > > + sp->begin_list (sp); > > for (tags = notmuch_message_get_tags (message); > > notmuch_tags_valid (tags); > > notmuch_tags_move_to_next (tags)) > > - { > > - printf("%s%s", first ? "" : ",", > > - json_quote_str (ctx_quote, notmuch_tags_get (tags))); > > - first = 0; > > - } > > - printf("], "); > > - talloc_free (ctx_quote); > > + sp->string (sp, notmuch_tags_get (tags)); > > + sp->end (sp); > > + > > + talloc_free (local); > > } > > > > /* Extract just the email address from the contents of a From: > > @@ -573,18 +583,19 @@ format_part_json (const void *ctx, sprinter_t *sp, mime_node_t *node, > > * devel/schemata. */ > > > > if (node->envelope_file) { > > - printf ("{"); > > - format_message_json (ctx, node->envelope_file); > > + sp->begin_map (sp); > > + format_message_json (sp, node->envelope_file); > > > > - printf ("\"headers\": "); > > + sp->map_key (sp, "headers"); > > format_headers_json (sp, GMIME_MESSAGE (node->part), FALSE); > > > > if (output_body) { > > - printf (", \"body\": ["); > > + sp->map_key (sp, "body"); > > + sp->begin_list (sp); > > format_part_json (ctx, sp, mime_node_child (node, 0), first, TRUE); > > - printf ("]"); > > + sp->end (sp); > > } > > - printf ("}"); > > + sp->end (sp); > > return; > > } > >