#include #include #include "getline.h" struct linegetter { FILE *f; char *b; int l; int a; } ; static void lg_save(LINEGETTER *lg, char c) { if (lg->l >= lg->a) lg->b = realloc(lg->b,lg->a=lg->l+8); lg->b[lg->l++] = c; } LINEGETTER *lg_init(FILE *f) { LINEGETTER *lg; lg = malloc(sizeof(LINEGETTER)); lg->f = f; lg->b = 0; lg->a = 0; return(lg); } char *lg_getline(LINEGETTER *lg) { int c; lg->l = 0; while (1) { c = getc(lg->f); switch (c) { case EOF: if (lg->l < 1) return(0); /* fall through */ case '\n': if ((lg->l > 0) && (lg->b[lg->l-1] == '\r')) lg->l --; lg_save(lg,'\0'); return(lg->b); break; default: lg_save(lg,c); break; } } } void lg_done(LINEGETTER *lg) { free(lg->b); free(lg); }