Mercurial > dovecot > core-2.2
changeset 19844:ec3eef070b1f
doveadm-print: Add "formatted" print formatter
This allows using the header names as %{variables} in the format string.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Tue, 23 Feb 2016 14:13:37 +0200 |
parents | a9131cd280b2 |
children | e42c1a8becc2 |
files | src/doveadm/Makefile.am src/doveadm/doveadm-print-formatted.c src/doveadm/doveadm-print-private.h src/doveadm/doveadm-print.h src/doveadm/doveadm.c |
diffstat | 5 files changed, 89 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/Makefile.am Wed Feb 24 19:13:28 2016 +0200 +++ b/src/doveadm/Makefile.am Tue Feb 23 14:13:37 2016 +0200 @@ -120,7 +120,8 @@ doveadm-print.c \ doveadm-settings.c \ doveadm-util.c \ - server-connection.c + server-connection.c \ + doveadm-print-formatted.c doveadm_SOURCES = \ $(common) \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/doveadm/doveadm-print-formatted.c Tue Feb 23 14:13:37 2016 +0200 @@ -0,0 +1,82 @@ +#include "lib.h" +#include "array.h" +#include "str.h" +#include "ostream.h" +#include "client-connection.h" +#include "doveadm-server.h" +#include "doveadm-print.h" +#include "doveadm-print-private.h" +#include "var-expand.h" + +struct doveadm_print_formatted_context { + pool_t pool; + const char *format; + ARRAY(struct var_expand_table) headers; + string_t *buf; + string_t *vbuf; + unsigned int idx; +}; + +static struct doveadm_print_formatted_context ctx; + +void doveadm_print_formatted_set_format(const char *format) +{ + ctx.format = format; +} + +static void doveadm_print_formatted_init(void) +{ + memset(&ctx,0,sizeof(ctx)); + ctx.pool = pool_alloconly_create("doveadm formatted print", 1024); + ctx.buf = str_new(ctx.pool, 256); + p_array_init(&ctx.headers, ctx.pool, 8); + ctx.idx = 0; +} + +static void +doveadm_print_formatted_header(const struct doveadm_print_header *hdr) +{ + struct var_expand_table entry; + memset(&entry, 0, sizeof(entry)); + entry.key = '\0'; + entry.long_key = p_strdup(ctx.pool, hdr->key); + entry.value = NULL; + array_append(&ctx.headers, &entry, 1); +} + + +static void doveadm_print_formatted_flush(void) +{ + o_stream_nsend(doveadm_print_ostream, str_data(ctx.buf), str_len(ctx.buf)); + str_truncate(ctx.buf, 0); +} + +static void doveadm_print_formatted_print(const char *value) +{ + struct var_expand_table *entry = array_idx_modifiable(&ctx.headers, ctx.idx++); + entry->value = value; + + if (ctx.idx >= array_count(&ctx.headers)) { + var_expand(ctx.buf, ctx.format, array_idx(&ctx.headers,0)); + doveadm_print_formatted_flush(); + ctx.idx = 0; + } + +} + +static void doveadm_print_formatted_deinit(void) +{ + pool_unref(&ctx.pool); +} + +struct doveadm_print_vfuncs doveadm_print_formatted_vfuncs = { + "formatted", + + doveadm_print_formatted_init, + doveadm_print_formatted_deinit, + doveadm_print_formatted_header, + doveadm_print_formatted_print, + NULL, + doveadm_print_formatted_flush +}; +
--- a/src/doveadm/doveadm-print-private.h Wed Feb 24 19:13:28 2016 +0200 +++ b/src/doveadm/doveadm-print-private.h Tue Feb 23 14:13:37 2016 +0200 @@ -26,5 +26,6 @@ extern struct doveadm_print_vfuncs doveadm_print_table_vfuncs; extern struct doveadm_print_vfuncs doveadm_print_pager_vfuncs; extern struct doveadm_print_vfuncs doveadm_print_json_vfuncs; +extern struct doveadm_print_vfuncs doveadm_print_formatted_vfuncs; #endif
--- a/src/doveadm/doveadm-print.h Wed Feb 24 19:13:28 2016 +0200 +++ b/src/doveadm/doveadm-print.h Tue Feb 23 14:13:37 2016 +0200 @@ -6,6 +6,7 @@ #define DOVEADM_PRINT_TYPE_TABLE "table" #define DOVEADM_PRINT_TYPE_SERVER "server" #define DOVEADM_PRINT_TYPE_JSON "json" +#define DOVEADM_PRINT_TYPE_FORMATTED "formatted" enum doveadm_print_header_flags { DOVEADM_PRINT_HEADER_FLAG_RIGHT_JUSTIFY = 0x01, @@ -38,4 +39,6 @@ void doveadm_print_init(const char *name); void doveadm_print_deinit(void); +void doveadm_print_formatted_set_format(const char *format); + #endif