#ifndef __PUTIL_H #define __PUTIL_H #include #include #ifdef __cplusplus extern "C" { #endif #include #include #include "pcompiler.h" #define NTO_STR(s) TO_STR(s) #define TO_STR(s) #s #define VAR_ARRAY(name, type, size) type name[size] #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) #define rot(x, k) (((x) << (k)) | ((x) >> (32 - (k)))) #define return_isyncid(err) \ do { \ psync_error = err; \ return PSYNC_INVALID_SYNCID; \ } while (0) extern const char putil_base64_table[]; void putil_wipe(void *mem, size_t sz); void putil_time_format(time_t tm, unsigned long ns, char *result); char *putil_strdup(const char *str) PSYNC_MALLOC PSYNC_NONNULL(1); char *putil_strnormalize_filename(const char *str) PSYNC_MALLOC PSYNC_NONNULL(1); char *putil_strndup(const char *str, size_t len) PSYNC_MALLOC PSYNC_NONNULL(1); char *putil_strcat(const char *str, ...) PSYNC_MALLOC PSYNC_SENTINEL; int putil_slprintf(char *str, size_t size, const char *format, ...) PSYNC_NONNULL(1, 3); unsigned char *putil_base32_encode(const unsigned char *str, size_t length, size_t *ret_length); unsigned char *putil_base32_decode(const unsigned char *str, size_t length, size_t *ret_length); unsigned char *putil_base64_encode(const unsigned char *str, size_t length, size_t *ret_length); unsigned char *putil_base64_decode(const unsigned char *str, size_t length, size_t *ret_length); int putil_is_valid_utf8(const char *str); uint64_t putil_ato64(const char *str); uint32_t putil_ato32(const char *str); static inline size_t putil_strlcpy(char *dst, const char *src, size_t size) { size_t len; len = strlen(src); if (likely(len < size)) { memcpy(dst, src, len + 1); return len; } else if (likely(size)) { memcpy(dst, src, size - 1); dst[size - 1] = 0; return size - 1; } else return 0; } #ifdef __cplusplus } #endif #endif