From d34d90a89d0d34657f1de602abb861bba1a571d8 Mon Sep 17 00:00:00 2001 From: "Andrey A. Chernov" Date: Mon, 22 Aug 2016 22:28:41 +0000 Subject: [PATCH] 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 --- lib/libc/stdio/fgetwc.c | 13 ++----------- lib/libc/stdio/fgetwln.c | 18 +++++------------- 2 files changed, 7 insertions(+), 24 deletions(-) diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c index 52bc988f7dc..cf649fd841f 100644 --- a/lib/libc/stdio/fgetwc.c +++ b/lib/libc/stdio/fgetwc.c @@ -79,18 +79,9 @@ __fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale) 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) diff --git a/lib/libc/stdio/fgetwln.c b/lib/libc/stdio/fgetwln.c index 62a2f82e01b..6a92b71ce77 100644 --- a/lib/libc/stdio/fgetwln.c +++ b/lib/libc/stdio/fgetwln.c @@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" -#include #include #include #include "un-namespace.h" @@ -48,39 +47,32 @@ fgetwln_l(FILE * __restrict fp, size_t *lenp, locale_t locale) { 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);