summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libc/stdio/fgetwc.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/lib/libc/stdio/fgetwc.c b/lib/libc/stdio/fgetwc.c
index 4463042..eb7426d 100644
--- a/lib/libc/stdio/fgetwc.c
+++ b/lib/libc/stdio/fgetwc.c
@@ -77,30 +77,31 @@ fgetwc(FILE *fp)
static __inline wint_t
__fgetwc_nbf(FILE *fp)
{
- size_t n, nconv;
- int c;
- char cc;
wchar_t wc;
+ size_t nconv;
- n = 0;
- for (;;) {
- if ((c = __sgetc(fp)) == EOF) {
- if (n == 0)
- return (WEOF);
+ if (fp->_r <= 0 && __srefill(fp))
+ return (WEOF);
+ do {
+ nconv = mbrtowc(&wc, fp->_p, fp->_r, &fp->_extra->mbstate);
+ if (nconv == (size_t)-1)
break;
- }
- n++;
- cc = (char)c;
- nconv = mbrtowc(&wc, &cc, 1, &fp->_extra->mbstate);
- if (nconv == (size_t)-2)
+ else if (nconv == (size_t)-2)
continue;
- else if (nconv == (size_t)-1)
- break;
- else if (nconv == 0)
+ else if (nconv == 0) {
+ /*
+ * Assume that the only valid representation of
+ * the null wide character is a single null byte.
+ */
+ fp->_p++;
+ fp->_r--;
return (L'\0');
- else
+ } else {
+ fp->_p += nconv;
+ fp->_r -= nconv;
return (wc);
- }
+ }
+ } while (__srefill(fp) == 0);
fp->_flags |= __SERR;
errno = EILSEQ;
return (WEOF);
OpenPOWER on IntegriCloud