#include #include #include #include #include char * fgetln(stream, len) FILE *stream; size_t *len; { static char *buffer = NULL; static size_t buflen = 0; if (buflen == 0) { buflen = 512; if ((buffer = malloc(buflen+1)) == NULL) { fprintf(stderr, "malloc: %s (%zu)\n", strerror(errno), buflen+1); exit(2); } } if (fgets(buffer, buflen+1, stream) == NULL) return NULL; *len = strlen(buffer); while (*len == buflen && buffer[*len-1] != '\n') { if ((buffer = realloc(buffer, 2*buflen+1)) == NULL) { fprintf(stderr, "realloc: %s (%zu)\n", strerror(errno), 2*buflen+1); exit(2); } if (fgets(buffer + buflen, buflen + 1, stream) == NULL) return NULL; *len += strlen(buffer + buflen); buflen *= 2; } return buffer; }