diff options
Diffstat (limited to 'service/src/util.c')
| -rw-r--r-- | service/src/util.c | 66 |
1 files changed, 62 insertions, 4 deletions
diff --git a/service/src/util.c b/service/src/util.c index 946bc19..7d3317b 100644 --- a/service/src/util.c +++ b/service/src/util.c @@ -29,14 +29,14 @@ aprintf(const char *fmtstr, ...) va_copy(cpy, ap); va_start(cpy, fmtstr); - nb = vsnprintf(NULL, 0, fmtstr, ap); + nb = vsnprintf(NULL, 0, fmtstr, cpy); va_end(cpy); - if (nb <= 0) die("encountered invalid fmtstr!\n"); + if (nb <= 0) die("Invalid fmtstr!\n"); + str = checkp(malloc(nb+1)); - str = checkp(malloc(nb)); va_start(ap, fmtstr); - nb = vsnprintf(str, nb, fmtstr, ap); + nb = vsnprintf(str, nb+1, fmtstr, ap); va_end(ap); return str; @@ -71,4 +71,62 @@ mhash(const char *filename, int len) return buf; } +void +freadstr(FILE *f, char **dst) +{ + size_t start, len; + char c; + + start = ftell(f); + while ((c = fgetc(f)) != EOF && c) len++; + + *dst = calloc(len + 1, 1); + fread(*dst, len, 1, 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[strlen(linebuf) - 1] = '\0'; + + 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), f))) + printf("%.*s\n", nb, buf); + + fclose(f); +} + +int +strpfcmp(const char *prefix, const char *str) +{ + return strncmp(prefix, str, strlen(prefix)); +} |
