#include "lib.h"
#include "array.h"
+#include "str.h"
#include "doveadm-print-private.h"
#include <stdio.h>
pool_t pool;
ARRAY_DEFINE(headers, struct doveadm_print_table_header);
ARRAY_TYPE(const_string) buffered_values;
+ string_t *stream;
unsigned int hdr_idx;
unsigned int columns;
}
static void
-doveadm_print_table_print_stream(const unsigned char *value ATTR_UNUSED,
- size_t size ATTR_UNUSED)
+doveadm_print_table_print_stream(const unsigned char *value, size_t size)
{
- i_fatal("table formatter doesn't support multi-line values");
+ if (memchr(value, '\n', size) != NULL)
+ i_fatal("table formatter doesn't support multi-line values");
+
+ if (size != 0)
+ str_append_n(ctx->stream, value, size);
+ else {
+ doveadm_print_table_print(str_c(ctx->stream));
+ str_truncate(ctx->stream, 0);
+ }
}
static void doveadm_print_table_flush(void)
pool = pool_alloconly_create("doveadm print table", 2048);
ctx = p_new(pool, struct doveadm_print_table_context, 1);
ctx->pool = pool;
+ ctx->stream = str_new(default_pool, 128);
p_array_init(&ctx->headers, pool, 16);
i_array_init(&ctx->buffered_values, 64);
ctx->columns = DEFAULT_COLUMNS;
static void doveadm_print_table_deinit(void)
{
+ str_free(&ctx->stream);
array_free(&ctx->buffered_values);
pool_unref(&ctx->pool);
ctx = NULL;