diff options
| author | David Bremner <bremner@debian.org> | 2019-02-17 07:30:33 -0400 |
|---|---|---|
| committer | David Bremner <bremner@debian.org> | 2019-02-17 07:30:33 -0400 |
| commit | f7130468d27c4f37d45e6aa60baacfc3329ccff4 (patch) | |
| tree | f26a901f6e28185d60200c9111de30e1c15b4996 /sprinter-text.c | |
Import notmuch_0.28.2.orig.tar.gz
[dgit import orig notmuch_0.28.2.orig.tar.gz]
Diffstat (limited to 'sprinter-text.c')
| -rw-r--r-- | sprinter-text.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/sprinter-text.c b/sprinter-text.c new file mode 100644 index 00000000..648b54b1 --- /dev/null +++ b/sprinter-text.c @@ -0,0 +1,157 @@ +#include <stdbool.h> +#include <stdio.h> +#include <talloc.h> +#include "sprinter.h" + +/* "Structured printer" interface for unstructured text printing. + * Note that --output=summary is dispatched and formatted in + * notmuch-search.c, the code in this file is only used for all other + * output types. + */ + +struct sprinter_text { + struct sprinter vtable; + FILE *stream; + + /* The current prefix to be printed with string/integer/boolean + * data. + */ + const char *current_prefix; + + /* A flag to indicate if this is the first tag. Used in list of tags + * for summary. + */ + bool first_tag; +}; + +static void +text_string_len (struct sprinter *sp, const char *val, size_t len) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + if (sptxt->current_prefix != NULL) + fprintf (sptxt->stream, "%s:", sptxt->current_prefix); + + fwrite (val, len, 1, sptxt->stream); +} + +static void +text_string (struct sprinter *sp, const char *val) +{ + if (val == NULL) + val = ""; + text_string_len (sp, val, strlen (val)); +} + +static void +text_integer (struct sprinter *sp, int val) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + fprintf (sptxt->stream, "%d", val); +} + +static void +text_boolean (struct sprinter *sp, bool val) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + fputs (val ? "true" : "false", sptxt->stream); +} + +static void +text_separator (struct sprinter *sp) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + fputc ('\n', sptxt->stream); +} + +static void +text0_separator (struct sprinter *sp) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + fputc ('\0', sptxt->stream); +} + +static void +text_set_prefix (struct sprinter *sp, const char *prefix) +{ + struct sprinter_text *sptxt = (struct sprinter_text *) sp; + + sptxt->current_prefix = prefix; +} + +/* The structure functions begin_map, begin_list, end and map_key + * don't do anything in the text formatter. + */ + +static void +text_begin_map (unused (struct sprinter *sp)) +{ +} + +static void +text_begin_list (unused (struct sprinter *sp)) +{ +} + +static void +text_end (unused (struct sprinter *sp)) +{ +} + +static void +text_null (unused (struct sprinter *sp)) +{ +} + +static void +text_map_key (unused (struct sprinter *sp), unused (const char *key)) +{ +} + +struct sprinter * +sprinter_text_create (const void *ctx, FILE *stream) +{ + static const struct sprinter_text template = { + .vtable = { + .begin_map = text_begin_map, + .begin_list = text_begin_list, + .end = text_end, + .string = text_string, + .string_len = text_string_len, + .integer = text_integer, + .boolean = text_boolean, + .null = text_null, + .map_key = text_map_key, + .separator = text_separator, + .set_prefix = text_set_prefix, + .is_text_printer = true, + }, + }; + struct sprinter_text *res; + + res = talloc (ctx, struct sprinter_text); + if (! res) + return NULL; + + *res = template; + res->stream = stream; + return &res->vtable; +} + +struct sprinter * +sprinter_text0_create (const void *ctx, FILE *stream) +{ + struct sprinter *sp; + + sp = sprinter_text_create (ctx, stream); + if (! sp) + return NULL; + + sp->separator = text0_separator; + + return sp; +} |
