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