]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libsmartcols: use libscols_cell for title
authorKarel Zak <kzak@redhat.com>
Tue, 9 Feb 2016 10:21:21 +0000 (11:21 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 9 Feb 2016 10:21:21 +0000 (11:21 +0100)
References: https://github.com/karelzak/util-linux/issues/270
Signed-off-by: Karel Zak <kzak@redhat.com>
libsmartcols/docs/libsmartcols-sections.txt
libsmartcols/samples/title.c
libsmartcols/src/cell.c
libsmartcols/src/libsmartcols.h.in
libsmartcols/src/libsmartcols.sym
libsmartcols/src/smartcolsP.h
libsmartcols/src/table.c
libsmartcols/src/table_print.c

index 44856e1b125c1139e032a7861a29a7c0a31a4868..6289e3a2f194b92a7f2dd1cdc39e86c7b907cb27 100644 (file)
@@ -4,10 +4,12 @@ libscols_cell
 scols_cell_copy_content
 scols_cell_get_color
 scols_cell_get_data
+scols_cell_get_flags
 scols_cell_get_userdata
 scols_cell_refer_data
 scols_cell_set_color
 scols_cell_set_data
+scols_cell_set_flags
 scols_cell_set_userdata
 scols_cmpstr_cells
 scols_reset_cell
@@ -132,10 +134,7 @@ scols_table_set_line_separator
 scols_table_set_name
 scols_table_set_stream
 scols_table_set_symbols
-scols_table_set_title
 scols_table_get_title
-scols_table_get_title_position
-scols_table_get_title_color
 scols_sort_table
 scols_unref_table
 </SECTION>
index 14d0326ac2d685af308597c99564f6cce58dbd6a..ec72093cc952286cabc1ffbde9ac10825ede6418 100644 (file)
@@ -56,6 +56,7 @@ int main(int argc, char *argv[])
 {
        struct libscols_table *tb;
        struct libscols_symbols *sy;
+       struct libscols_cell *title;
 
        setlocale(LC_ALL, "");  /* just to have enable UTF8 chars */
 
@@ -70,8 +71,12 @@ int main(int argc, char *argv[])
        add_line(tb, "foo", "bla bla bla");
        add_line(tb, "bar", "alb alb alb");
 
+       title = scols_table_get_title(tb);
+
        /* right */
-       scols_table_set_title(tb, "This is right title", SCOLS_TITLE_RIGHT, "red");
+       scols_cell_set_data(title, "This is right title");
+       scols_cell_set_color(title, "red");
+       scols_cell_set_flags(title, SCOLS_CELL_FL_RIGHT);
        scols_print_table(tb);
 
        /* center */
@@ -81,12 +86,16 @@ int main(int argc, char *argv[])
        scols_table_set_symbols(tb, sy);
 
        scols_symbols_set_title_padding(sy, "=");
-       scols_table_set_title(tb, "This is center title (with padding)", SCOLS_TITLE_CENTER, "green");
+       scols_cell_set_data(title, "This is center title (with padding)");
+       scols_cell_set_color(title, "green");
+       scols_cell_set_flags(title, SCOLS_CELL_FL_CENTER);
        scols_print_table(tb);
 
        /* left */
        scols_symbols_set_title_padding(sy, "-");
-       scols_table_set_title(tb, "This is left title (with padding)", SCOLS_TITLE_LEFT, "blue");
+       scols_cell_set_data(title, "This is left title (with padding)");
+       scols_cell_set_color(title, "blue");
+       scols_cell_set_flags(title, SCOLS_CELL_FL_LEFT);
        scols_print_table(tb);
 
        scols_unref_table(tb);
index 3dc1df13b2cdf7ae785d62bfa1466bd0f79168a1..c7aab353e95c395a04c703f9f0da956b7727aadb 100644 (file)
@@ -208,6 +208,35 @@ const char *scols_cell_get_color(const struct libscols_cell *ce)
        return ce ? ce->color : NULL;
 }
 
+/**
+ * scols_cell_set_flags:
+ * @ce: a pointer to a struct libscols_cell instance
+ * @flags: SCOLS_CELL_FL_* flags
+ *
+ * Note that cells in the table are always aligned by column flags. The cell
+ * flags are used for table title only (now).
+ *
+ * Returns: 0, a negative value in case of an error.
+ */
+int scols_cell_set_flags(struct libscols_cell *ce, int flags)
+{
+       if (!ce)
+               return -EINVAL;
+       ce->flags = flags;
+       return 0;
+}
+
+/**
+ * scols_cell_get_flags:
+ * @ce: a pointer to a struct libscols_cell instance
+ *
+ * Returns: the current flags or -1 in case of an error.
+ */
+int scols_cell_get_flags(const struct libscols_cell *ce)
+{
+       return ce ? ce->flags : -1;
+}
+
 /**
  * scols_cell_copy_content:
  * @dest: a pointer to a struct libscols_cell instance
index 9849a2cfb93ab9b809275c5a3d56e3aac0d62d4c..b98f406a71806351a818686516944d75b8ce7d6a 100644 (file)
@@ -88,12 +88,12 @@ enum {
 };
 
 /*
- * Position of table's title
+ * Cell flags, see scols_cell_set_flags() before use
  */
 enum {
-       SCOLS_TITLE_LEFT = 0,
-       SCOLS_TITLE_CENTER,
-       SCOLS_TITLE_RIGHT
+       SCOLS_CELL_FL_LEFT = 0,
+       SCOLS_CELL_FL_CENTER,
+       SCOLS_CELL_FL_RIGHT
 };
 
 extern struct libscols_iter *scols_new_iter(int direction);
@@ -128,6 +128,9 @@ extern const char *scols_cell_get_data(const struct libscols_cell *ce);
 extern int scols_cell_set_color(struct libscols_cell *ce, const char *color);
 extern const char *scols_cell_get_color(const struct libscols_cell *ce);
 
+extern int scols_cell_set_flags(struct libscols_cell *ce, int flags);
+extern int scols_cell_get_flags(const struct libscols_cell *ce);
+
 extern void *scols_cell_get_userdata(struct libscols_cell *ce);
 extern int scols_cell_set_userdata(struct libscols_cell *ce, void *data);
 
@@ -189,10 +192,7 @@ extern struct libscols_line *scols_copy_line(struct libscols_line *ln);
 /* table */
 extern int scols_table_colors_wanted(struct libscols_table *tb);
 extern int scols_table_set_name(struct libscols_table *tb, const char *name);
-extern int scols_table_set_title(struct libscols_table *tb, const char *title, unsigned int position, const char *color);
-extern const char *scols_table_get_title(struct libscols_table *tb);
-extern unsigned int scols_table_get_title_position(struct libscols_table *tb);
-extern const char *scols_table_get_title_color(struct libscols_table *tb);
+extern struct libscols_cell *scols_table_get_title(struct libscols_table *tb);
 extern int scols_table_is_raw(struct libscols_table *tb);
 extern int scols_table_is_ascii(struct libscols_table *tb);
 extern int scols_table_is_json(struct libscols_table *tb);
index c79d87c71b07ac18d9758856bc4e7a81131d0856..1a5505c474c55f1e09f20776119672d6bc264568 100644 (file)
@@ -129,8 +129,7 @@ global:
        scols_line_set_column_data;
        scols_symbols_set_title_padding;
        scols_table_enable_nowrap;
-       scols_table_set_title;
        scols_table_get_title;
-       scols_table_get_title_position;
-       scols_table_get_title_color;
+       scols_cell_get_flags;
+       scols_cell_set_flags;
 } SMARTCOLS_2.27;
index 99383633b019a8c86b082f6622ea97fe6eeabc13..7fe6db4671915720e56718775c826261045eead8 100644 (file)
@@ -62,6 +62,7 @@ struct libscols_cell {
        char    *data;
        char    *color;
        void    *userdata;
+       int     flags;
 };
 
 
@@ -127,7 +128,6 @@ enum {
 struct libscols_table {
        int     refcount;
        char    *name;          /* optional table name (for JSON) */
-       char    *title;         /* optional table title (for humans) */
        size_t  ncols;          /* number of columns */
        size_t  ntreecols;      /* number of columns with SCOLS_FL_TREE */
        size_t  nlines;         /* number of lines */
@@ -141,6 +141,7 @@ struct libscols_table {
        struct list_head        tb_columns;
        struct list_head        tb_lines;
        struct libscols_symbols *symbols;
+       struct libscols_cell    title;          /* optional table title (for humans) */
 
        int     indent;         /* indention counter */
        int     indent_last_sep;/* last printed has been line separator */
@@ -153,8 +154,6 @@ struct libscols_table {
                        maxout          :1,     /* maximalize output */
                        no_headings     :1,     /* don't print header */
                        no_wrap         :1;     /* never wrap lines */
-       unsigned int    title_pos;              /* title position */
-       char            *title_color;           /* title color */
 };
 
 #define IS_ITER_FORWARD(_i)    ((_i)->direction == SCOLS_ITER_FORWARD)
index 23fc2bc1f6df21661f6e6e64a9b701fc58f41169..f91526bbd5604fe3c620789393e2e57b14fb522e 100644 (file)
@@ -88,6 +88,7 @@ void scols_unref_table(struct libscols_table *tb)
                scols_table_remove_lines(tb);
                scols_table_remove_columns(tb);
                scols_unref_symbols(tb->symbols);
+               scols_reset_cell(&tb->title);
                free(tb->linesep);
                free(tb->colsep);
                free(tb->name);
@@ -124,53 +125,6 @@ int scols_table_set_name(struct libscols_table *tb, const char *name)
        return 0;
 }
 
-/**
- * scols_table_set_title:
- * @tb: a pointer to a struct libscols_table instance
- * @title: a title
- * @position: a position
- * @color: color name or ESC sequence
- *
- * The table title is used to print header of table.
- *
- * Returns: 0, a negative number in case of an error.
- *
- * Since: 2.28
- */
-int scols_table_set_title(struct libscols_table *tb, const char *title, unsigned int position, const char *color)
-{
-       char *p = NULL;
-       char *q = NULL;
-
-       if (!tb)
-               return -EINVAL;
-
-       if (title) {
-               p = strdup(title);
-               if (!p)
-                       return -ENOMEM;
-       }
-
-       if (color) {
-               if (isalpha(*color)) {
-                       color = color_sequence_from_colorname(color);
-
-                       if (!color)
-                               return -EINVAL;
-               }
-               q = strdup(color);
-               if (!q)
-                       return -ENOMEM;
-       }
-
-       free(tb->title);
-       free(tb->title_color);
-       tb->title = p;
-       tb->title_color = q;
-       tb->title_pos = position;
-       return 0;
-}
-
 /**
  * scols_table_get_title:
  * @tb: a pointer to a struct libscols_table instance
@@ -179,35 +133,9 @@ int scols_table_set_title(struct libscols_table *tb, const char *title, unsigned
  *
  * Since: 2.28
  */
-const char *scols_table_get_title(struct libscols_table *tb)
-{
-       return tb->title;
-}
-
-/**
- * scols_table_get_title_position:
- * @tb: a pointer to a struct libscols_table instance
- *
- * Returns: Title's position of the table.
- *
- * Since: 2.28
- */
-unsigned int scols_table_get_title_position(struct libscols_table *tb)
-{
-       return tb->title_pos;
-}
-
-/**
- * scols_table_get_title_color:
- * @tb: a pointer to a struct libscols_table instance
- *
- * Returns: Title's color of the table, or %NULL in case of not set color.
- *
- * Since: 2.28
- */
-const char *scols_table_get_title_color(struct libscols_table *tb)
+struct libscols_cell *scols_table_get_title(struct libscols_table *tb)
 {
-       return tb->title_color;
+       return &tb->title;
 }
 
 /**
index b003ed6d545f39fe2efa702a54c44e7a8e73729d..ec9c616509f4b033138a96ad73e82776652f28bd 100644 (file)
@@ -575,19 +575,19 @@ static int print_line(struct libscols_table *tb,
 
 static int print_title(struct libscols_table *tb)
 {
-       int rc;
+       int rc, align;
        size_t len = 0, width;
        char *title = NULL, *buf = NULL;
 
        assert(tb);
 
-       if (!tb->title)
+       if (!tb->title.data)
                return 0;
 
        DBG(TAB, ul_debugobj(tb, "printing title"));
 
        /* encode data */
-       len = mbs_safe_encode_size(strlen(tb->title)) + 1;
+       len = mbs_safe_encode_size(strlen(tb->title.data)) + 1;
        if (len == 1)
                return 0;
        buf = malloc(len);
@@ -596,7 +596,7 @@ static int print_title(struct libscols_table *tb)
                goto done;
        }
 
-       if (!mbs_safe_encode_to_buffer(tb->title, &len, buf) ||
+       if (!mbs_safe_encode_to_buffer(tb->title.data, &len, buf) ||
            !len || len == (size_t) -1) {
                rc = -EINVAL;
                goto done;
@@ -609,23 +609,31 @@ static int print_title(struct libscols_table *tb)
                goto done;
        }
 
+       if (tb->title.flags & SCOLS_CELL_FL_LEFT)
+               align = MBS_ALIGN_LEFT;
+       else if (tb->title.flags & SCOLS_CELL_FL_RIGHT)
+               align = MBS_ALIGN_RIGHT;
+       else if (tb->title.flags & SCOLS_CELL_FL_CENTER)
+               align = MBS_ALIGN_CENTER;
+       else
+               align = MBS_ALIGN_LEFT; /* default */
+
        width = tb->termwidth;
-       rc = mbsalign_with_padding(
-                       buf, title, tb->termwidth + len, &width,
-                       tb->title_pos == SCOLS_TITLE_LEFT ? MBS_ALIGN_LEFT :
-                       tb->title_pos == SCOLS_TITLE_RIGHT ? MBS_ALIGN_RIGHT :
-                       MBS_ALIGN_CENTER, 0, (int) *tb->symbols->title_padding);
+       rc = mbsalign_with_padding(buf, title, tb->termwidth + len,
+                       &width, align,
+                       0, (int) *tb->symbols->title_padding);
+
        if (rc == (size_t) -1) {
                rc = -EINVAL;
                goto done;
        }
 
-       if (tb->title_color)
-               fputs(tb->title_color, tb->out);
+       if (tb->title.color)
+               fputs(tb->title.color, tb->out);
 
        fputs(title, tb->out);
 
-       if (tb->title_color)
+       if (tb->title.color)
                fputs(UL_COLOR_RESET, tb->out);
        fputc('\n', tb->out);
        rc = 0;