doveadm-print-table.c revision 6176f3618240943f3cb41cb7063ecef56b1dd7df
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const char *key;
7944646fad6aa1e7c649c3d33e454c516b0220b6Timo Sirainen ARRAY_DEFINE(headers, struct doveadm_print_table_header);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int hdr_idx;
ede750711f27ca9d9037a7ab9f016411b57f1ad9Stephan Boschstatic struct doveadm_print_table_context *ctx;
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Boschdoveadm_print_table_header(const struct doveadm_print_header *hdr)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch thdr->title = p_strdup(ctx->pool, hdr->title);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch thdr->length = thdr->max_length = thdr->min_length = strlen(hdr->title);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch unsigned int i, line, len, hdr_count, value_count, line_count;
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch headers = array_get_modifiable(&ctx->headers, &hdr_count);
ad03049781fc14807248007d524be4daf06c3ee2Stephan Bosch values = array_get(&ctx->buffered_values, &value_count);
e47c2f17d8136c4d972d1074a3f84ba2ecef4fdcStephan Bosch /* find min and max lengths of fields */
e47c2f17d8136c4d972d1074a3f84ba2ecef4fdcStephan Bosch for (i = 0; i < hdr_count; i++) {
9d746c6785d17e421c3f3c74cf29d059ae2ab233Stephan Bosch /* +1 for space between fields */
9d746c6785d17e421c3f3c74cf29d059ae2ab233Stephan Bosch for (i = 0; i < hdr_count; i++)
9d746c6785d17e421c3f3c74cf29d059ae2ab233Stephan Bosch /* shrink something so we'll fit */
fe2b0e3de834dd40b698bb579adc5357d5789ec9Stephan Bosch diff = headers[i].length - headers[i].min_length;
94d1b08c9e20d637db568a3eab3dfc2b9e96e62aStephan Bosch /* we can finish with this */
b66def5dadd3e7c250313a938d26ad113663f86bStephan Bosch /* take a bit off from it */
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen /* can't shrink it any more */
70505f4839520ac67895992621c97d2480c22e7fTimo Sirainen for (i = 0; i < hdr_count; i++) {
a8c4e79ff50fac21b05a7368b052583d410ca15cTimo Sirainen if ((headers[i].flags & DOVEADM_PRINT_HEADER_FLAG_EXPAND) != 0) {
93cc87bb22386e020cee1093b6bd59295e0b33f0Stephan Bosch headers[i-1].length += (ctx->columns - max_length) / 2;
c972eaa3565e849df71b44cf0cd45d38c5567d07Stephan Boschstatic void doveadm_print_next(const char *value)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if ((hdr->flags & DOVEADM_PRINT_HEADER_FLAG_RIGHT_JUSTIFY) == 0)
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch if (++ctx->hdr_idx == array_count(&ctx->headers)) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const struct doveadm_print_table_header *headers;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch const char *const *valuep;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch unsigned int i, count;
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch for (i = 0; i < count; i++) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch DOVEADM_PRINT_HEADER_FLAG_RIGHT_JUSTIFY) == 0) {
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch fprintf(stderr, "%-*s", (int)headers[i].length,
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch fprintf(stderr, "%*s", (int)headers[i].length,
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Boschstatic void doveadm_print_table_print(const char *value)
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch line_count = array_count(&ctx->buffered_values) /
5a37824675033747fcae3fe3fc3c0dd7ef0ca1cdStephan Bosch array_append(&ctx->buffered_values, &value, 1);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschdoveadm_print_table_print_stream(const unsigned char *value ATTR_UNUSED,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_fatal("table formatter doesn't support multi-line values");
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (!ctx->lengths_set && array_count(&ctx->headers) > 0)
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch pool = pool_alloconly_create("doveadm print table", 2048);
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch ctx = p_new(pool, struct doveadm_print_table_context, 1);
4219de12b28f1936219e27501b9c4b27a4f8d53cStephan Bosch if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0) {