]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/shared/format-table.h
Merge pull request #14592 from keszybz/simplifications
[thirdparty/systemd.git] / src / shared / format-table.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 #include <stdbool.h>
5 #include <stdio.h>
6 #include <sys/types.h>
7
8 #include "json.h"
9 #include "macro.h"
10
11 typedef enum TableDataType {
12 TABLE_EMPTY,
13 TABLE_STRING,
14 TABLE_STRV,
15 TABLE_PATH,
16 TABLE_BOOLEAN,
17 TABLE_TIMESTAMP,
18 TABLE_TIMESTAMP_UTC,
19 TABLE_TIMESTAMP_RELATIVE,
20 TABLE_TIMESPAN,
21 TABLE_TIMESPAN_MSEC,
22 TABLE_SIZE,
23 TABLE_BPS,
24 TABLE_INT,
25 TABLE_INT8,
26 TABLE_INT16,
27 TABLE_INT32,
28 TABLE_INT64,
29 TABLE_UINT,
30 TABLE_UINT8,
31 TABLE_UINT16,
32 TABLE_UINT32,
33 TABLE_UINT64,
34 TABLE_PERCENT,
35 TABLE_IFINDEX,
36 TABLE_IN_ADDR, /* Takes a union in_addr_union (or a struct in_addr) */
37 TABLE_IN6_ADDR, /* Takes a union in_addr_union (or a struct in6_addr) */
38 _TABLE_DATA_TYPE_MAX,
39
40 /* The following are not really data types, but commands for table_add_cell_many() to make changes to
41 * a cell just added. */
42 TABLE_SET_MINIMUM_WIDTH,
43 TABLE_SET_MAXIMUM_WIDTH,
44 TABLE_SET_WEIGHT,
45 TABLE_SET_ALIGN_PERCENT,
46 TABLE_SET_ELLIPSIZE_PERCENT,
47 TABLE_SET_COLOR,
48 TABLE_SET_URL,
49 TABLE_SET_UPPERCASE,
50
51 _TABLE_DATA_TYPE_INVALID = -1,
52 } TableDataType;
53
54 /* PIDs are just 32bit signed integers on Linux */
55 #define TABLE_PID TABLE_INT32
56 assert_cc(sizeof(pid_t) == sizeof(int32_t));
57
58 /* UIDs/GIDs are just 32bit unsigned integers on Linux */
59 #define TABLE_UID TABLE_UINT32
60 #define TABLE_GID TABLE_UINT32
61 assert_cc(sizeof(uid_t) == sizeof(uint32_t));
62 assert_cc(sizeof(gid_t) == sizeof(uint32_t));
63
64 typedef struct Table Table;
65 typedef struct TableCell TableCell;
66
67 Table *table_new_internal(const char *first_header, ...) _sentinel_;
68 #define table_new(...) table_new_internal(__VA_ARGS__, NULL)
69 Table *table_new_raw(size_t n_columns);
70 Table *table_unref(Table *t);
71
72 DEFINE_TRIVIAL_CLEANUP_FUNC(Table*, table_unref);
73
74 int table_add_cell_full(Table *t, TableCell **ret_cell, TableDataType type, const void *data, size_t minimum_width, size_t maximum_width, unsigned weight, unsigned align_percent, unsigned ellipsize_percent);
75 static inline int table_add_cell(Table *t, TableCell **ret_cell, TableDataType type, const void *data) {
76 return table_add_cell_full(t, ret_cell, type, data, (size_t) -1, (size_t) -1, (unsigned) -1, (unsigned) -1, (unsigned) -1);
77 }
78 int table_add_cell_stringf(Table *t, TableCell **ret_cell, const char *format, ...) _printf_(3, 4);
79
80 int table_fill_empty(Table *t, size_t until_column);
81
82 int table_dup_cell(Table *t, TableCell *cell);
83
84 int table_set_minimum_width(Table *t, TableCell *cell, size_t minimum_width);
85 int table_set_maximum_width(Table *t, TableCell *cell, size_t maximum_width);
86 int table_set_weight(Table *t, TableCell *cell, unsigned weight);
87 int table_set_align_percent(Table *t, TableCell *cell, unsigned percent);
88 int table_set_ellipsize_percent(Table *t, TableCell *cell, unsigned percent);
89 int table_set_color(Table *t, TableCell *cell, const char *color);
90 int table_set_url(Table *t, TableCell *cell, const char *url);
91 int table_set_uppercase(Table *t, TableCell *cell, bool b);
92
93 int table_update(Table *t, TableCell *cell, TableDataType type, const void *data);
94
95 int table_add_many_internal(Table *t, TableDataType first_type, ...);
96 #define table_add_many(t, ...) table_add_many_internal(t, __VA_ARGS__, _TABLE_DATA_TYPE_MAX)
97
98 void table_set_header(Table *table, bool b);
99 void table_set_width(Table *t, size_t width);
100 void table_set_cell_height_max(Table *t, size_t height);
101 int table_set_empty_string(Table *t, const char *empty);
102 int table_set_display(Table *t, size_t first_column, ...);
103 int table_set_sort(Table *t, size_t first_column, ...);
104 int table_set_reverse(Table *t, size_t column, bool b);
105
106 int table_print(Table *t, FILE *f);
107 int table_format(Table *t, char **ret);
108
109 static inline TableCell* TABLE_HEADER_CELL(size_t i) {
110 return SIZE_TO_PTR(i + 1);
111 }
112
113 size_t table_get_rows(Table *t);
114 size_t table_get_columns(Table *t);
115
116 TableCell *table_get_cell(Table *t, size_t row, size_t column);
117
118 const void *table_get(Table *t, TableCell *cell);
119 const void *table_get_at(Table *t, size_t row, size_t column);
120
121 int table_to_json(Table *t, JsonVariant **ret);
122 int table_print_json(Table *t, FILE *f, JsonFormatFlags json_flags);
123
124 #define table_log_add_error(r) \
125 log_error_errno(r, "Failed to add cell(s) to table: %m")