--- linebuffer.h Mon Aug 7 16:48:18 2000 +++ linebuffer-getline.h Tue Apr 2 09:11:13 2002 @@ -41,7 +41,10 @@ /* Read an arbitrarily long line of text from STREAM into LINEBUFFER. Keep the newline; append a newline if it's the last line of a file that ends in a non-newline character. Do not null terminate. - Return LINEBUFFER, except at end of file return 0. */ + Therefore the stream can contain NUL bytes, and the length + (including the newline) is returned in linebuffer->length. + Return NULL upon error, or when STREAM is empty. + Otherwise, return LINEBUFFER. */ struct linebuffer *readline PARAMS ((struct linebuffer *linebuffer, FILE *stream)); --- linebuffer.c Mon Dec 10 00:13:15 2001 +++ linebuffer-getline.c Tue Apr 2 09:16:01 2002 @@ -24,7 +24,6 @@ #include #include #include "linebuffer.h" -#include "unlocked-io.h" #include "xalloc.h" void free (); @@ -49,38 +48,15 @@ struct linebuffer * readline (struct linebuffer *linebuffer, FILE *stream) { - int c; - char *buffer = linebuffer->buffer; - char *p = linebuffer->buffer; - char *end = buffer + linebuffer->size; /* Sentinel. */ - - if (feof (stream) || ferror (stream)) + ssize_t tmp_len; + if ((tmp_len=getline(&linebuffer->buffer, &linebuffer->size, stream)) <= 0) return NULL; - - do + linebuffer->length=tmp_len; + if (linebuffer->buffer[tmp_len-1] != '\n') { - c = getc (stream); - if (c == EOF) - { - if (p == buffer) - return NULL; - if (p[-1] == '\n') - break; - c = '\n'; - } - if (p == end) - { - linebuffer->size *= 2; - buffer = xrealloc (buffer, linebuffer->size); - p = p - linebuffer->buffer + buffer; - linebuffer->buffer = buffer; - end = buffer + linebuffer->size; - } - *p++ = c; + linebuffer->buffer[tmp_len] = '\n'; + linebuffer->length++; } - while (c != '\n'); - - linebuffer->length = p - buffer; return linebuffer; }