libsmartcols: implement SCOLS_FL_WRAP

Reference: https://github.com/karelzak/util-linux/issues/257
Signed-off-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
This commit is contained in:
Igor Gnatenko 2016-01-21 09:57:31 +01:00
parent acde3a05a9
commit a640409309
4 changed files with 30 additions and 1 deletions

View File

@ -350,3 +350,17 @@ int scols_column_is_noextremes(struct libscols_column *cl)
return -EINVAL;
return cl->flags & SCOLS_FL_NOEXTREMES;
}
/**
* scols_column_is_wrap:
* @cl: a pointer to a struct libscols_column instance
*
* Gets the value of @cl's flag wrap.
*
* Returns: wrap flag value, negative value in case of an error.
*/
int scols_column_is_wrap(struct libscols_column *cl)
{
if (!cl)
return -EINVAL;
return cl->flags & SCOLS_FL_WRAP;
}

View File

@ -84,6 +84,7 @@ enum {
SCOLS_FL_STRICTWIDTH = (1 << 3), /* don't reduce width if column is empty */
SCOLS_FL_NOEXTREMES = (1 << 4), /* ignore extreme fields when count column width*/
SCOLS_FL_HIDDEN = (1 << 5), /* maintain data, but don't print */
SCOLS_FL_WRAP = (1 << 6), /* wrap long cells across lines */
};
extern struct libscols_iter *scols_new_iter(int direction);
@ -129,6 +130,7 @@ extern int scols_column_is_right(struct libscols_column *cl);
extern int scols_column_is_strict_width(struct libscols_column *cl);
extern int scols_column_is_hidden(struct libscols_column *cl);
extern int scols_column_is_noextremes(struct libscols_column *cl);
extern int scols_column_is_wrap(struct libscols_column *cl);
extern int scols_column_set_flags(struct libscols_column *cl, int flags);
extern int scols_column_get_flags(struct libscols_column *cl);

View File

@ -124,6 +124,7 @@ global:
SMARTCOLS_2.28 {
global:
scols_column_is_wrap;
scols_line_refer_column_data;
scols_line_set_column_data;
scols_table_enable_nowrap;

View File

@ -327,7 +327,8 @@ static int print_data(struct libscols_table *tb,
if (is_last_column(tb, cl)
&& len < width
&& !scols_table_is_maxout(tb)
&& !scols_column_is_right(cl))
&& !scols_column_is_right(cl)
&& !scols_column_is_wrap(cl))
width = len;
/* truncate data */
@ -351,6 +352,17 @@ static int print_data(struct libscols_table *tb,
if (color)
fputs(UL_COLOR_RESET, tb->out);
len = width;
} else if (scols_column_is_wrap(cl)) {
char *p = data;
while (*p) {
fprintf(tb->out, "%.*s", (int) width, p);
p += width;
if (*p)
for (i = 0; i < cl->seqnum; i++)
print_empty_cell (tb, scols_table_get_column(tb, i),
NULL, buf->bufsz);
}
} else if (color) {
char *p = data;
size_t art = buffer_get_safe_art_size(buf);