aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib/wcsrtombs.c
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-02-19 09:19:42 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-02-19 09:19:42 +0000
commit2e10d61ccb8311e75df612a028873f212020057a (patch)
tree9deda8ab3fa78c9da759cb64ea38b111d0653635 /newlib/libc/stdlib/wcsrtombs.c
parent3f60f7e544656eb9f701ca0cf6c4358fe9ae9400 (diff)
downloadnewlib-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.c65
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 */