diff options
Diffstat (limited to 'newlib/libc/stdlib/mbrtowc.c')
-rw-r--r-- | newlib/libc/stdlib/mbrtowc.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/newlib/libc/stdlib/mbrtowc.c b/newlib/libc/stdlib/mbrtowc.c index 7934ca117..0db1208d0 100644 --- a/newlib/libc/stdlib/mbrtowc.c +++ b/newlib/libc/stdlib/mbrtowc.c @@ -6,24 +6,46 @@ #include <string.h> size_t -mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps) +_DEFUN (_mbrtowc_r, (ptr, pwc, s, n, ps), + struct _reent *ptr _AND + wchar_t *pwc _AND + const char *s _AND + size_t n _AND + mbstate_t *ps) { int retval = 0; - _REENT_CHECK_MISC(_REENT); + +#ifdef MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(ptr); + ps = &(_REENT_MBRTOWC_STATE(ptr)); + } +#endif if (s == NULL) - retval = _mbtowc_r (_REENT, pwc, "", 1, ps); + retval = _mbtowc_r (ptr, pwc, "", 1, ps); else - retval = _mbtowc_r (_REENT, pwc, s, n, ps); - - if (*pwc == NULL) - memset (ps, '\0', sizeof (mbstate_t)); + retval = _mbtowc_r (ptr, pwc, s, n, ps); if (retval == -1) { - _REENT->_errno = EILSEQ; + ps->__count = 0; + ptr->_errno = EILSEQ; return (size_t)(-1); } else return (size_t)retval; } + +#ifndef _REENT_ONLY +size_t +_DEFUN (mbrtowc, (pwc, s, n, ps), + wchar_t *pwc _AND + const char *s _AND + size_t n _AND + mbstate_t *ps) +{ + return _mbrtowc_r (_REENT, pwc, s, n, ps); +} +#endif /* !_REENT_ONLY */ |