svn commit: r190773 - in head: lib/libc/stdio
tools/regression/lib/libc/stdio
David Schultz
das at FreeBSD.org
Mon Apr 6 06:50:06 PDT 2009
Author: das
Date: Mon Apr 6 13:50:04 2009
New Revision: 190773
URL: http://svn.freebsd.org/changeset/base/190773
Log:
Return -1 instead of 0 upon reaching EOF. This is somewhat ill-advised
because it means getdelim() returns -1 for both error and EOF, and
never returns 0. However, this is what the original GNU implementation
does, and POSIX inherited the bug.
Reported by: marcus@
Modified:
head/lib/libc/stdio/getdelim.c
head/lib/libc/stdio/getline.3
head/tools/regression/lib/libc/stdio/test-getdelim.c
Modified: head/lib/libc/stdio/getdelim.c
==============================================================================
--- head/lib/libc/stdio/getdelim.c Mon Apr 6 13:14:34 2009 (r190772)
+++ head/lib/libc/stdio/getdelim.c Mon Apr 6 13:50:04 2009 (r190773)
@@ -120,7 +120,6 @@ getdelim(char ** __restrict linep, size_
goto error;
}
- linelen = 0;
if (*linecapp == 0)
*linep = NULL;
@@ -128,9 +127,12 @@ getdelim(char ** __restrict linep, size_
/* If fp is at EOF already, we just need space for the NUL. */
if (__sferror(fp) || expandtofit(linep, 1, linecapp))
goto error;
- goto done;
+ FUNLOCKFILE(fp);
+ (*linep)[0] = '\0';
+ return (-1);
}
+ linelen = 0;
while ((endp = memchr(fp->_p, delim, fp->_r)) == NULL) {
if (sappend(linep, &linelen, linecapp, fp->_p, fp->_r))
goto error;
Modified: head/lib/libc/stdio/getline.3
==============================================================================
--- head/lib/libc/stdio/getline.3 Mon Apr 6 13:14:34 2009 (r190772)
+++ head/lib/libc/stdio/getline.3 Mon Apr 6 13:50:04 2009 (r190773)
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 28, 2009
+.Dd March 29, 2009
.Dt GETLINE 3
.Os
.Sh NAME
@@ -79,7 +79,7 @@ and
functions return the number of characters written, excluding the
terminating
.Dv NUL .
-The value \-1 is returned if an error occurs.
+The value \-1 is returned if an error occurs, or if end-of-file is reached.
.Sh EXAMPLES
The following code fragment reads lines from a file and
writes them to standard output.
Modified: head/tools/regression/lib/libc/stdio/test-getdelim.c
==============================================================================
--- head/tools/regression/lib/libc/stdio/test-getdelim.c Mon Apr 6 13:14:34 2009 (r190772)
+++ head/tools/regression/lib/libc/stdio/test-getdelim.c Mon Apr 6 13:50:04 2009 (r190773)
@@ -100,7 +100,7 @@ main(int argc, char *argv[])
assert(line[0] == '\0' && line[1] == '\0');
/* Third line: EOF */
line[0] = 'X';
- assert(getline(&line, &linecap, fp) == 0);
+ assert(getline(&line, &linecap, fp) == -1);
assert(line[0] == '\0');
free(line);
assert(feof(fp));
@@ -139,7 +139,7 @@ main(int argc, char *argv[])
free(line);
line = NULL;
linecap = 0;
- assert(getline(&line, &linecap, fp) == 0);
+ assert(getline(&line, &linecap, fp) == -1);
assert(line[0] == '\0');
assert(linecap > 0);
assert(errno == 0);
More information about the svn-src-head
mailing list