summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/fgetwc.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>2016-08-27 10:34:01 +0000
committerache <ache@FreeBSD.org>2016-08-27 10:34:01 +0000
commit7767fddf9fce411b32f1cc6cc3b725dc57dead47 (patch)
treeec303e5e12bcee42a6b93b2ab65b9c4ba65faba5 /lib/libc/stdio/fgetwc.c
parentd5deef2805b5b8f2ca41fbe42c1456e9ab6a2534 (diff)
downloadFreeBSD-src-7767fddf9fce411b32f1cc6cc3b725dc57dead47.zip
FreeBSD-src-7767fddf9fce411b32f1cc6cc3b725dc57dead47.tar.gz
MFC r304607,r304641,r304819,r304811
1) Don't forget to set __SERR on __slbexpand() error. 2) Remove "Fast path" from fgetwc()/fputwc() since it can't detect encoding errors and ignores them all. One of affected encoding example: US-ASCII 3) Original fgetln() from 44lite return success for line tail errors, i.e. partial line, but set __SERR and errno in the same time, which is inconsistent. Now both OpenBSD and NetBSD return failure, i.e. no line and set error indicators for such case, so make our fgetln() and fgetwln() (as its wide version) compatible with the rest of *BSD. PR: 212033
Diffstat (limited to 'lib/libc/stdio/fgetwc.c')
-rw-r--r--lib/libc/stdio/fgetwc.c13
1 files changed, 2 insertions, 11 deletions
diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c
index 52bc988..cf649fd 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)
OpenPOWER on IntegriCloud