#include #include #include #include #include #include "util.h" int vasprintf(char **dest, const char *fmt, va_list ap) { assert(*dest == NULL); char *buf = NULL; size_t len, size; va_list ap2; size = 4096; buf = malloc(size); va_copy(ap2, ap); len = vsnprintf(buf, size, fmt, ap); va_end(ap); if (len >= size) { size = len + 1; buf = realloc(buf, size); va_copy(ap2, ap); len = vsnprintf(buf, size, fmt, ap); va_end(ap2); } if (len < 0 || len >= size) { fprintf(stderr, "asprintf: failed to format buffer"); free(buf); exit(EXIT_FAILURE); } *dest = buf; return len; } int asprintf(char **dest, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = vasprintf(dest, fmt, ap); va_end(ap); return ret; } size_t hash(const char *str, int max_val) { size_t ret = 0; for (const char *p = str; *p != '\0'; p++) { ret += (size_t)*p + ((size_t)*p << 6) + ((size_t)*p << 16); } ret = ret % max_val; return ret; }