#pragma once #include #include static char * drain(FILE *fp, size_t *osize) { if (fseek(fp, 0, SEEK_END) < 0) { perror("drain:SEEK_END"); return NULL; } size_t size = ftell(fp); if (fseek(fp, 0, SEEK_SET) < 0) { perror("drain:SEEK_SET"); return NULL; } char *const s = malloc(size + 1); if (s == NULL) { perror("drain:malloc"); return NULL; } if (fread(s, 1, size, fp) != size) { perror("drain:fread"); free(s); return NULL; } s[size] = '\0'; if (osize != NULL) *osize = size; return s; } static char * drain_stdin(size_t *osize) { size_t size = 256; char *data = malloc(size); if (data == NULL) { perror("drain_stdin:malloc"); return NULL; } size_t i = 0; for (;; i++) { if (i >= size) { size *= 2; char *const hold = data; data = realloc(data, size); if (data == NULL) { perror("drain_stdin:realloc"); free(hold); return NULL; } } int c = getchar(); if (c == EOF) break; data[i] = c; } data[i] = '\0'; if (osize != NULL) *osize = i; return data; }