diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-02-19 09:19:42 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-02-19 09:19:42 +0000 |
commit | 2e10d61ccb8311e75df612a028873f212020057a (patch) | |
tree | 9deda8ab3fa78c9da759cb64ea38b111d0653635 /newlib/libc/stdlib/wcsrtombs.c | |
parent | 3f60f7e544656eb9f701ca0cf6c4358fe9ae9400 (diff) | |
download | newlib-2e10d61ccb8311e75df612a028873f212020057a.zip newlib-2e10d61ccb8311e75df612a028873f212020057a.tar.gz newlib-2e10d61ccb8311e75df612a028873f212020057a.tar.bz2 |
* libc/include/wchar.h (mbsnrtowcs): Declare.
(_mbsnrtowcs_r): Declare.
(wcsnrtombs): Declare.
(_wcsnrtombs_r): Declare.
* libc/stdlib/Makefile.am (ELIX_2_SOURCES): Add mbsnrtowcs.c
and wcsnrtombs.c.
* libc/stdlib/Makefile.in: Regenerate.
* libc/stdlib/mbsnrtowcs.c: New file, implementing _mbsnrtowcs_r
and mbsnrtowcs. Document mbsnrtowcs and mbsrtowcs.
* libc/stdlib/mbsrtowcs.c (_mbsrtowcs_r): Just call _mbsnrtowcs_r.
(mbsrtowcs): Ditto.
* libc/stdlib/wcsnrtombs.c: New file, implementing _wcsnrtombs_r
and wcsnrtombs. Document wcsrtombs and wcsnrtombs.
* libc/stdlib/wcsrtombs.c (_wcsrtombs_r): Just call _wcsnrtombs_r.
(wcsrtombs): Ditto.
* libc/stdlib/stdlib.tex: Accommodate new documentation.
Diffstat (limited to 'newlib/libc/stdlib/wcsrtombs.c')
-rw-r--r-- | newlib/libc/stdlib/wcsrtombs.c | 65 |
1 files changed, 2 insertions, 63 deletions
diff --git a/newlib/libc/stdlib/wcsrtombs.c b/newlib/libc/stdlib/wcsrtombs.c index a16d36c..ea6bd9d 100644 --- a/newlib/libc/stdlib/wcsrtombs.c +++ b/newlib/libc/stdlib/wcsrtombs.c @@ -1,9 +1,6 @@ #include <reent.h> #include <newlib.h> #include <wchar.h> -#include <stdlib.h> -#include <stdio.h> -#include <errno.h> size_t _DEFUN (_wcsrtombs_r, (r, dst, src, len, ps), @@ -13,65 +10,7 @@ _DEFUN (_wcsrtombs_r, (r, dst, src, len, ps), size_t len _AND mbstate_t *ps) { - char *ptr = dst; - char buff[10]; - wchar_t *pwcs; - size_t n; - int i; - -#ifdef _MB_CAPABLE - if (ps == NULL) - { - _REENT_CHECK_MISC(r); - ps = &(_REENT_WCSRTOMBS_STATE(r)); - } -#endif - - /* If no dst pointer, treat len as maximum possible value. */ - if (dst == NULL) - len = (size_t)-1; - - n = 0; - pwcs = (wchar_t *)(*src); - - while (n < len) - { - int count = ps->__count; - wint_t wch = ps->__value.__wch; - int bytes = _wcrtomb_r (r, buff, *pwcs, ps); - if (bytes == -1) - { - r->_errno = EILSEQ; - ps->__count = 0; - return (size_t)-1; - } - if (n + bytes <= len) - { - n += bytes; - if (dst) - { - for (i = 0; i < bytes; ++i) - *ptr++ = buff[i]; - ++(*src); - } - if (*pwcs++ == 0x00) - { - if (dst) - *src = NULL; - ps->__count = 0; - return n - 1; - } - } - else - { - /* not enough room, we must back up state to before _wctomb_r call */ - ps->__count = count; - ps->__value.__wch = wch; - len = 0; - } - } - - return n; + return _wcsnrtombs_r (r, dst, src, (size_t) -1, len, ps); } #ifndef _REENT_ONLY @@ -82,6 +21,6 @@ _DEFUN (wcsrtombs, (dst, src, len, ps), size_t len _AND mbstate_t *ps) { - return _wcsrtombs_r (_REENT, dst, src, len, ps); + return _wcsnrtombs_r (_REENT, dst, src, (size_t) -1, len, ps); } #endif /* !_REENT_ONLY */ |