diff --git a/src/shared/format-table.c b/src/shared/format-table.c index f400602b34..279e7fda68 100644 --- a/src/shared/format-table.c +++ b/src/shared/format-table.c @@ -2139,6 +2139,75 @@ static const char* table_data_rgap_underline(const TableData *d) { return NULL; } +int table_data_requested_width(Table *table, size_t column, size_t *ret) { + size_t width = 0; + int r; + + assert(table); + assert(ret); + + for (size_t row = 0; row < table_get_rows(table); row++) { + TableCell *cell = table_get_cell(table, row, column); + if (!cell) + continue; + + TableData *data = table_get_data(table, cell); + if (!data) + continue; + + size_t w; + + r = table_data_requested_width_height( + table, data, SIZE_MAX, &w, /* ret_height= */ NULL, /* have_soft= */ NULL); + if (r < 0) + return r; + + width = MAX(width, w); + } + + *ret = width; + return 0; +} + +int table_set_column_width(Table *t, size_t column, size_t width) { + int r = 0; + + assert(t); + + for (size_t row = 0; row < table_get_rows(t); row++) { + TableCell *cell = table_get_cell(t, row, column); + if (!cell) + continue; + + RET_GATHER(r, table_set_minimum_width(t, cell, width)); + } + + return r; +} + +int table_sync_column_width(Table *a, size_t column_a, Table *b, size_t column_b) { + size_t w1, w2; + int r; + + assert(a); + assert(b); + + /* Make both tables have specified columns of same width */ + + r = table_data_requested_width(a, column_a, &w1); + if (r < 0) + return log_error_errno(r, "Failed to query table column width: %m"); + + r = table_data_requested_width(b, column_b, &w2); + if (r < 0) + return log_error_errno(r, "Failed to query table column width: %m"); + + r = 0; + RET_GATHER(r, table_set_column_width(a, column_a, MAX(w1, w2))); + RET_GATHER(r, table_set_column_width(b, column_b, MAX(w1, w2))); + return r; +} + int table_print(Table *t, FILE *f) { size_t n_rows, *minimum_width, *maximum_width, display_columns, *requested_width, table_minimum_width, table_maximum_width, table_requested_width, table_effective_width, diff --git a/src/shared/format-table.h b/src/shared/format-table.h index 997ac20eb6..9a11fb7c30 100644 --- a/src/shared/format-table.h +++ b/src/shared/format-table.h @@ -141,6 +141,11 @@ int table_set_reverse(Table *t, size_t column, bool b); int table_hide_column_from_display_internal(Table *t, ...); #define table_hide_column_from_display(t, ...) table_hide_column_from_display_internal(t, __VA_ARGS__, SIZE_MAX) +int table_data_requested_width(Table *table, size_t column, size_t *ret); + +int table_set_column_width(Table *t, size_t column, size_t width); +int table_sync_column_width(Table *a, size_t column_a, Table *b, size_t column_b); + int table_print(Table *t, FILE *f); int table_format(Table *t, char **ret);