]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lib/tt: add TT_FL_FREEDATA
authorKarel Zak <kzak@redhat.com>
Mon, 29 Apr 2013 13:27:42 +0000 (15:27 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:46:53 +0000 (16:46 +0200)
... to call free() for line data.

Signed-off-by: Karel Zak <kzak@redhat.com>
include/tt.h
lib/tt.c

index 603844f668c134e6e85a737be233a99d7d2058e1..0a16c207539e20a77c67907d640eebcd3f928002 100644 (file)
@@ -27,7 +27,9 @@ enum {
        TT_FL_TREE        = (1 << 6),   /* use tree "ascii art" */
        TT_FL_RIGHT       = (1 << 7),   /* align to the right */
        TT_FL_STRICTWIDTH = (1 << 8),   /* don't reduce width if column is empty */
-       TT_FL_NOEXTREMES  = (1 << 9)    /* ignore extreme fields when count column width*/
+       TT_FL_NOEXTREMES  = (1 << 9),   /* ignore extreme fields when count column width*/
+
+       TT_FL_FREEDATA    = (1 << 10),  /* free() data in tt_free_table() */
 };
 
 struct tt {
@@ -61,7 +63,7 @@ struct tt_column {
 
 struct tt_line {
        struct tt       *table;
-       char const      **data;
+       char            **data;
        void            *userdata;
        size_t          data_sz;                /* strlen of all data */
 
@@ -85,7 +87,7 @@ extern struct tt_column *tt_get_column(struct tt *tb, size_t colnum);
 
 extern struct tt_line *tt_add_line(struct tt *tb, struct tt_line *parent);
 
-extern int tt_line_set_data(struct tt_line *ln, int colnum, const char *data);
+extern int tt_line_set_data(struct tt_line *ln, int colnum, char *data);
 extern int tt_line_set_userdata(struct tt_line *ln, void *data);
 
 extern void tt_fputs_quoted(const char *data, FILE *out);
index cbe4e3b4d05fc0782cbcfe19969695659c05c8d6..e701becfde3fd3504202e737e53a782563e2ed81 100644 (file)
--- a/lib/tt.c
+++ b/lib/tt.c
@@ -221,9 +221,17 @@ void tt_remove_lines(struct tt *tb)
                return;
 
        while (!list_empty(&tb->tb_lines)) {
+               struct list_head *p;
                struct tt_line *ln = list_entry(tb->tb_lines.next,
                                                struct tt_line, ln_lines);
                list_del(&ln->ln_lines);
+
+               list_for_each(p, &tb->tb_columns) {
+                       struct tt_column *cl =
+                               list_entry(p, struct tt_column, cl_columns);
+                       if ((cl->flags & TT_FL_FREEDATA) || (tb->flags & TT_FL_FREEDATA))
+                               free(ln->data[cl->seqnum]);
+               }
                free(ln->data);
                free(ln);
        }
@@ -360,7 +368,7 @@ struct tt_column *tt_get_column(struct tt *tb, size_t colnum)
  *
  * Stores data that will be printed to the table cell.
  */
-int tt_line_set_data(struct tt_line *ln, int colnum, const char *data)
+int tt_line_set_data(struct tt_line *ln, int colnum, char *data)
 {
        struct tt_column *cl;