libsmartcols: cell width calulation cleanup
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
ea7fb72eb2
commit
281a2f3212
|
@ -32,6 +32,46 @@ static void dbg_columns(struct libscols_table *tb)
|
||||||
dbg_column(tb, cl);
|
dbg_column(tb, cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int count_cell_width(struct libscols_table *tb,
|
||||||
|
struct libscols_line *ln,
|
||||||
|
struct libscols_column *cl,
|
||||||
|
struct libscols_buffer *buf)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *data;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = __cell_to_buffer(tb, ln, cl, buf);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
data = buffer_get_data(buf);
|
||||||
|
if (!data)
|
||||||
|
len = 0;
|
||||||
|
else if (scols_column_is_customwrap(cl))
|
||||||
|
len = cl->wrap_chunksize(cl, data, cl->wrapfunc_data);
|
||||||
|
else
|
||||||
|
len = mbs_safe_width(data);
|
||||||
|
|
||||||
|
if (len == (size_t) -1) /* ignore broken multibyte strings */
|
||||||
|
len = 0;
|
||||||
|
cl->width_max = max(len, cl->width_max);
|
||||||
|
|
||||||
|
if (cl->is_extreme && cl->width_avg && len > cl->width_avg * 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
else if (scols_column_is_noextremes(cl)) {
|
||||||
|
cl->extreme_sum += len;
|
||||||
|
cl->extreme_count++;
|
||||||
|
}
|
||||||
|
cl->width = max(len, cl->width);
|
||||||
|
if (scols_column_is_tree(cl)) {
|
||||||
|
size_t treewidth = buffer_get_safe_art_size(buf);
|
||||||
|
cl->width_treeart = max(cl->width_treeart, treewidth);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function counts column width.
|
* This function counts column width.
|
||||||
*
|
*
|
||||||
|
@ -47,8 +87,7 @@ static int count_column_width(struct libscols_table *tb,
|
||||||
{
|
{
|
||||||
struct libscols_line *ln;
|
struct libscols_line *ln;
|
||||||
struct libscols_iter itr;
|
struct libscols_iter itr;
|
||||||
int extreme_count = 0, rc = 0, no_header = 0;
|
int rc = 0, no_header = 0;
|
||||||
size_t extreme_sum = 0;
|
|
||||||
|
|
||||||
assert(tb);
|
assert(tb);
|
||||||
assert(cl);
|
assert(cl);
|
||||||
|
@ -72,38 +111,9 @@ static int count_column_width(struct libscols_table *tb,
|
||||||
|
|
||||||
scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
|
scols_reset_iter(&itr, SCOLS_ITER_FORWARD);
|
||||||
while (scols_table_next_line(tb, &itr, &ln) == 0) {
|
while (scols_table_next_line(tb, &itr, &ln) == 0) {
|
||||||
size_t len;
|
rc = count_cell_width(tb, ln, cl, buf);
|
||||||
char *data;
|
|
||||||
|
|
||||||
rc = __cell_to_buffer(tb, ln, cl, buf);
|
|
||||||
if (rc)
|
if (rc)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
data = buffer_get_data(buf);
|
|
||||||
|
|
||||||
if (!data)
|
|
||||||
len = 0;
|
|
||||||
else if (scols_column_is_customwrap(cl))
|
|
||||||
len = cl->wrap_chunksize(cl, data, cl->wrapfunc_data);
|
|
||||||
else
|
|
||||||
len = mbs_safe_width(data);
|
|
||||||
|
|
||||||
|
|
||||||
if (len == (size_t) -1) /* ignore broken multibyte strings */
|
|
||||||
len = 0;
|
|
||||||
cl->width_max = max(len, cl->width_max);
|
|
||||||
|
|
||||||
if (cl->is_extreme && cl->width_avg && len > cl->width_avg * 2)
|
|
||||||
continue;
|
|
||||||
else if (scols_column_is_noextremes(cl)) {
|
|
||||||
extreme_sum += len;
|
|
||||||
extreme_count++;
|
|
||||||
}
|
|
||||||
cl->width = max(len, cl->width);
|
|
||||||
if (scols_column_is_tree(cl)) {
|
|
||||||
size_t treewidth = buffer_get_safe_art_size(buf);
|
|
||||||
cl->width_treeart = max(cl->width_treeart, treewidth);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scols_column_is_tree(cl) && has_groups(tb)) {
|
if (scols_column_is_tree(cl) && has_groups(tb)) {
|
||||||
|
@ -115,12 +125,12 @@ static int count_column_width(struct libscols_table *tb,
|
||||||
cl->width_treeart += gprwidth;
|
cl->width_treeart += gprwidth;
|
||||||
cl->width_max += gprwidth;
|
cl->width_max += gprwidth;
|
||||||
cl->width += gprwidth;
|
cl->width += gprwidth;
|
||||||
if (extreme_count)
|
if (cl->extreme_count)
|
||||||
extreme_sum += gprwidth;
|
cl->extreme_sum += gprwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extreme_count && cl->width_avg == 0) {
|
if (cl->extreme_count && cl->width_avg == 0) {
|
||||||
cl->width_avg = extreme_sum / extreme_count;
|
cl->width_avg = cl->extreme_sum / cl->extreme_count;
|
||||||
if (cl->width_avg && cl->width_max > cl->width_avg * 2)
|
if (cl->width_avg && cl->width_max > cl->width_avg * 2)
|
||||||
cl->is_extreme = 1;
|
cl->is_extreme = 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,6 +97,9 @@ struct libscols_column {
|
||||||
size_t width_treeart; /* size of the tree ascii art */
|
size_t width_treeart; /* size of the tree ascii art */
|
||||||
double width_hint; /* hint (N < 1 is in percent of termwidth) */
|
double width_hint; /* hint (N < 1 is in percent of termwidth) */
|
||||||
|
|
||||||
|
size_t extreme_sum;
|
||||||
|
int extreme_count;
|
||||||
|
|
||||||
int json_type; /* SCOLS_JSON_* */
|
int json_type; /* SCOLS_JSON_* */
|
||||||
|
|
||||||
int flags;
|
int flags;
|
||||||
|
|
Loading…
Reference in New Issue