view src/doveadm/doveadm-print-tab.c @ 19609:e7e593e68fce

doveadm: Changed most print formatters to write to ostream. This allows all the formatters to be used when sending replies to the upcoming doveadm HTTP server responses. The "table" formatter wasn't modified, because it writes to both stdout and stderr.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 22 Jan 2016 19:06:59 +0200
parents 0f22db71df7a
children 2e2563132d5f
line wrap: on
line source

/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */

#include "lib.h"
#include "array.h"
#include "ostream.h"
#include "doveadm-print-private.h"

struct doveadm_print_tab_context {
	unsigned int header_idx, header_count;

	unsigned int header_written:1;
};

static struct doveadm_print_tab_context ctx;

static void doveadm_print_tab_flush_header(void)
{
	if (!ctx.header_written) {
		if (!doveadm_print_hide_titles)
			o_stream_nsend(doveadm_print_ostream, "\n", 1);
		ctx.header_written = TRUE;
	}
}

static void
doveadm_print_tab_header(const struct doveadm_print_header *hdr)
{
	ctx.header_count++;
	if (!doveadm_print_hide_titles) {
		if (ctx.header_count > 1)
			o_stream_nsend(doveadm_print_ostream, "\t", 1);
		o_stream_nsend_str(doveadm_print_ostream, hdr->title);
	}
}

static void doveadm_print_tab_print(const char *value)
{
	doveadm_print_tab_flush_header();
	if (ctx.header_idx > 0)
		o_stream_nsend(doveadm_print_ostream, "\t", 1);
	o_stream_nsend_str(doveadm_print_ostream, value);

	if (++ctx.header_idx == ctx.header_count) {
		ctx.header_idx = 0;
		o_stream_nsend(doveadm_print_ostream, "\n", 1);
	}
}

static void
doveadm_print_tab_print_stream(const unsigned char *value, size_t size)
{
	if (size == 0) {
		doveadm_print_tab_print("");
		return;
	}
	doveadm_print_tab_flush_header();
	if (ctx.header_idx > 0)
		o_stream_nsend(doveadm_print_ostream, "\t", 1);
	o_stream_nsend(doveadm_print_ostream, value, size);
}

static void doveadm_print_tab_flush(void)
{
	doveadm_print_tab_flush_header();
}

struct doveadm_print_vfuncs doveadm_print_tab_vfuncs = {
	"tab",

	NULL,
	NULL,
	doveadm_print_tab_header,
	doveadm_print_tab_print,
	doveadm_print_tab_print_stream,
	doveadm_print_tab_flush
};