Pass mbrtowc() and wcrtomb() NULL instead of a pointer to a freshly zeroed
mbstate_t object that they ignore. The zeroing is fairly expensive, and it will never be necessary in these functions; when we support state-dependent encodings, we will pass in a pointer to the file's mbstate_t object, and only zero it at the time the file gets opened.
This commit is contained in:
parent
a69e97d1cc
commit
46a574efa9
@ -78,7 +78,6 @@ static __inline wint_t
|
||||
__fgetwc_nbf(FILE *fp)
|
||||
{
|
||||
char buf[MB_LEN_MAX];
|
||||
mbstate_t mbs;
|
||||
size_t n, nconv;
|
||||
int c;
|
||||
wchar_t wc;
|
||||
@ -91,8 +90,7 @@ __fgetwc_nbf(FILE *fp)
|
||||
break;
|
||||
}
|
||||
buf[n++] = (char)c;
|
||||
memset(&mbs, 0, sizeof(mbs));
|
||||
nconv = mbrtowc(&wc, buf, n, &mbs);
|
||||
nconv = mbrtowc(&wc, buf, n, NULL);
|
||||
if (nconv == n)
|
||||
return (wc);
|
||||
else if (nconv == 0)
|
||||
|
@ -44,7 +44,6 @@ wint_t
|
||||
__fputwc(wchar_t wc, FILE *fp)
|
||||
{
|
||||
char buf[MB_LEN_MAX];
|
||||
mbstate_t mbs;
|
||||
size_t i, len;
|
||||
|
||||
if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) {
|
||||
@ -56,8 +55,7 @@ __fputwc(wchar_t wc, FILE *fp)
|
||||
*buf = (unsigned char)wc;
|
||||
len = 1;
|
||||
} else {
|
||||
memset(&mbs, 0, sizeof(mbs));
|
||||
if ((len = wcrtomb(buf, wc, &mbs)) == (size_t)-1) {
|
||||
if ((len = wcrtomb(buf, wc, NULL)) == (size_t)-1) {
|
||||
fp->_flags |= __SERR;
|
||||
return (WEOF);
|
||||
}
|
||||
|
@ -43,13 +43,11 @@ wint_t
|
||||
__ungetwc(wint_t wc, FILE *fp)
|
||||
{
|
||||
char buf[MB_LEN_MAX];
|
||||
mbstate_t mbs;
|
||||
size_t len;
|
||||
|
||||
if (wc == WEOF)
|
||||
return (WEOF);
|
||||
memset(&mbs, 0, sizeof(mbs));
|
||||
if ((len = wcrtomb(buf, wc, &mbs)) == (size_t)-1) {
|
||||
if ((len = wcrtomb(buf, wc, NULL)) == (size_t)-1) {
|
||||
fp->_flags |= __SERR;
|
||||
return (WEOF);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user