util.c (2129B)
1#include "util.h" 2 3void* 4checkp(void *p) 5{ 6 if (!p) die("pointer assertion failed, OOM?\n"); 7 return p; 8} 9 10void* 11die(const char *fmtstr, ...) 12{ 13 va_list ap; 14 15 va_start(ap, fmtstr); 16 vprintf(fmtstr, ap); 17 va_end(ap); 18 19 exit(EXIT_FAILURE); 20} 21 22char* 23aprintf(const char *fmtstr, ...) 24{ 25 va_list ap, cpy; 26 size_t nb; 27 char *str; 28 29 va_copy(cpy, ap); 30 31 va_start(cpy, fmtstr); 32 nb = vsnprintf(NULL, 0, fmtstr, cpy); 33 va_end(cpy); 34 35 if (nb < 0) die("Invalid fmtstr!\n"); 36 str = checkp(malloc(nb+1)); 37 38 va_start(ap, fmtstr); 39 nb = vsnprintf(str, nb+1, fmtstr, ap); 40 va_end(ap); 41 42 return str; 43} 44 45const char* 46mhash(const char *str, int len) 47{ 48 static char buf[MHASHLEN + 1]; 49 int i, k, v; 50 char c, *bp; 51 52 if (!str || !*str) str = "."; 53 if (len == -1) len = strlen(str); 54 55 for (v = 0, i = 0; i < len; i++) v += str[i]; 56 57 srand(v); 58 for (bp = buf, i = 0; i < MHASHLEN / 2; i++) 59 bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256)); 60 61 return buf; 62} 63 64int 65checkalph(const char *str, const char *alph) 66{ 67 const char *c; 68 69 for (c = str; *c; c++) 70 if (!strchr(alph, *c)) return FAIL; 71 72 return OK; 73} 74 75void 76freadstr(FILE *f, char **dst) 77{ 78 size_t start, len, tmp; 79 char c; 80 81 start = ftell(f); 82 for (len = 0; (c = fgetc(f)) != EOF && c; len++); 83 fseek(f, start, SEEK_SET); 84 85 *dst = checkp(calloc(1, len + 1)); 86 tmp = fread(*dst, len, 1, f); 87 fgetc(f); 88} 89 90void 91fputstr(FILE *f, char *s) 92{ 93 fprintf(f, "%s", s); 94 fputc(0, f); 95} 96 97const char* 98ask(const char *fmtstr, ...) 99{ 100 static char linebuf[256]; 101 va_list ap; 102 int fail; 103 104 va_start(ap, fmtstr); 105 vprintf(fmtstr, ap); 106 va_end(ap); 107 108 fail = !fgets(linebuf, sizeof(linebuf), stdin); 109 110 if (!fail && *linebuf) { 111 if (linebuf[strlen(linebuf)-1] == '\n') 112 linebuf[strlen(linebuf)-1] = '\0'; 113 if (echo) printf("%s\n", linebuf); 114 } 115 116 if (fail) errno = EBADMSG; 117 118 return fail ? "" : linebuf; 119} 120 121void 122dump(const char *filename) 123{ 124 char buf[256]; 125 FILE *f; 126 int nb; 127 128 if (!(f = fopen(filename, "r"))) return; 129 130 while ((nb = fread(buf, 1, sizeof(buf) - 1, f))) 131 printf("%.*s", nb, buf); 132 133 fclose(f); 134} 135 136int 137strpfcmp(const char *prefix, const char *str) 138{ 139 return strncmp(prefix, str, strlen(prefix)); 140}