X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flinebuffer.c;h=bed5d94fb889b8fd7716a4ed794558243a87b4b8;hb=52f70a4b2fae0a54ed61898709994ec37e666f0a;hp=e169a989d569a01344f749d94f8e7da7e159b5d6;hpb=a9b64ea6a96fe625db5332f5e2b3e5f968704af7;p=gnulib.git diff --git a/lib/linebuffer.c b/lib/linebuffer.c index e169a989d..bed5d94fb 100644 --- a/lib/linebuffer.c +++ b/lib/linebuffer.c @@ -45,7 +45,9 @@ initbuffer (struct linebuffer *linebuffer) that ends in a non-newline character. Do not null terminate. 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. + Return NULL when stream is empty. Return NULL and set errno upon + error; callers can distinguish this case from the empty case by + invoking ferror (stream). Otherwise, return LINEBUFFER. */ struct linebuffer * readlinebuffer (struct linebuffer *linebuffer, FILE *stream) @@ -55,7 +57,7 @@ readlinebuffer (struct linebuffer *linebuffer, FILE *stream) char *p = linebuffer->buffer; char *end = buffer + linebuffer->size; /* Sentinel. */ - if (feof (stream) || ferror (stream)) + if (feof (stream)) return NULL; do @@ -63,7 +65,7 @@ readlinebuffer (struct linebuffer *linebuffer, FILE *stream) c = getc (stream); if (c == EOF) { - if (p == buffer) + if (p == buffer || ferror (stream)) return NULL; if (p[-1] == '\n') break; @@ -85,11 +87,10 @@ readlinebuffer (struct linebuffer *linebuffer, FILE *stream) return linebuffer; } -/* Free linebuffer LINEBUFFER and its data, all allocated with malloc. */ +/* Free the buffer that was allocated for linebuffer LINEBUFFER. */ void freebuffer (struct linebuffer *linebuffer) { free (linebuffer->buffer); - free (linebuffer); }