/** * General purpose, platform agnostic, reusable utils */ #ifndef COMMON_UTILS_UTILS_H #define COMMON_UTILS_UTILS_H #include #include #include "base16.h" #include "datetime.h" #include "hexdump.h" /** Convert a value to BCD struct */ static inline bcd_t num2bcd(uint8_t value) { return (bcd_t) {.ones=value % 10, .tens=value / 10}; } /** Convert unpacked BCD to value */ static inline uint8_t bcd2num(uint8_t tens, uint8_t ones) { return tens * 10 + ones; } /** * Append to a buffer. * * In case the buffer capacity is reached, it stays unchanged (up to the terminator) and NULL is returned. * * @param buf - buffer position to append at; if NULL is given, the function immediately returns NULL. * @param appended - string to append * @param pcap - pointer to a capacity variable * @return the new end of the string (null byte); use as 'buf' for following appends */ char *append(char *buf, const char *appended, size_t *pcap); /** * Test if a file descriptor is valid (e.g. when cleaning up after a failed select) * * @param fd - file descriptor number * @return is valid */ bool fd_is_valid(int fd); /** * parse user-provided string as boolean * * @param str * @return 0 false, 1 true, -1 invalid */ int parse_boolean_arg(const char *str); /** Check equality of two strings; returns bool */ #define streq(a, b) (strcmp((const char*)(a), (const char*)(b)) == 0) /** Check prefix equality of two strings; returns bool */ #define strneq(a, b, n) (strncmp((const char*)(a), (const char*)(b), (n)) == 0) /** Check if a string starts with a substring; returns bool */ #define strstarts(a, b) strneq((a), (b), (int)strlen((b))) #ifndef MIN /** Get min of two numbers */ #define MIN(a, b) ((a) > (b) ? (b) : (a)) #endif #ifndef MAX /** Get max of two values */ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #endif #ifndef STR #define STR_HELPER(x) #x /** Stringify a token */ #define STR(x) STR_HELPER(x) #endif #endif //COMMON_UTILS_UTILS_H