diff options
author | Alexander Larsson <alexl@redhat.com> | 2020-10-27 16:24:39 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2020-10-27 16:27:22 +0100 |
commit | 822c8857de26d629096c24152977a8a52e69592e (patch) | |
tree | 90e2c380d7a1ea3925f550f5a2664685b15155d9 | |
parent | 5d2d1e736b690f479ba7e49d9d16c07d6e1539b2 (diff) | |
download | flatpak-822c8857de26d629096c24152977a8a52e69592e.tar.gz |
table printer: Add some helpers
Allow looking up pre-existing rows (by key) and appending to existing
cells.
-rw-r--r-- | app/flatpak-table-printer.c | 65 | ||||
-rw-r--r-- | app/flatpak-table-printer.h | 11 |
2 files changed, 71 insertions, 5 deletions
diff --git a/app/flatpak-table-printer.c b/app/flatpak-table-printer.c index 271d7efc..a6ab92b4 100644 --- a/app/flatpak-table-printer.c +++ b/app/flatpak-table-printer.c @@ -85,6 +85,7 @@ struct FlatpakTablePrinter { GPtrArray *columns; GPtrArray *rows; + GHashTable *rows_ht; char *key; GPtrArray *current; int n_columns; @@ -97,6 +98,7 @@ flatpak_table_printer_new (void) printer->columns = g_ptr_array_new_with_free_func (free_column); printer->rows = g_ptr_array_new_with_free_func ((GDestroyNotify) free_row); + printer->rows_ht = g_hash_table_new (g_str_hash, g_str_equal); printer->current = g_ptr_array_new_with_free_func (free_cell); return printer; @@ -107,6 +109,7 @@ flatpak_table_printer_free (FlatpakTablePrinter *printer) { g_ptr_array_free (printer->columns, TRUE); g_ptr_array_free (printer->rows, TRUE); + g_hash_table_destroy (printer->rows_ht); g_ptr_array_free (printer->current, TRUE); g_free (printer->key); g_free (printer); @@ -222,6 +225,14 @@ flatpak_table_printer_add_column (FlatpakTablePrinter *printer, } void +flatpak_table_printer_take_column (FlatpakTablePrinter *printer, + char *text) +{ + flatpak_table_printer_add_aligned_column (printer, text, -1); + g_free (text); +} + +void flatpak_table_printer_add_column_len (FlatpakTablePrinter *printer, const char *text, gsize len) @@ -302,10 +313,22 @@ flatpak_table_printer_sort (FlatpakTablePrinter *printer, GCompareFunc cmp) g_ptr_array_sort_with_data (printer->rows, cmp_row, cmp); } +int +flatpak_table_printer_lookup_row (FlatpakTablePrinter *printer, const char *key) +{ + gpointer value; + + if (g_hash_table_lookup_extended (printer->rows_ht, key, NULL, &value)) + return GPOINTER_TO_INT(value); + + return -1; +} + void flatpak_table_printer_finish_row (FlatpakTablePrinter *printer) { Row *row; + int row_nr = flatpak_table_printer_get_current_row (printer); if (printer->current->len == 0) return; /* Ignore empty rows */ @@ -315,6 +338,8 @@ flatpak_table_printer_finish_row (FlatpakTablePrinter *printer) row->cells = g_steal_pointer (&printer->current); row->key = g_steal_pointer (&printer->key); g_ptr_array_add (printer->rows, row); + if (row->key) + g_hash_table_insert (printer->rows_ht, row->key, GINT_TO_POINTER (row_nr)); printer->current = g_ptr_array_new_with_free_func (free_cell); } @@ -706,10 +731,12 @@ set_cell (FlatpakTablePrinter *printer, int r, int c, const char *text, - int align) + int align, + int append) { Row *row; Cell *cell; + char *old; row = (Row *) g_ptr_array_index (printer->rows, r); @@ -718,9 +745,19 @@ set_cell (FlatpakTablePrinter *printer, cell = (Cell *) g_ptr_array_index (row->cells, c); g_assert (cell); - g_free (cell->text); - cell->text = g_strdup (text); + old = cell->text; + if (old != NULL && append) + { + if (append == 2 && *old != 0) + cell->text = g_strconcat (old, ", ", text, NULL); + else + cell->text = g_strconcat (old, text, NULL); + } + else + cell->text = g_strdup (text); cell->align = align; + + g_free (old); } void @@ -729,7 +766,25 @@ flatpak_table_printer_set_cell (FlatpakTablePrinter *printer, int c, const char *text) { - set_cell (printer, r, c, text, -1); + set_cell (printer, r, c, text, -1, 0); +} + +void +flatpak_table_printer_append_cell (FlatpakTablePrinter *printer, + int r, + int c, + const char *text) +{ + set_cell (printer, r, c, text, -1, 1); +} + +void +flatpak_table_printer_append_cell_with_comma (FlatpakTablePrinter *printer, + int r, + int c, + const char *text) +{ + set_cell (printer, r, c, text, -1, 2); } void @@ -744,7 +799,7 @@ flatpak_table_printer_set_decimal_cell (FlatpakTablePrinter *printer, if (decimal) align = decimal - text; - set_cell (printer, r, c, text, align); + set_cell (printer, r, c, text, align, 0); } void diff --git a/app/flatpak-table-printer.h b/app/flatpak-table-printer.h index 8a293bbe..d36c9548 100644 --- a/app/flatpak-table-printer.h +++ b/app/flatpak-table-printer.h @@ -37,6 +37,8 @@ void flatpak_table_printer_set_columns (FlatpakTablePrinter *prin gboolean defaults); void flatpak_table_printer_add_column (FlatpakTablePrinter *printer, const char *text); +void flatpak_table_printer_take_column (FlatpakTablePrinter *printer, + char *text); void flatpak_table_printer_add_aligned_column (FlatpakTablePrinter *printer, const char *text, int align); @@ -57,6 +59,7 @@ void flatpak_table_printer_set_key (FlatpakTablePrinter *printer, void flatpak_table_printer_finish_row (FlatpakTablePrinter *printer); void flatpak_table_printer_sort (FlatpakTablePrinter *printer, GCompareFunc cmp); +int flatpak_table_printer_lookup_row (FlatpakTablePrinter *printer, const char *key); void flatpak_table_printer_print (FlatpakTablePrinter *printer); void flatpak_table_printer_print_full (FlatpakTablePrinter *printer, int skip, @@ -68,6 +71,14 @@ void flatpak_table_printer_set_cell (FlatpakTablePrinter *printer int row, int col, const char *cell); +void flatpak_table_printer_append_cell (FlatpakTablePrinter *printer, + int row, + int col, + const char *cell); +void flatpak_table_printer_append_cell_with_comma (FlatpakTablePrinter *printer, + int row, + int col, + const char *cell); void flatpak_table_printer_set_decimal_cell (FlatpakTablePrinter *printer, int row, int col, |