mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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
69afce5e64
commit
d34d90a89d
2 changed files with 7 additions and 24 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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…
Reference in a new issue