1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "analyze.h"
4 #include "analyze-timestamp.h"
5 #include "format-table.h"
6 #include "terminal-util.h"
7
test_timestamp_one(const char * p)8 static int test_timestamp_one(const char *p) {
9 _cleanup_(table_unrefp) Table *table = NULL;
10 TableCell *cell;
11 usec_t usec;
12 int r;
13
14 r = parse_timestamp(p, &usec);
15 if (r < 0) {
16 log_error_errno(r, "Failed to parse \"%s\": %m", p);
17 time_parsing_hint(p, /* calendar= */ true, /* timestamp= */ false, /* timespan= */ true);
18 return r;
19 }
20
21 table = table_new("name", "value");
22 if (!table)
23 return log_oom();
24
25 table_set_header(table, false);
26
27 assert_se(cell = table_get_cell(table, 0, 0));
28 r = table_set_ellipsize_percent(table, cell, 100);
29 if (r < 0)
30 return r;
31
32 r = table_set_align_percent(table, cell, 100);
33 if (r < 0)
34 return r;
35
36 assert_se(cell = table_get_cell(table, 0, 1));
37 r = table_set_ellipsize_percent(table, cell, 100);
38 if (r < 0)
39 return r;
40
41 r = table_add_many(table,
42 TABLE_STRING, "Original form:",
43 TABLE_STRING, p,
44 TABLE_STRING, "Normalized form:",
45 TABLE_TIMESTAMP, usec,
46 TABLE_SET_COLOR, ansi_highlight_blue());
47 if (r < 0)
48 return table_log_add_error(r);
49
50 if (!in_utc_timezone()) {
51 r = table_add_many(table,
52 TABLE_STRING, "(in UTC):",
53 TABLE_TIMESTAMP_UTC, usec);
54 if (r < 0)
55 return table_log_add_error(r);
56 }
57
58 r = table_add_cell(table, NULL, TABLE_STRING, "UNIX seconds:");
59 if (r < 0)
60 return table_log_add_error(r);
61
62 if (usec % USEC_PER_SEC == 0)
63 r = table_add_cell_stringf(table, NULL, "@%"PRI_USEC,
64 usec / USEC_PER_SEC);
65 else
66 r = table_add_cell_stringf(table, NULL, "@%"PRI_USEC".%06"PRI_USEC"",
67 usec / USEC_PER_SEC,
68 usec % USEC_PER_SEC);
69 if (r < 0)
70 return r;
71
72 r = table_add_many(table,
73 TABLE_STRING, "From now:",
74 TABLE_TIMESTAMP_RELATIVE, usec);
75 if (r < 0)
76 return table_log_add_error(r);
77
78 return table_print(table, NULL);
79 }
80
verb_timestamp(int argc,char * argv[],void * userdata)81 int verb_timestamp(int argc, char *argv[], void *userdata) {
82 int ret = 0, r;
83
84 STRV_FOREACH(p, strv_skip(argv, 1)) {
85 r = test_timestamp_one(*p);
86 if (ret == 0 && r < 0)
87 ret = r;
88
89 if (*(p + 1))
90 putchar('\n');
91 }
92
93 return ret;
94 }
95