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:
parent
cf8c9ca0f9
commit
6198a6ec2f
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user