unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
blob c75ec5be1cbc5632f56332b40563c87959367547 3275 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
 
#include <inttypes.h>
#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, int64_t val)
{
    struct sprinter_text *sptxt = (struct sprinter_text *) sp;

    fprintf (sptxt->stream, "%" PRId64, 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;
}

debug log:

solving c75ec5be ...
found c75ec5be 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).