Mercurial > dovecot > core-2.2
changeset 11604:c4e906be2ca3 HEAD
doveadm: Added "pager" formatter and a function to output streamed output values.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 21 Jun 2010 21:46:20 +0100 |
parents | 28cfb347296a |
children | bc03e6443ca7 |
files | src/doveadm/Makefile.am src/doveadm/doveadm-print-flow.c src/doveadm/doveadm-print-pager.c src/doveadm/doveadm-print-private.h src/doveadm/doveadm-print-tab.c src/doveadm/doveadm-print-table.c src/doveadm/doveadm-print.c src/doveadm/doveadm-print.h |
diffstat | 8 files changed, 166 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/Makefile.am Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/Makefile.am Mon Jun 21 21:46:20 2010 +0100 @@ -66,6 +66,7 @@ doveadm-penalty.c \ doveadm-print.c \ doveadm-print-flow.c \ + doveadm-print-pager.c \ doveadm-print-tab.c \ doveadm-print-table.c \ doveadm-pw.c \
--- a/src/doveadm/doveadm-print-flow.c Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print-flow.c Mon Jun 21 21:46:20 2010 +0100 @@ -15,6 +15,8 @@ pool_t pool; ARRAY_DEFINE(headers, struct doveadm_print_flow_header); unsigned int header_idx; + + unsigned int streaming:1; }; static struct doveadm_print_flow_context *ctx; @@ -29,6 +31,16 @@ fhdr->flags = hdr->flags; } +static void flow_next_hdr(void) +{ + if (++ctx->header_idx < array_count(&ctx->headers)) + printf(" "); + else { + ctx->header_idx = 0; + printf("\n"); + } +} + static void doveadm_print_flow_print(const char *value) { const struct doveadm_print_flow_header *hdr = @@ -37,12 +49,24 @@ if ((hdr->flags & DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE) == 0) printf("%s=", hdr->title); printf("%s", value); + flow_next_hdr(); +} - if (++ctx->header_idx < array_count(&ctx->headers)) - printf(" "); - else { - ctx->header_idx = 0; - printf("\n"); +static void +doveadm_print_flow_print_stream(const unsigned char *value, size_t size) +{ + const struct doveadm_print_flow_header *hdr = + array_idx(&ctx->headers, ctx->header_idx); + + if (!ctx->streaming) { + ctx->streaming = TRUE; + if ((hdr->flags & DOVEADM_PRINT_HEADER_FLAG_HIDE_TITLE) == 0) + printf("%s=", hdr->title); + } + printf("%.*s", (int)size, value); + if (size == 0) { + flow_next_hdr(); + ctx->streaming = FALSE; } } @@ -77,5 +101,6 @@ doveadm_print_flow_deinit, doveadm_print_flow_header, doveadm_print_flow_print, + doveadm_print_flow_print_stream, doveadm_print_flow_flush };
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/doveadm/doveadm-print-pager.c Mon Jun 21 21:46:20 2010 +0100 @@ -0,0 +1,99 @@ +/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "array.h" +#include "doveadm-print-private.h" + +#include <stdio.h> + +struct doveadm_print_pager_header { + const char *title; +}; + +struct doveadm_print_pager_context { + pool_t pool; + ARRAY_DEFINE(headers, struct doveadm_print_pager_header); + unsigned int header_idx; + + unsigned int streaming:1; +}; + +static struct doveadm_print_pager_context *ctx; + +static void +doveadm_print_pager_header(const struct doveadm_print_header *hdr) +{ + struct doveadm_print_pager_header *fhdr; + + fhdr = array_append_space(&ctx->headers); + fhdr->title = p_strdup(ctx->pool, hdr->title); +} + +static void pager_next_hdr(void) +{ + if (++ctx->header_idx == array_count(&ctx->headers)) { + ctx->header_idx = 0; + printf("\x0c"); /* ^L */ + } +} + +static void doveadm_print_pager_print(const char *value) +{ + const struct doveadm_print_pager_header *hdr = + array_idx(&ctx->headers, ctx->header_idx); + + printf("%s: %s\n", hdr->title, value); + pager_next_hdr(); +} + +static void +doveadm_print_pager_print_stream(const unsigned char *value, size_t size) +{ + const struct doveadm_print_pager_header *hdr = + array_idx(&ctx->headers, ctx->header_idx); + + if (!ctx->streaming) { + ctx->streaming = TRUE; + printf("%s:\n", hdr->title); + } + printf("%.*s", (int)size, value); + if (size == 0) { + pager_next_hdr(); + ctx->streaming = FALSE; + } +} + +static void doveadm_print_pager_init(void) +{ + pool_t pool; + + pool = pool_alloconly_create("doveadm print pager", 1024); + ctx = p_new(pool, struct doveadm_print_pager_context, 1); + ctx->pool = pool; + p_array_init(&ctx->headers, pool, 16); +} + +static void doveadm_print_pager_flush(void) +{ + if (ctx->header_idx != 0) { + printf("\n"); + ctx->header_idx = 0; + } +} + +static void doveadm_print_pager_deinit(void) +{ + pool_unref(&ctx->pool); + ctx = NULL; +} + +struct doveadm_print_vfuncs doveadm_print_pager_vfuncs = { + "pager", + + doveadm_print_pager_init, + doveadm_print_pager_deinit, + doveadm_print_pager_header, + doveadm_print_pager_print, + doveadm_print_pager_print_stream, + doveadm_print_pager_flush +};
--- a/src/doveadm/doveadm-print-private.h Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print-private.h Mon Jun 21 21:46:20 2010 +0100 @@ -17,11 +17,13 @@ void (*header)(const struct doveadm_print_header *hdr); void (*print)(const char *value); + void (*print_stream)(const unsigned char *value, size_t size); void (*flush)(void); }; extern struct doveadm_print_vfuncs doveadm_print_flow_vfuncs; extern struct doveadm_print_vfuncs doveadm_print_tab_vfuncs; extern struct doveadm_print_vfuncs doveadm_print_table_vfuncs; +extern struct doveadm_print_vfuncs doveadm_print_pager_vfuncs; #endif
--- a/src/doveadm/doveadm-print-tab.c Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print-tab.c Mon Jun 21 21:46:20 2010 +0100 @@ -40,6 +40,22 @@ } } +static void +doveadm_print_tab_print_stream(const unsigned char *value, size_t size) +{ + if (size == 0) { + doveadm_print_tab_print(""); + return; + } + if (!ctx.header_written) { + printf("\n"); + ctx.header_written = TRUE; + } + if (ctx.header_idx > 0) + printf("\t"); + printf("%.*s", (int)size, value); +} + static void doveadm_print_tab_flush(void) { if (!ctx.header_written) { @@ -55,5 +71,6 @@ NULL, doveadm_print_tab_header, doveadm_print_tab_print, + doveadm_print_tab_print_stream, doveadm_print_tab_flush };
--- a/src/doveadm/doveadm-print-table.c Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print-table.c Mon Jun 21 21:46:20 2010 +0100 @@ -171,6 +171,13 @@ doveadm_print_next(value); } +static void +doveadm_print_table_print_stream(const unsigned char *value ATTR_UNUSED, + size_t size ATTR_UNUSED) +{ + i_fatal("table formatter doesn't support multi-line values"); +} + static void doveadm_print_table_flush(void) { if (!ctx->lengths_set && array_count(&ctx->headers) > 0) @@ -209,5 +216,6 @@ doveadm_print_table_deinit, doveadm_print_table_header, doveadm_print_table_print, + doveadm_print_table_print_stream, doveadm_print_table_flush };
--- a/src/doveadm/doveadm-print.c Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print.c Mon Jun 21 21:46:20 2010 +0100 @@ -24,7 +24,8 @@ static const struct doveadm_print_vfuncs *doveadm_print_vfuncs_all[] = { &doveadm_print_flow_vfuncs, &doveadm_print_tab_vfuncs, - &doveadm_print_table_vfuncs + &doveadm_print_table_vfuncs, + &doveadm_print_pager_vfuncs }; bool doveadm_print_is_initialized(void) @@ -85,6 +86,11 @@ } T_END; } +void doveadm_print_stream(const void *value, size_t size) +{ + ctx->v->print_stream(value, size); +} + void doveadm_print_sticky(const char *key, const char *value) { struct doveadm_print_header_context *hdr;
--- a/src/doveadm/doveadm-print.h Mon Jun 21 21:17:58 2010 +0100 +++ b/src/doveadm/doveadm-print.h Mon Jun 21 21:46:20 2010 +0100 @@ -17,6 +17,8 @@ void doveadm_print_header_simple(const char *key_title); void doveadm_print(const char *value); void doveadm_print_num(uintmax_t value); +/* Stream for same field continues until len=0 */ +void doveadm_print_stream(const void *value, size_t size); void doveadm_print_sticky(const char *key, const char *value); void doveadm_print_flush(void);