From b4fee5273ece15d709b8e1e7149f92665a24df3e Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 18 Nov 2009 09:49:57 +0000 Subject: * libc/stdio/vfprintf.c: Include ../stdlib/local.h. Replace call to _mbtowc_r with direct call to __mbtowc. * libc/stdio/vfscanf.c: Ditto. * libc/stdlib/btowc.c: Include local.h. Replace call to _mbtowc_r with direct call to __mbtowc. * libc/stdlib/mblen.c: Ditto. * libc/stdlib/mblen_r.c: Ditto. * libc/stdlib/mbrtowc.c: Ditto. * libc/stdlib/mbstowcs_r.c: Ditto. * libc/stdlib/mbtowc.c: Ditto. * libc/stdlib/wcrtomb.c: Include local.h. Replace call to _wctomb_r with direct call to __wctomb. * libc/stdlib/wcsnrtombs.c: Ditto. (_wcsnrtombs_r): Ditto. * libc/stdlib/wcstombs_r.c: Ditto. * libc/stdlib/wctob.c: Ditto. * libc/stdlib/wctomb.c: Ditto. * libc/stdlib/mbrtowc.c (mbrtowc): Implement independently from _mbrtowc_r, unless PREFER_SIZE_OVER_SPEED or __OPTIMIZE_SIZE__ are defined. * libc/stdlib/wcrtomb.c (wcrtomb): Implement independently from _wcrtomb_r, unless PREFER_SIZE_OVER_SPEED or __OPTIMIZE_SIZE__ are defined. * libc/stdlib/mbtowc_r.c (__utf8_mbtowc): Drop unnecessary test for ch >= 0. --- newlib/libc/stdlib/wcrtomb.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) (limited to 'newlib/libc/stdlib/wcrtomb.c') diff --git a/newlib/libc/stdlib/wcrtomb.c b/newlib/libc/stdlib/wcrtomb.c index 06e487471..60e0d89c8 100644 --- a/newlib/libc/stdlib/wcrtomb.c +++ b/newlib/libc/stdlib/wcrtomb.c @@ -4,6 +4,7 @@ #include #include #include +#include "local.h" size_t _DEFUN (_wcrtomb_r, (ptr, s, wc, ps), @@ -24,9 +25,9 @@ _DEFUN (_wcrtomb_r, (ptr, s, wc, ps), #endif if (s == NULL) - retval = _wctomb_r (ptr, buf, L'\0', ps); + retval = __wctomb (ptr, buf, L'\0', __locale_charset (), ps); else - retval = _wctomb_r (ptr, s, wc, ps); + retval = __wctomb (ptr, s, wc, __locale_charset (), ps); if (retval == -1) { @@ -45,6 +46,33 @@ _DEFUN (wcrtomb, (s, wc, ps), wchar_t wc _AND mbstate_t *ps) { +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) return _wcrtomb_r (_REENT, s, wc, ps); +#else + int retval = 0; + char buf[10]; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(_REENT); + ps = &(_REENT_WCRTOMB_STATE(_REENT)); + } +#endif + + if (s == NULL) + retval = __wctomb (_REENT, buf, L'\0', __locale_charset (), ps); + else + retval = __wctomb (_REENT, s, wc, __locale_charset (), ps); + + if (retval == -1) + { + ps->__count = 0; + _REENT->_errno = EILSEQ; + return (size_t)(-1); + } + else + return (size_t)retval; +#endif /* not PREFER_SIZE_OVER_SPEED */ } #endif /* !_REENT_ONLY */ -- cgit v1.2.3