X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flinebuffer.c;h=bed5d94fb889b8fd7716a4ed794558243a87b4b8;hb=b3b353659ac863c94e9705047710a99fa58fe0b1;hp=8374a8a880bd6ffa617347ec26fee181d4150d28;hpb=9d2aa9f846f853bc2211d6939580efdad8f34bd8;p=gnulib.git diff --git a/lib/linebuffer.c b/lib/linebuffer.c index 8374a8a88..bed5d94fb 100644 --- a/lib/linebuffer.c +++ b/lib/linebuffer.c @@ -1,5 +1,7 @@ /* linebuffer.c -- read arbitrarily long lines - Copyright (C) 1986, 1991, 1998, 1999, 2001 Free Software Foundation, Inc. + + Copyright (C) 1986, 1991, 1998, 1999, 2001, 2003 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,13 +24,12 @@ #endif #include +#include #include #include "linebuffer.h" #include "unlocked-io.h" #include "xalloc.h" -void free (); - /* Initialize linebuffer LINEBUFFER for use. */ void @@ -44,17 +45,19 @@ 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 * -readline (struct linebuffer *linebuffer, FILE *stream) +readlinebuffer (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)) + if (feof (stream)) return NULL; do @@ -62,7 +65,7 @@ readline (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; @@ -84,11 +87,10 @@ readline (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); }