summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdlib/wcsnrtombs.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/wcsnrtombs.c
parent3f60f7e544656eb9f701ca0cf6c4358fe9ae9400 (diff)
downloadcygnal-2e10d61ccb8311e75df612a028873f212020057a.tar.gz
cygnal-2e10d61ccb8311e75df612a028873f212020057a.tar.bz2
cygnal-2e10d61ccb8311e75df612a028873f212020057a.zip
* 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/wcsnrtombs.c')
-rw-r--r--newlib/libc/stdlib/wcsnrtombs.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/newlib/libc/stdlib/wcsnrtombs.c b/newlib/libc/stdlib/wcsnrtombs.c
new file mode 100644
index 000000000..a8e6901a3
--- /dev/null
+++ b/newlib/libc/stdlib/wcsnrtombs.c
@@ -0,0 +1,184 @@
+/*
+FUNCTION
+<<wcsrtombs>>, <<wcsnrtombs>>---convert a wide-character string to a character string
+
+INDEX
+ wcsrtombs
+INDEX
+ _wcsrtombs_r
+INDEX
+ wcsnrtombs
+INDEX
+ _wcsnrtombs_r
+
+ANSI_SYNOPSIS
+ #include <wchar.h>
+ size_t wcsrtombs(char *<[dst]>, const wchar_t **<[src]>, size_t <[len]>,
+ mbstate_t *<[ps]>);
+
+ #include <wchar.h>
+ size_t _wcsrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
+ const wchar_t **<[src]>, size_t <[len]>,
+ mbstate_t *<[ps]>);
+
+ #include <wchar.h>
+ size_t wcsnrtombs(char *<[dst]>, const wchar_t **<[src]>,
+ size_t <[nwc]>, size_t <[len]>, mbstate_t *<[ps]>);
+
+ #include <wchar.h>
+ size_t _wcsnrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
+ const wchar_t **<[src]>, size_t <[nwc]>,
+ size_t <[len]>, mbstate_t *<[ps]>);
+
+TRAD_SYNOPSIS
+ #include <wchar.h>
+ size_t wcsrtombs(<[dst]>, <[src]>, <[len]>, <[ps]>)
+ char *<[dst]>;
+ const wchar_t **<[src]>;
+ size_t <[len]>;
+ mbstate_t *<[ps]>;
+
+ #include <wchar.h>
+ size_t _wcsrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
+ struct _rent *<[ptr]>;
+ char *<[dst]>;
+ const wchar_t **<[src]>;
+ size_t <[len]>;
+ mbstate_t *<[ps]>;
+
+ #include <wchar.h>
+ size_t wcsnrtombs(<[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
+ char *<[dst]>;
+ const wchar_t **<[src]>;
+ size_t <[nwc]>;
+ size_t <[len]>;
+ mbstate_t *<[ps]>;
+
+ #include <wchar.h>
+ size_t _wcsnrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
+ struct _rent *<[ptr]>;
+ char *<[dst]>;
+ const wchar_t **<[src]>;
+ size_t <[nwc]>;
+ size_t <[len]>;
+ mbstate_t *<[ps]>;
+
+DESCRIPTION
+The <<wcsrtombs>> function converts a string of wide characters indirectly
+pointed to by <[src]> to a corresponding multibyte character string stored in
+the array pointed to by <[dst}>. No more than <[len]> bytes are written to
+<[dst}>.
+
+If <[dst}> is NULL, no characters are stored.
+
+If <[dst}> is not NULL, the pointer pointed to by <[src]> is updated to point
+to the character after the one that conversion stopped at. If conversion
+stops because a null character is encountered, *<[src]> is set to NULL.
+
+The mbstate_t argument, <[ps]>, is used to keep track of the shift state. If
+it is NULL, <<wcsrtombs>> uses an internal, static mbstate_t object, which
+is initialized to the initial conversion state at program startup.
+
+The <<wcsnrtombs>> function behaves identically to <<wcsrtombs>>, except that
+conversion stops after reading at most <[nwc]> characters from the buffer
+pointed to by <[src]>.
+
+RETURNS
+The <<wcsrtombs>> and <<wcsnrtombs>> functions return the number of bytes
+stored in the array pointed to by <[dst]> (not including any terminating
+null), if successful, otherwise it returns (size_t)-1.
+
+PORTABILITY
+<<wcsrtombs>> is defined by C99 standard.
+<<wcsnrtombs>> is defined by the POSIX.1-2008 standard.
+*/
+
+#include <reent.h>
+#include <newlib.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+size_t
+_DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
+ struct _reent *r _AND
+ char *dst _AND
+ const wchar_t **src _AND
+ size_t nwc _AND
+ 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 && nwc-- > 0)
+ {
+ 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;
+}
+
+#ifndef _REENT_ONLY
+size_t
+_DEFUN (wcsnrtombs, (dst, src, nwc, len, ps),
+ char *dst _AND
+ const wchar_t **src _AND
+ size_t nwc _AND
+ size_t len _AND
+ mbstate_t *ps)
+{
+ return _wcsnrtombs_r (_REENT, dst, src, nwc, len, ps);
+}
+#endif /* !_REENT_ONLY */