summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsmartcols/docs/libsmartcols-sections.txt5
-rw-r--r--libsmartcols/samples/title.c15
-rw-r--r--libsmartcols/src/cell.c29
-rw-r--r--libsmartcols/src/libsmartcols.h.in16
-rw-r--r--libsmartcols/src/libsmartcols.sym5
-rw-r--r--libsmartcols/src/smartcolsP.h5
-rw-r--r--libsmartcols/src/table.c78
-rw-r--r--libsmartcols/src/table_print.c32
8 files changed, 78 insertions, 107 deletions
diff --git a/libsmartcols/docs/libsmartcols-sections.txt b/libsmartcols/docs/libsmartcols-sections.txt
index 44856e1b1..6289e3a2f 100644
--- a/libsmartcols/docs/libsmartcols-sections.txt
+++ b/libsmartcols/docs/libsmartcols-sections.txt
@@ -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>
diff --git a/libsmartcols/samples/title.c b/libsmartcols/samples/title.c
index 14d0326ac..ec72093cc 100644
--- a/libsmartcols/samples/title.c
+++ b/libsmartcols/samples/title.c
@@ -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);
diff --git a/libsmartcols/src/cell.c b/libsmartcols/src/cell.c
index 3dc1df13b..c7aab353e 100644
--- a/libsmartcols/src/cell.c
+++ b/libsmartcols/src/cell.c
@@ -209,6 +209,35 @@ const char *scols_cell_get_color(const struct libscols_cell *ce)
}
/**
+ * 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
* @src: a pointer to an immutable struct libscols_cell instance
diff --git a/libsmartcols/src/libsmartcols.h.in b/libsmartcols/src/libsmartcols.h.in
index 9849a2cfb..b98f406a7 100644
--- a/libsmartcols/src/libsmartcols.h.in
+++ b/libsmartcols/src/libsmartcols.h.in
@@ -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);
diff --git a/libsmartcols/src/libsmartcols.sym b/libsmartcols/src/libsmartcols.sym
index c79d87c71..1a5505c47 100644
--- a/libsmartcols/src/libsmartcols.sym
+++ b/libsmartcols/src/libsmartcols.sym
@@ -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;
diff --git a/libsmartcols/src/smartcolsP.h b/libsmartcols/src/smartcolsP.h
index 99383633b..7fe6db467 100644
--- a/libsmartcols/src/smartcolsP.h
+++ b/libsmartcols/src/smartcolsP.h
@@ -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)
diff --git a/libsmartcols/src/table.c b/libsmartcols/src/table.c
index 23fc2bc1f..f91526bbd 100644
--- a/libsmartcols/src/table.c
+++ b/libsmartcols/src/table.c
@@ -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);
@@ -125,53 +126,6 @@ int scols_table_set_name(struct libscols_table *tb, const char *name)
}
/**
- * 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;
}
/**
diff --git a/libsmartcols/src/table_print.c b/libsmartcols/src/table_print.c
index b003ed6d5..ec9c61650 100644
--- a/libsmartcols/src/table_print.c
+++ b/libsmartcols/src/table_print.c
@@ -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;