| 1 | /* |
| 2 | * fgetline.c: implementation of fgetline.h. |
| 3 | */ |
| 4 | |
| 5 | #include <stdio.h> |
| 6 | #include <string.h> |
| 7 | |
| 8 | #include "malloc.h" |
| 9 | #include "fgetline.h" |
| 10 | |
| 11 | char *fgetline(FILE *fp) |
| 12 | { |
| 13 | char *ret = snewn(512, char); |
| 14 | int size = 512, len = 0; |
| 15 | while (fgets(ret + len, size - len, fp)) { |
| 16 | len += strlen(ret + len); |
| 17 | if (ret[len-1] == '\n') |
| 18 | break; /* got a newline, we're done */ |
| 19 | size = len + 512; |
| 20 | ret = sresize(ret, size, char); |
| 21 | } |
| 22 | if (len == 0) { /* first fgets returned NULL */ |
| 23 | sfree(ret); |
| 24 | return NULL; |
| 25 | } |
| 26 | ret[len] = '\0'; |
| 27 | return ret; |
| 28 | } |