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
This commit is contained in:
ache 2016-08-22 22:28:41 +00:00
parent cf8c9ca0f9
commit 6198a6ec2f
2 changed files with 7 additions and 24 deletions

View File

@ -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;
if (fp->_r <= 0 && __srefill(fp))
return (WEOF);
}
if (MB_CUR_MAX == 1) {
/* Fast path for single-byte encodings. */
wc = *fp->_p++;
fp->_r--;
*nread = 1;
return (wc);
}
*nread = 0;
do {
nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs);
if (nconv == (size_t)-1)

View File

@ -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 *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);