Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 9FD68431FBC for ; Fri, 20 Jul 2012 02:08:59 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 6OhAR-PXdlpA for ; Fri, 20 Jul 2012 02:08:58 -0700 (PDT) Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34]) by olra.theworths.org (Postfix) with ESMTP id 39A80431FAE for ; Fri, 20 Jul 2012 02:08:58 -0700 (PDT) Received: by guru.guru-group.fi (Postfix, from userid 501) id 96BF710014D; Fri, 20 Jul 2012 12:09:07 +0300 (EEST) From: Tomi Ollila To: craven@gmx.net, notmuch@notmuchmail.org Subject: Re: [PATCH v7 1/3] Add support for structured output formatters. In-Reply-To: <1342766173-1344-2-git-send-email-craven@gmx.net> References: <20120718194819.GP31670@mit.edu> <1342766173-1344-1-git-send-email-craven@gmx.net> <1342766173-1344-2-git-send-email-craven@gmx.net> User-Agent: Notmuch/0.13.2+93~ge4fdd97 (http://notmuchmail.org) Emacs/23.1.1 (x86_64-redhat-linux-gnu) X-Face: HhBM'cA~ MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jul 2012 09:08:59 -0000 On Fri, Jul 20 2012, craven@gmx.net wrote: > From: > > This patch adds a new struct type sprinter_t, which is used for > structured formatting, e.g. JSON or S-Expressions. The structure printer > is heavily based on code from Austin Clements > (id:87d34hsdx8.fsf@awakening.csail.mit.edu). > > It includes the following functions: > > /* Start a new map/dictionary structure. This should be followed by > * a sequence of alternating calls to map_key and one of the > * value-printing functions until the map is ended by end. > */ > void (*begin_map) (struct sprinter *); > > /* Start a new list/array structure. > */ > void (*begin_list) (struct sprinter *); > > /* End the last opened list or map structure. > */ > void (*end) (struct sprinter *); > > /* Print one string/integer/boolean/null element (possibly inside a > * list or map, followed or preceded by separators). > * For string, the char * must be UTF-8 encoded. > */ > void (*string) (struct sprinter *, const char *); > void (*integer) (struct sprinter *, int); > void (*boolean) (struct sprinter *, notmuch_bool_t); > void (*null) (struct sprinter *); > > /* Print the key of a map's key/value pair. The char * must be UTF-8 > * encoded. > */ > void (*map_key) (struct sprinter *, const char *); > > /* Insert a separator (usually extra whitespace) for improved > * readability without affecting the abstract syntax of the > * structure being printed. > * For JSON, this could simply be a line break. > */ > void (*separator) (struct sprinter *); > > /* Set the current string prefix. This only affects the text > * printer, which will print this string, followed by a colon, > * before any string. For other printers, this does nothing. > */ > void (*set_prefix) (struct sprinter *, const char *); The above block duplicated below. Otherwise this LGTM. I presume the patch 3/3 emails id:"1342766173-1344-4-git-send-email-craven@gmx.net" id:"1342772624-23329-1-git-send-email-craven@gmx.net" have identical content ? > To support the plain text format properly, the following additional > function must also be implemented: > > /* Set the current string prefix. This only affects the text > * printer, which will print this string, followed by a colon, > * before any string. For other printers, this does nothing. > */ > void (*set_prefix) (struct sprinter *, const char *); > > The structure also contains a flag that should be set to FALSE in all > custom printers and to TRUE in the plain text formatter. > > /* True if this is the special-cased plain text printer. > */ > notmuch_bool_t is_text_printer; > > The printer can (and should) use internal state to insert delimiters > and syntax at the correct places. > > Example: > > format->begin_map(format); > format->map_key(format, "foo"); > format->begin_list(format); > format->integer(format, 1); > format->integer(format, 2); > format->integer(format, 3); > format->end(format); > format->map_key(format, "bar"); > format->begin_map(format); > format->map_key(format, "baaz"); > format->string(format, "hello world"); > format->end(format); > format->end(format); > > would output JSON as follows: > > {"foo": [1, 2, 3], "bar": { "baaz": "hello world"}} > --- > sprinter.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > create mode 100644 sprinter.h > > diff --git a/sprinter.h b/sprinter.h > new file mode 100644 > index 0000000..77dc26f > --- /dev/null > +++ b/sprinter.h > @@ -0,0 +1,58 @@ > +#ifndef NOTMUCH_SPRINTER_H > +#define NOTMUCH_SPRINTER_H > + > +/* Necessary for notmuch_bool_t */ > +#include "notmuch-client.h" > + > +/* Structure printer interface. This is used to create output > + * structured as maps (with key/value pairs), lists and primitives > + * (strings, integers and booleans). > + */ > +typedef struct sprinter { > + /* Start a new map/dictionary structure. This should be followed by > + * a sequence of alternating calls to map_key and one of the > + * value-printing functions until the map is ended by end. > + */ > + void (*begin_map) (struct sprinter *); > + > + /* Start a new list/array structure. > + */ > + void (*begin_list) (struct sprinter *); > + > + /* End the last opened list or map structure. > + */ > + void (*end) (struct sprinter *); > + > + /* Print one string/integer/boolean/null element (possibly inside a > + * list or map, followed or preceded by separators). > + * For string, the char * must be UTF-8 encoded. > + */ > + void (*string) (struct sprinter *, const char *); > + void (*integer) (struct sprinter *, int); > + void (*boolean) (struct sprinter *, notmuch_bool_t); > + void (*null) (struct sprinter *); > + > + /* Print the key of a map's key/value pair. The char * must be UTF-8 > + * encoded. > + */ > + void (*map_key) (struct sprinter *, const char *); > + > + /* Insert a separator (usually extra whitespace) for improved > + * readability without affecting the abstract syntax of the > + * structure being printed. > + * For JSON, this could simply be a line break. > + */ > + void (*separator) (struct sprinter *); > + > + /* Set the current string prefix. This only affects the text > + * printer, which will print this string, followed by a colon, > + * before any string. For other printers, this does nothing. > + */ > + void (*set_prefix) (struct sprinter *, const char *); > + > + /* True if this is the special-cased plain text printer. > + */ > + notmuch_bool_t is_text_printer; > +} sprinter_t; > + > +#endif // NOTMUCH_SPRINTER_H > -- > 1.7.11.2 > > _______________________________________________ > notmuch mailing list > notmuch@notmuchmail.org > http://notmuchmail.org/mailman/listinfo/notmuch