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
--- a/src/doveadm/doveadm.c	Wed Feb 24 19:13:28 2016 +0200
+++ b/src/doveadm/doveadm.c	Tue Feb 23 14:13:37 2016 +0200
@@ -25,6 +25,7 @@
 	&doveadm_print_table_vfuncs,
 	&doveadm_print_pager_vfuncs,
 	&doveadm_print_json_vfuncs,
+	&doveadm_print_formatted_vfuncs,
 	NULL
 };