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/wcsnrtombs.c | |
parent | 3f60f7e544656eb9f701ca0cf6c4358fe9ae9400 (diff) | |
download | cygnal-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.c | 184 |
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 */ |