2009-02-19 17:19:42 +08:00
|
|
|
/*
|
|
|
|
FUNCTION
|
|
|
|
<<mbsrtowcs>>, <<mbsnrtowcs>>---convert a character string to a wide-character string
|
|
|
|
|
|
|
|
INDEX
|
|
|
|
mbsrtowcs
|
|
|
|
INDEX
|
|
|
|
_mbsrtowcs_r
|
|
|
|
INDEX
|
|
|
|
mbsnrtowcs
|
|
|
|
INDEX
|
|
|
|
_mbsnrtowcs_r
|
|
|
|
|
2017-11-30 16:17:18 +08:00
|
|
|
SYNOPSIS
|
2009-02-19 17:19:42 +08:00
|
|
|
#include <wchar.h>
|
2013-11-27 01:21:01 +08:00
|
|
|
size_t mbsrtowcs(wchar_t *__restrict <[dst]>,
|
|
|
|
const char **__restrict <[src]>,
|
|
|
|
size_t <[len]>,
|
|
|
|
mbstate_t *__restrict <[ps]>);
|
2009-02-19 17:19:42 +08:00
|
|
|
|
|
|
|
#include <wchar.h>
|
|
|
|
size_t _mbsrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
|
|
|
|
const char **<[src]>, size_t <[len]>,
|
|
|
|
mbstate_t *<[ps]>);
|
|
|
|
|
|
|
|
#include <wchar.h>
|
2013-11-27 01:21:01 +08:00
|
|
|
size_t mbsnrtowcs(wchar_t *__ restrict <[dst]>,
|
|
|
|
const char **__restrict <[src]>, size_t <[nms]>,
|
|
|
|
size_t <[len]>, mbstate_t *__restrict <[ps]>);
|
2009-02-19 17:19:42 +08:00
|
|
|
|
|
|
|
#include <wchar.h>
|
|
|
|
size_t _mbsnrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
|
|
|
|
const char **<[src]>, size_t <[nms]>,
|
|
|
|
size_t <[len]>, mbstate_t *<[ps]>);
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
The <<mbsrtowcs>> function converts a sequence of multibyte characters
|
|
|
|
pointed to indirectly by <[src]> into a sequence of corresponding wide
|
|
|
|
characters and stores at most <[len]> of them in the wchar_t array pointed
|
|
|
|
to by <[dst]>, until it encounters a terminating null character ('\0').
|
|
|
|
|
|
|
|
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, <<mbsrtowcs>> uses an internal, static mbstate_t object, which
|
|
|
|
is initialized to the initial conversion state at program startup.
|
|
|
|
|
|
|
|
The <<mbsnrtowcs>> function behaves identically to <<mbsrtowcs>>, except that
|
|
|
|
conversion stops after reading at most <[nms]> bytes from the buffer pointed
|
|
|
|
to by <[src]>.
|
|
|
|
|
|
|
|
RETURNS
|
|
|
|
The <<mbsrtowcs>> and <<mbsnrtowcs>> functions return the number of wide
|
|
|
|
characters stored in the array pointed to by <[dst]> if successful, otherwise
|
|
|
|
it returns (size_t)-1.
|
|
|
|
|
|
|
|
PORTABILITY
|
|
|
|
<<mbsrtowcs>> is defined by the C99 standard.
|
|
|
|
<<mbsnrtowcs>> 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>
|
|
|
|
|
Add --enable-newlib-reent-thread-local option
By default, Newlib uses a huge object of type struct _reent to store
thread-specific data. This object is returned by __getreent() if the
__DYNAMIC_REENT__ Newlib configuration option is defined.
The reentrancy structure contains for example errno and the standard input,
output, and error file streams. This means that if an application only uses
errno it has a dependency on the file stream support even if it does not use
it. This is an issue for lower end targets and applications which need to
qualify the software according to safety standards (for example ECSS-E-ST-40C,
ECSS-Q-ST-80C, IEC 61508, ISO 26262, DO-178, DO-330, DO-333).
If the new _REENT_THREAD_LOCAL configuration option is enabled, then struct
_reent is replaced by dedicated thread-local objects for each struct _reent
member. The thread-local objects are defined in translation units which use
the corresponding object.
2022-05-16 17:51:54 +08:00
|
|
|
#ifdef _REENT_THREAD_LOCAL
|
|
|
|
_Thread_local _mbstate_t _tls_mbsrtowcs_state;
|
|
|
|
#endif
|
|
|
|
|
2009-02-19 17:19:42 +08:00
|
|
|
size_t
|
2017-12-04 11:43:30 +08:00
|
|
|
_mbsnrtowcs_r (struct _reent *r,
|
2017-12-04 09:31:41 +08:00
|
|
|
wchar_t *dst,
|
|
|
|
const char **src,
|
|
|
|
size_t nms,
|
|
|
|
size_t len,
|
2009-02-19 17:19:42 +08:00
|
|
|
mbstate_t *ps)
|
|
|
|
{
|
|
|
|
wchar_t *ptr = dst;
|
|
|
|
const char *tmp_src;
|
|
|
|
size_t max;
|
|
|
|
size_t count = 0;
|
|
|
|
int bytes;
|
|
|
|
|
|
|
|
#ifdef _MB_CAPABLE
|
|
|
|
if (ps == NULL)
|
|
|
|
{
|
|
|
|
_REENT_CHECK_MISC(r);
|
|
|
|
ps = &(_REENT_MBSRTOWCS_STATE(r));
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (dst == NULL)
|
|
|
|
{
|
|
|
|
/* Ignore original len value and do not alter src pointer if the
|
|
|
|
dst pointer is NULL. */
|
|
|
|
len = (size_t)-1;
|
|
|
|
tmp_src = *src;
|
|
|
|
src = &tmp_src;
|
|
|
|
}
|
|
|
|
|
|
|
|
max = len;
|
|
|
|
while (len > 0)
|
|
|
|
{
|
|
|
|
bytes = _mbrtowc_r (r, ptr, *src, nms, ps);
|
|
|
|
if (bytes > 0)
|
|
|
|
{
|
|
|
|
*src += bytes;
|
|
|
|
nms -= bytes;
|
|
|
|
++count;
|
|
|
|
ptr = (dst == NULL) ? NULL : ptr + 1;
|
|
|
|
--len;
|
|
|
|
}
|
|
|
|
else if (bytes == -2)
|
|
|
|
{
|
|
|
|
*src += nms;
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
else if (bytes == 0)
|
|
|
|
{
|
|
|
|
*src = NULL;
|
|
|
|
return count;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ps->__count = 0;
|
2022-01-18 17:13:04 +08:00
|
|
|
_REENT_ERRNO(r) = EILSEQ;
|
2009-02-19 17:19:42 +08:00
|
|
|
return (size_t)-1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return (size_t)max;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef _REENT_ONLY
|
|
|
|
size_t
|
2017-12-04 11:43:30 +08:00
|
|
|
mbsnrtowcs (wchar_t *__restrict dst,
|
2017-12-04 09:31:41 +08:00
|
|
|
const char **__restrict src,
|
|
|
|
size_t nms,
|
|
|
|
size_t len,
|
2013-11-27 01:21:01 +08:00
|
|
|
mbstate_t *__restrict ps)
|
2009-02-19 17:19:42 +08:00
|
|
|
{
|
|
|
|
return _mbsnrtowcs_r (_REENT, dst, src, nms, len, ps);
|
|
|
|
}
|
|
|
|
#endif /* !_REENT_ONLY */
|