unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
blob dfa54b5706981293ea5cf14a91ceb28137a081fb 2849 bytes (raw)
name: sprinter-text.c 	 # note: path name is non-authoritative(*)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
 
#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.
     */
    notmuch_bool_t 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)
{
    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, notmuch_bool_t 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
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;
}

debug log:

solving dfa54b5 ...
found dfa54b5 in https://yhetil.org/notmuch.git/

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

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 read-only IMAP folder(s) and NNTP newsgroup(s).