/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "format-util.h" #include "memory-util.h" #include "stdio-util.h" assert_cc(DECIMAL_STR_MAX(int) + 1 <= IF_NAMESIZE + 1); char *format_ifname_full(int ifindex, char buf[static IF_NAMESIZE + 1], FormatIfnameFlag flag) { /* Buffer is always cleared */ memzero(buf, IF_NAMESIZE + 1); if (if_indextoname(ifindex, buf)) return buf; if (!FLAGS_SET(flag, FORMAT_IFNAME_IFINDEX)) return NULL; if (FLAGS_SET(flag, FORMAT_IFNAME_IFINDEX_WITH_PERCENT)) snprintf(buf, IF_NAMESIZE + 1, "%%%d", ifindex); else snprintf(buf, IF_NAMESIZE + 1, "%d", ifindex); return buf; } char *format_bytes_full(char *buf, size_t l, uint64_t t, FormatBytesFlag flag) { typedef struct { const char *suffix; uint64_t factor; } suffix_table; static const suffix_table table_iec[] = { { "E", UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024) }, { "P", UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024) }, { "T", UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024) }, { "G", UINT64_C(1024)*UINT64_C(1024)*UINT64_C(1024) }, { "M", UINT64_C(1024)*UINT64_C(1024) }, { "K", UINT64_C(1024) }, }, table_si[] = { { "E", UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000) }, { "P", UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000) }, { "T", UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000) }, { "G", UINT64_C(1000)*UINT64_C(1000)*UINT64_C(1000) }, { "M", UINT64_C(1000)*UINT64_C(1000) }, { "K", UINT64_C(1000) }, }; const suffix_table *table; size_t n, i; assert_cc(ELEMENTSOF(table_iec) == ELEMENTSOF(table_si)); if (t == (uint64_t) -1) return NULL; table = flag & FORMAT_BYTES_USE_IEC ? table_iec : table_si; n = ELEMENTSOF(table_iec); for (i = 0; i < n; i++) if (t >= table[i].factor) { if (flag & FORMAT_BYTES_BELOW_POINT) { snprintf(buf, l, "%" PRIu64 ".%" PRIu64 "%s", t / table[i].factor, i != n - 1 ? (t / table[i + 1].factor * UINT64_C(10) / table[n - 1].factor) % UINT64_C(10): (t * UINT64_C(10) / table[i].factor) % UINT64_C(10), table[i].suffix); } else snprintf(buf, l, "%" PRIu64 "%s", t / table[i].factor, table[i].suffix); goto finish; } snprintf(buf, l, "%" PRIu64 "%s", t, flag & FORMAT_BYTES_TRAILING_B ? "B" : ""); finish: buf[l-1] = 0; return buf; }