#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); vprintf(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, cpy); va_end(cpy); if (nb < 0) die("Invalid fmtstr!\n"); str = checkp(malloc(nb+1)); va_start(ap, fmtstr); nb = vsnprintf(str, nb+1, fmtstr, ap); va_end(ap); return str; } const char* mhash(const char *str, int len) { static char buf[MHASHLEN + 1]; int i, k, v; char c, *bp; if (!str || !*str) str = "."; if (len == -1) len = strlen(str); for (v = 0, i = 0; i < len; i++) v += str[i]; srand(v); for (bp = buf, i = 0; i < MHASHLEN / 2; i++) bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256)); return buf; } int checkalph(const char *str, const char *alph) { const char *c; for (c = str; *c; c++) if (!strchr(alph, *c)) return FAIL; return OK; } void freadstr(FILE *f, char **dst) { size_t start, len, tmp; char c; start = ftell(f); for (len = 0; (c = fgetc(f)) != EOF && c; len++); fseek(f, start, SEEK_SET); *dst = checkp(calloc(1, len + 1)); tmp = fread(*dst, len, 1, f); fgetc(f); } void fputstr(FILE *f, char *s) { fprintf(f, "%s", s); fputc(0, f); } const char* ask(const char *fmtstr, ...) { static char linebuf[256]; va_list ap; int fail; va_start(ap, fmtstr); vprintf(fmtstr, ap); va_end(ap); fail = !fgets(linebuf, sizeof(linebuf), stdin); if (!fail && *linebuf) { if (linebuf[strlen(linebuf)-1] == '\n') linebuf[strlen(linebuf)-1] = '\0'; if (echo) printf("%s\n", linebuf); } if (fail) errno = EBADMSG; return fail ? "" : linebuf; } void dump(const char *filename) { char buf[256]; FILE *f; int nb; if (!(f = fopen(filename, "r"))) return; while ((nb = fread(buf, 1, sizeof(buf) - 1, f))) printf("%.*s", nb, buf); fclose(f); } int strpfcmp(const char *prefix, const char *str) { return strncmp(prefix, str, strlen(prefix)); }