]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
format-table: optionally allow reversing the sort order for a column
authorLennart Poettering <lennart@poettering.net>
Wed, 7 Nov 2018 16:41:32 +0000 (17:41 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 30 Nov 2018 15:46:10 +0000 (16:46 +0100)
src/shared/format-table.c
src/shared/format-table.h

index ce79d19a57f69e4d10a68b60ad4feaaef617e208..59133007e27fac2ba28918e6645341c25b5e4c5f 100644 (file)
@@ -107,6 +107,8 @@ struct Table {
 
         size_t *sort_map;     /* The columns to order rows by, in order of preference. */
         size_t n_sort_map;
+
+        bool *reverse_map;
 };
 
 Table *table_new_raw(size_t n_columns) {
@@ -199,6 +201,7 @@ Table *table_unref(Table *t) {
         free(t->data);
         free(t->display_map);
         free(t->sort_map);
+        free(t->reverse_map);
 
         return mfree(t);
 }
@@ -797,7 +800,7 @@ static int table_data_compare(const size_t *a, const size_t *b, Table *t) {
 
                 r = cell_data_compare(d, *a, dd, *b);
                 if (r != 0)
-                        return r;
+                        return t->reverse_map && t->reverse_map[t->sort_map[i]] ? -r : r;
         }
 
         /* Order identical lines by the order there were originally added in */
@@ -1310,3 +1313,20 @@ size_t table_get_columns(Table *t) {
         assert(t->n_columns > 0);
         return t->n_columns;
 }
+
+int table_set_reverse(Table *t, size_t column, bool b) {
+        assert(t);
+        assert(column < t->n_columns);
+
+        if (!t->reverse_map) {
+                if (!b)
+                        return 0;
+
+                t->reverse_map = new0(bool, t->n_columns);
+                if (!t->reverse_map)
+                        return -ENOMEM;
+        }
+
+        t->reverse_map[column] = b;
+        return 0;
+}
index 2db20840625f0ad71ecec9fbd5b3295adfcc61a9..07cb2351cbd2f751b37b970ddaa4e1f8ad1acfc3 100644 (file)
@@ -53,6 +53,7 @@ void table_set_header(Table *table, bool b);
 void table_set_width(Table *t, size_t width);
 int table_set_display(Table *t, size_t first_column, ...);
 int table_set_sort(Table *t, size_t first_column, ...);
+int table_set_reverse(Table *t, size_t column, bool b);
 
 int table_print(Table *t, FILE *f);
 int table_format(Table *t, char **ret);