svn commit: r304641 - head/lib/libc/stdio

Andrey A. Chernov ache at FreeBSD.org
Mon Aug 22 22:28:43 UTC 2016


Author: ache
Date: Mon Aug 22 22:28:41 2016
New Revision: 304641
URL: https://svnweb.freebsd.org/changeset/base/304641

Log:
  1) Back out r304607 case 2). fgetwln() as its pair fgetln() supposed to
  return partial line on any errors. See the comment in fgetln.c.
  Add corresponding comment to fgetwln() too.
  2) Rewrite r304607 case 1).
  3) Remove "Fast path" from __fgetwc_mbs() since it can't detect encoding
  errors and ignores them all.
  
  PR:     212033
  MFC after:      7 days

Modified:
  head/lib/libc/stdio/fgetwc.c
  head/lib/libc/stdio/fgetwln.c

Modified: head/lib/libc/stdio/fgetwc.c
==============================================================================
--- head/lib/libc/stdio/fgetwc.c	Mon Aug 22 21:49:17 2016	(r304640)
+++ head/lib/libc/stdio/fgetwc.c	Mon Aug 22 22:28:41 2016	(r304641)
@@ -79,18 +79,9 @@ __fgetwc_mbs(FILE *fp, mbstate_t *mbs, i
 	size_t nconv;
 	struct xlocale_ctype *l = XLOCALE_CTYPE(locale);
 
-	if (fp->_r <= 0 && __srefill(fp)) {
-		*nread = 0;
-		return (WEOF);
-	}
-	if (MB_CUR_MAX == 1) {
-		/* Fast path for single-byte encodings. */
-		wc = *fp->_p++;
-		fp->_r--;
-		*nread = 1;
-		return (wc);
-	}
 	*nread = 0;
+	if (fp->_r <= 0 && __srefill(fp))
+		return (WEOF);
 	do {
 		nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs);
 		if (nconv == (size_t)-1)

Modified: head/lib/libc/stdio/fgetwln.c
==============================================================================
--- head/lib/libc/stdio/fgetwln.c	Mon Aug 22 21:49:17 2016	(r304640)
+++ head/lib/libc/stdio/fgetwln.c	Mon Aug 22 22:28:41 2016	(r304641)
@@ -33,7 +33,6 @@
 __FBSDID("$FreeBSD$");
 
 #include "namespace.h"
-#include <errno.h>
 #include <stdio.h>
 #include <wchar.h>
 #include "un-namespace.h"
@@ -48,39 +47,32 @@ fgetwln_l(FILE * __restrict fp, size_t *
 {
 	wint_t wc;
 	size_t len;
-	int saverrno;
 	FIX_LOCALE(locale);
 
 	FLOCKFILE(fp);
 	ORIENT(fp, 1);
 
 	len = 0;
-	saverrno = errno;
-	errno = 0;
+	/* WEOF or error: return partial line, see fgetln(3). */
 	while ((wc = __fgetwc(fp, locale)) != WEOF) {
 #define	GROW	512
 		if (len * sizeof(wchar_t) >= fp->_lb._size &&
-		    __slbexpand(fp, (len + GROW) * sizeof(wchar_t)))
+		    __slbexpand(fp, (len + GROW) * sizeof(wchar_t))) {
+			fp->_flags |= __SERR;
 			goto error;
+		}
 		*((wchar_t *)fp->_lb._base + len++) = wc;
 		if (wc == L'\n')
 			break;
-		errno = 0;
 	}
-	if (wc == WEOF && errno != 0)
-		goto error;
-	if (errno == 0)
-		errno = saverrno;
 	if (len == 0)
-		goto eof;
+		goto error;
 
 	FUNLOCKFILE(fp);
 	*lenp = len;
 	return ((wchar_t *)fp->_lb._base);
 
 error:
-	fp->_flags |= __SERR;
-eof:
 	FUNLOCKFILE(fp);
 	*lenp = 0;
 	return (NULL);


More information about the svn-src-head mailing list