#include "util.h" void* checkp(void *p) { if (!p) die("pointer assertion failed, OOM?\n"); return p; } void* die(const char *fmtstr, ...) { va_list ap; va_start(ap, fmtstr); vfprintf(stderr, fmtstr, ap); va_end(ap); exit(EXIT_FAILURE); } char* aprintf(const char *fmtstr, ...) { va_list ap, cpy; size_t nb; char *str; va_copy(cpy, ap); va_start(cpy, fmtstr); nb = vsnprintf(NULL, 0, fmtstr, ap); va_end(cpy); if (nb <= 0) die("encountered invalid fmtstr!\n"); str = checkp(malloc(nb)); va_start(ap, fmtstr); nb = vsnprintf(str, nb, fmtstr, ap); va_end(ap); return str; } const char* mhash(const char *filename, int len) { static const char *hexalph = "0123456789ABCDEF"; static char buf[33]; int i, k; if (len == -1) len = strlen(filename); for (i = 0; i < MIN(32, len); i++) { unsigned char v = 0; for (k = i; k < len; k += 32) v ^= filename[k]; buf[i*2+0] = hexalph[(v >> 0) & 0x0f]; buf[i*2+1] = hexalph[(v >> 4) & 0x0f]; } if (i == 0) { memset(buf, '0', 32); } else if (i < 32) { for (k = 0; k < 32; k++) buf[k] = buf[k % i]; } buf[32] = '\0'; return buf; }