dovecot-2.0: doveadm: Added "pager" formatter and a function to ...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jun 21 23:47:22 EEST 2010
details: http://hg.dovecot.org/dovecot-2.0/rev/c4e906be2ca3
changeset: 11604:c4e906be2ca3
user: Timo Sirainen <tss at iki.fi>
date: Mon Jun 21 21:46:20 2010 +0100
description:
doveadm: Added "pager" formatter and a function to output streamed output values.
diffstat:
src/doveadm/Makefile.am | 1 +
src/doveadm/doveadm-print-flow.c | 35 ++++++++++-
src/doveadm/doveadm-print-pager.c | 99 +++++++++++++++++++++++++++++++++
src/doveadm/doveadm-print-private.h | 2 +
src/doveadm/doveadm-print-tab.c | 17 +++++
src/doveadm/doveadm-print-table.c | 8 ++
src/doveadm/doveadm-print.c | 8 ++-
src/doveadm/doveadm-print.h | 2 +
8 files changed, 166 insertions(+), 6 deletions(-)
diffs (291 lines):
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/Makefile.am
--- 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 \
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print-flow.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
};
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print-pager.c
--- /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
+};
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print-private.h
--- 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
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print-tab.c
--- 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
};
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print-table.c
--- 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
};
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print.c
--- 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;
diff -r 28cfb347296a -r c4e906be2ca3 src/doveadm/doveadm-print.h
--- 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);
More information about the dovecot-cvs
mailing list