#ifndef NCTREF_UTILS_H #define NCTREF_UTILS_H #include #include #include #include #include #include #include inline static size_t djb2(const char *str) { size_t hash = 5381; int c; while((c = *str++)) { hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ } return hash; } inline static bool unstupid_strtol(const char *str, char **endptr, int base, long *result) { errno = 0; char *endptr2 = NULL; *result = strtol(str, &endptr2, base); if(endptr2 == str) { return false; } if(errno == ERANGE) { return false; } if(endptr) { *endptr = endptr2; } return true; } __attribute__((format(printf, 1, 2))) static inline char *malp(const char *fmt, ...) { va_list v1, v2; va_start(v1, fmt); va_copy(v2, v1); size_t len = vsnprintf(NULL, 0, fmt, v1); va_end(v1); va_start(v2, fmt); char *str = malloc(len + 1); vsnprintf(str, len + 1, fmt, v2); str[len] = 0; va_end(v2); return str; } inline static int is_str_equal_check_null(const char *s1, const char *s2) { if (!s1 || !s2) { return 0; } return !strcmp(s1, s2); } #endif