]> err.no Git - util-linux/commitdiff
include: [tt] enlarge output buffer
authorKarel Zak <kzak@redhat.com>
Mon, 24 Jan 2011 23:24:17 +0000 (00:24 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 24 Jan 2011 23:24:17 +0000 (00:24 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
include/tt.h
lib/tt.c

index b27f51ea136d7d0e6c19e63946c2a1bbbc32de8a..400d6ba5e66d1ea9343a50e372510457da4940f0 100644 (file)
@@ -48,6 +48,7 @@ struct tt_line {
        struct tt       *table;
        char const      **data;
        void            *userdata;
+       ssize_t         data_sz;                /* strlen of all data */
 
        struct list_head        ln_lines;       /* table lines */
 
index ffa5897dec138dfe61fc08fbff8bb4a1ac22d1ee..3bcdea9e0ce4abf85e5b5fdbc34c5ec6d1d0e678 100644 (file)
--- a/lib/tt.c
+++ b/lib/tt.c
@@ -276,7 +276,13 @@ int tt_line_set_data(struct tt_line *ln, int colnum, const char *data)
        cl = tt_get_column(ln->table, colnum);
        if (!cl)
                return -1;
+
+       if (ln->data[cl->seqnum])
+               ln->data_sz -= strlen(ln->data[cl->seqnum]);
+
        ln->data[cl->seqnum] = data;
+       if (data)
+               ln->data_sz += strlen(data);
        return 0;
 }
 
@@ -632,6 +638,8 @@ static void print_tree(struct tt *tb, char *buf, size_t bufsz)
 int tt_print_table(struct tt *tb)
 {
        char *line;
+       size_t line_sz;
+       struct list_head *p;
 
        if (!tb)
                return -1;
@@ -640,15 +648,24 @@ int tt_print_table(struct tt *tb)
                if (tb->termwidth <= 0)
                        tb->termwidth = 80;
        }
-       line = malloc(tb->termwidth);
+
+       line_sz = tb->termwidth;
+
+       list_for_each(p, &tb->tb_lines) {
+               struct tt_line *ln = list_entry(p, struct tt_line, ln_lines);
+               if (ln->data_sz > line_sz)
+                       line_sz = ln->data_sz;
+       }
+
+       line = malloc(line_sz);
        if (!line)
                return -1;
        if (!(tb->flags & TT_FL_RAW))
-               recount_widths(tb, line, tb->termwidth);
+               recount_widths(tb, line, line_sz);
        if (tb->flags & TT_FL_TREE)
-               print_tree(tb, line, tb->termwidth);
+               print_tree(tb, line, line_sz);
        else
-               print_table(tb, line, tb->termwidth);
+               print_table(tb, line, line_sz);
 
        free(line);
        return 0;