static inline size_t frem(FILE * fp) { fseek(fp, 0, SEEK_END); return ftell(fp); } static char * slurp(const char * fn, size_t * rlen) { size_t len; FILE * fp = fopen(fn, "r"); char * buf; if (!fp) { PERROR_RETURN("fopen", NULL); } if (!(buf = (char *) malloc((len = frem(fp))))) { PERROR_RETURN("malloc", NULL); } rewind(fp); if (len != fread(buf, 1, len, fp)) { free(buf); { PERROR_RETURN("fopen", NULL); } } *rlen = len; return buf; }