bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "lib.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "array.h"
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen#include "ostream.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen#include "doveadm-print-private.h"
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstruct doveadm_print_tab_context {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen unsigned int header_idx, header_count;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen bool header_written:1;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen};
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic struct doveadm_print_tab_context ctx;
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainenstatic void doveadm_print_tab_flush_header(void)
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen{
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen if (!ctx.header_written) {
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen if (!doveadm_print_hide_titles)
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, "\n", 1);
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen ctx.header_written = TRUE;
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen }
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen}
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic void
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainendoveadm_print_tab_header(const struct doveadm_print_header *hdr)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen{
738e548a4b1c7d214626e875491a48fcf1cddd1cTimo Sirainen ctx.header_count++;
738e548a4b1c7d214626e875491a48fcf1cddd1cTimo Sirainen if (!doveadm_print_hide_titles) {
738e548a4b1c7d214626e875491a48fcf1cddd1cTimo Sirainen if (ctx.header_count > 1)
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, "\t", 1);
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend_str(doveadm_print_ostream, hdr->title);
738e548a4b1c7d214626e875491a48fcf1cddd1cTimo Sirainen }
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen}
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstatic void doveadm_print_tab_print(const char *value)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen{
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen doveadm_print_tab_flush_header();
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen if (ctx.header_idx > 0)
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, "\t", 1);
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend_str(doveadm_print_ostream, value);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
505031653de36a8ec45a45e23a42937966327618Timo Sirainen if (++ctx.header_idx == ctx.header_count) {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen ctx.header_idx = 0;
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, "\n", 1);
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen }
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen}
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainenstatic void
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainendoveadm_print_tab_print_stream(const unsigned char *value, size_t size)
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen{
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen if (size == 0) {
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen doveadm_print_tab_print("");
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen return;
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen }
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen doveadm_print_tab_flush_header();
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen if (ctx.header_idx > 0)
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, "\t", 1);
57591c5ea045b6829ebcfed9b145d719d63f935aTimo Sirainen o_stream_nsend(doveadm_print_ostream, value, size);
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen}
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainenstatic void doveadm_print_tab_flush(void)
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen{
ce9619645e0ec302c208690e9f9bc65037c05196Timo Sirainen doveadm_print_tab_flush_header();
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen}
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainenstruct doveadm_print_vfuncs doveadm_print_tab_vfuncs = {
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen "tab",
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen NULL,
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainen NULL,
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen doveadm_print_tab_header,
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainen doveadm_print_tab_print,
528bfe84f996046645103de898564ef5bcb5edadTimo Sirainen doveadm_print_tab_print_stream,
09304bdc1e5e416aa343802732a15064f49495ccTimo Sirainen doveadm_print_tab_flush
7ed711d973b319320da100d3e905ef7b99ed69d6Timo Sirainen};