| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #ifndef UTIL_NUMTOSTR_H | ||
| 2 | #define UTIL_NUMTOSTR_H | ||
| 3 | |||
| 4 | #include <stddef.h> | ||
| 5 | #include <stdint.h> | ||
| 6 | #include <sys/types.h> | ||
| 7 | #include "macros.h" | ||
| 8 | |||
| 9 | enum { | ||
| 10 | HRSIZE_MAX = DECIMAL_STR_MAX(uintmax_t) + STRLEN(".99 GiB"), | ||
| 11 | FILESIZE_STR_MAX = HRSIZE_MAX + DECIMAL_STR_MAX(uintmax_t) + STRLEN(" ()"), | ||
| 12 | PRECISE_FILESIZE_STR_MAX = DECIMAL_STR_MAX(uintmax_t) + STRLEN("GiB"), | ||
| 13 | }; | ||
| 14 | |||
| 15 | extern const char hextable[32]; | ||
| 16 | |||
| 17 | // Encode a uint8_t as a string of 2 hexadecimal digits | ||
| 18 | 45 | static inline size_t hex_encode_byte(char out[static 2], uint8_t byte) | |
| 19 | { | ||
| 20 | 45 | const char *hextab_lower = hextable + 16; | |
| 21 | 45 | out[0] = hextab_lower[byte >> 4]; | |
| 22 | 45 | out[1] = hextab_lower[byte & 0xF]; | |
| 23 | 45 | return 2; | |
| 24 | } | ||
| 25 | |||
| 26 | // Encode a uint8_t as a string of 1-3 decimal digits | ||
| 27 | 37 | static inline size_t buf_u8_to_str(uint8_t x, char *buf) | |
| 28 | { | ||
| 29 | // Write 3 digits unconditionally, but adjust the indices to produce | ||
| 30 | // the correct string (x=1 writes to `buf[0]` 3 times) | ||
| 31 | 37 | size_t i = (x >= 100); | |
| 32 | 37 | size_t j = (x >= 10) + i; | |
| 33 | 37 | buf[0] = '0' + ((x / 100) % 10); | |
| 34 | 37 | buf[i] = '0' + ((x / 10) % 10); | |
| 35 | 37 | buf[j] = '0' + (x % 10); | |
| 36 | 37 | return j + 1; | |
| 37 | } | ||
| 38 | |||
| 39 | size_t buf_umax_to_str(uintmax_t x, char *buf) NONNULL_ARGS; | ||
| 40 | size_t buf_umax_to_hex_str(uintmax_t x, char *buf, size_t min_digits) NONNULL_ARGS; | ||
| 41 | size_t buf_uint_to_str(unsigned int x, char *buf) NONNULL_ARGS; | ||
| 42 | const char *umax_to_str(uintmax_t x) RETURNS_NONNULL; | ||
| 43 | const char *uint_to_str(unsigned int x) RETURNS_NONNULL; | ||
| 44 | const char *ulong_to_str(unsigned long x) RETURNS_NONNULL; | ||
| 45 | char *file_permissions_to_str(mode_t mode, char buf[static 10]) NONNULL_ARGS_AND_RETURN; | ||
| 46 | char *human_readable_size(uintmax_t bytes, char buf[static HRSIZE_MAX]) NONNULL_ARGS_AND_RETURN; | ||
| 47 | char *filesize_to_str(uintmax_t bytes, char buf[static FILESIZE_STR_MAX]) NONNULL_ARGS_AND_RETURN; | ||
| 48 | char *filesize_to_str_precise(uintmax_t bytes, char buf[static PRECISE_FILESIZE_STR_MAX]) NONNULL_ARGS_AND_RETURN; | ||
| 49 | |||
| 50 | #endif | ||
| 51 |