[PATCH] mbsnrtowcs/wcsnrtombs
Jeff Johnston
jjohnstn@redhat.com
Thu Feb 19 00:07:00 GMT 2009
Corinna Vinschen wrote:
> On Feb 14 10:21, Corinna Vinschen wrote:
>
>> On Feb 13 19:35, Corinna Vinschen wrote:
>>
>>> Hi,
>>>
>>> the below patch adds the two functions mbsnrtowcs and wcsnrtombs, as
>>> defined in BSD and POSIX.1-2008, [...]
>>>
>
> Here's the entire patch again. I now added documentation for the
> wcsrtombs, wcsnrtombs, mbsrtowcs and mbsnrtowcs functions using the
> FreeBSD man pages as template.
>
>
Corinna, the patch requires one fix to work properly. The _mbtowc_r
function has a bug that you will trigger. It adds one to the n value if
we are part-way through a conversion. It does so so that it may check
for a hard-coded minimum size value and account for any bytes already
processed (e.g. if n < 2). In your patch for mbsrtowc.c, you are now
passing (size_t)-1 which the algorithm does not handle. It may add one
to end up with 0 and then it will fail subsequent tests which is wrong.
The simple fix is to add a check for n < (size_t)-1 before ever
incrementing n. With that, go ahead and check in the patch.
-- Jeff J.
> Corinna
>
>
> * 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.
>
>
> Index: libc/include/wchar.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/wchar.h,v
> retrieving revision 1.20
> diff -u -p -r1.20 wchar.h
> --- libc/include/wchar.h 12 Feb 2009 23:10:01 -0000 1.20
> +++ libc/include/wchar.h 16 Feb 2009 15:19:50 -0000
> @@ -47,10 +47,18 @@ size_t _EXFUN(mbrtowc, (wchar_t * , cons
> size_t _EXFUN(_mbrtowc_r, (struct _reent *, wchar_t * , const char * ,
> size_t, mbstate_t *));
> int _EXFUN(mbsinit, (const mbstate_t *));
> +size_t _EXFUN(mbsnrtowcs, (wchar_t * , const char ** , size_t, size_t,
> + mbstate_t *));
> +size_t _EXFUN(_mbsnrtowcs_r, (struct _reent *, wchar_t * , const char ** ,
> + size_t, size_t, mbstate_t *));
> size_t _EXFUN(mbsrtowcs, (wchar_t * , const char ** , size_t, mbstate_t *));
> size_t _EXFUN(_mbsrtowcs_r, (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *));
> size_t _EXFUN(wcrtomb, (char * , wchar_t, mbstate_t *));
> size_t _EXFUN(_wcrtomb_r, (struct _reent *, char * , wchar_t, mbstate_t *));
> +size_t _EXFUN(wcsnrtombs, (char * , const wchar_t ** , size_t, size_t,
> + mbstate_t *));
> +size_t _EXFUN(_wcsnrtombs_r, (struct _reent *, char * , const wchar_t ** ,
> + size_t, size_t, mbstate_t *));
> size_t _EXFUN(wcsrtombs, (char * , const wchar_t ** , size_t, mbstate_t *));
> size_t _EXFUN(_wcsrtombs_r, (struct _reent *, char * , const wchar_t ** ,
> size_t, mbstate_t *));
> Index: libc/stdlib/Makefile.am
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdlib/Makefile.am,v
> retrieving revision 1.26
> diff -u -p -r1.26 Makefile.am
> --- libc/stdlib/Makefile.am 12 Feb 2009 23:10:01 -0000 1.26
> +++ libc/stdlib/Makefile.am 16 Feb 2009 15:19:50 -0000
> @@ -98,10 +98,12 @@ ELIX_2_SOURCES = \
> mbrlen.c \
> mbrtowc.c \
> mbsinit.c \
> + mbsnrtowcs.c \
> mbsrtowcs.c \
> on_exit.c \
> valloc.c \
> wcrtomb.c \
> + wcsnrtombs.c \
> wcsrtombs.c \
> wctob.c
>
> Index: libc/stdlib/mbsnrtowcs.c
> ===================================================================
> RCS file: libc/stdlib/mbsnrtowcs.c
> diff -N libc/stdlib/mbsnrtowcs.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ libc/stdlib/mbsnrtowcs.c 16 Feb 2009 15:19:50 -0000
> @@ -0,0 +1,179 @@
> +/*
> +FUNCTION
> +<<mbsrtowcs>>, <<mbsnrtowcs>>---convert a character string to a wide-character string
> +
> +INDEX
> + mbsrtowcs
> +INDEX
> + _mbsrtowcs_r
> +INDEX
> + mbsnrtowcs
> +INDEX
> + _mbsnrtowcs_r
> +
> +ANSI_SYNOPSIS
> + #include <wchar.h>
> + size_t mbsrtowcs(wchar_t *<[dst]>, const char **<[src]>, size_t <[len]>,
> + mbstate_t *<[ps]>);
> +
> + #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>
> + size_t mbsnrtowcs(wchar_t *<[dst]>, const char **<[src]>,
> + size_t <[nms]>, size_t <[len]>, mbstate_t *<[ps]>);
> +
> + #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]>);
> +
> +TRAD_SYNOPSIS
> + #include <wchar.h>
> + size_t mbsrtowcs(<[dst]>, <[src]>, <[len]>, <[ps]>)
> + wchar_t *<[dst]>;
> + const char **<[src]>;
> + size_t <[len]>;
> + mbstate_t *<[ps]>;
> +
> + #include <wchar.h>
> + size_t _mbsrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
> + struct _reent *<[ptr]>;
> + wchar_t *<[dst]>;
> + const char **<[src]>;
> + size_t <[len]>;
> + mbstate_t *<[ps]>;
> +
> + #include <wchar.h>
> + size_t mbsnrtowcs(<[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
> + wchar_t *<[dst]>;
> + const char **<[src]>;
> + size_t <[nms]>;
> + size_t <[len]>;
> + mbstate_t *<[ps]>;
> +
> + #include <wchar.h>
> + size_t _mbsnrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
> + 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>
> +
> +size_t
> +_DEFUN (_mbsnrtowcs_r, (r, dst, src, nms, len, ps),
> + struct _reent *r _AND
> + wchar_t *dst _AND
> + const char **src _AND
> + size_t nms _AND
> + size_t len _AND
> + 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;
> + r->_errno = EILSEQ;
> + return (size_t)-1;
> + }
> + }
> +
> + return (size_t)max;
> +}
> +
> +#ifndef _REENT_ONLY
> +size_t
> +_DEFUN (mbsnrtowcs, (dst, src, nms, len, ps),
> + wchar_t *dst _AND
> + const char **src _AND
> + size_t nms _AND
> + size_t len _AND
> + mbstate_t *ps)
> +{
> + return _mbsnrtowcs_r (_REENT, dst, src, nms, len, ps);
> +}
> +#endif /* !_REENT_ONLY */
> Index: libc/stdlib/mbsrtowcs.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdlib/mbsrtowcs.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 mbsrtowcs.c
> --- libc/stdlib/mbsrtowcs.c 23 Apr 2004 21:44:22 -0000 1.5
> +++ libc/stdlib/mbsrtowcs.c 16 Feb 2009 15:19:50 -0000
> @@ -6,65 +6,14 @@
> #include <errno.h>
>
> size_t
> -_DEFUN (_mbsrtowcs_r, (r, dst, src, n, ps),
> +_DEFUN (_mbsrtowcs_r, (r, dst, src, len, ps),
> struct _reent *r _AND
> wchar_t *dst _AND
> const char **src _AND
> - size_t n _AND
> + size_t len _AND
> 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 n value and do not alter src pointer if the
> - dst pointer is NULL. */
> - n = (size_t)-1;
> - tmp_src = *src;
> - src = &tmp_src;
> - }
> -
> - max = n;
> - while (n > 0)
> - {
> - bytes = _mbrtowc_r (r, ptr, *src, MB_CUR_MAX, ps);
> - if (bytes > 0)
> - {
> - *src += bytes;
> - ++count;
> - ptr = (dst == NULL) ? NULL : ptr + 1;
> - --n;
> - }
> - else if (bytes == -2)
> - {
> - *src += MB_CUR_MAX;
> - }
> - else if (bytes == 0)
> - {
> - *src = NULL;
> - return count;
> - }
> - else
> - {
> - ps->__count = 0;
> - r->_errno = EILSEQ;
> - return (size_t)-1;
> - }
> - }
> -
> - return (size_t)max;
> + return _mbsnrtowcs_r (r, dst, src, (size_t) -1, len, ps);
> }
>
> #ifndef _REENT_ONLY
> @@ -75,6 +24,6 @@ _DEFUN (mbsrtowcs, (dst, src, len, ps),
> size_t len _AND
> mbstate_t *ps)
> {
> - return _mbsrtowcs_r (_REENT, dst, src, len, ps);
> + return _mbsnrtowcs_r (_REENT, dst, src, (size_t) -1, len, ps);
> }
> #endif /* !_REENT_ONLY */
> Index: libc/stdlib/wcsnrtombs.c
> ===================================================================
> RCS file: libc/stdlib/wcsnrtombs.c
> diff -N libc/stdlib/wcsnrtombs.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ libc/stdlib/wcsnrtombs.c 16 Feb 2009 15:19:50 -0000
> @@ -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 */
> Index: libc/stdlib/wcsrtombs.c
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdlib/wcsrtombs.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 wcsrtombs.c
> --- libc/stdlib/wcsrtombs.c 28 Aug 2008 17:36:49 -0000 1.8
> +++ libc/stdlib/wcsrtombs.c 16 Feb 2009 15:19:50 -0000
> @@ -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,
> 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 */
> Index: libc/stdlib/stdlib.tex
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/stdlib/stdlib.tex,v
> retrieving revision 1.8
> diff -u -p -r1.8 stdlib.tex
> --- libc/stdlib/stdlib.tex 12 Feb 2009 23:10:01 -0000 1.8
> +++ libc/stdlib/stdlib.tex 16 Feb 2009 15:19:50 -0000
> @@ -29,6 +29,7 @@ The corresponding declarations are in th
> * malloc:: Allocate and manage memory (malloc, realloc, free)
> * mallinfo:: Get information about allocated memory
> * __malloc_lock:: Lock memory pool for malloc and free
> +* mbsnrtowcs:: Convert a character string to a wide-character string
> * mbstowcs:: Minimal multibyte string to wide string converter
> * mblen:: Minimal multibyte length
> * mbtowc:: Minimal multibyte to wide character converter
> @@ -40,6 +41,7 @@ The corresponding declarations are in th
> * strtoll:: String to long long
> * strtoul:: String to unsigned long
> * strtoull:: String to unsigned long long
> +* wcsnrtombs:: Convert a wide-character string to a character string
> * wcstod:: Wide string to double or float
> * wcstol:: Wide string to long
> * wcstoll:: Wide string to long long
> @@ -123,6 +125,9 @@ The corresponding declarations are in th
> @include stdlib/mblen.def
>
> @page
> +@include stdlib/mbsnrtowcs.def
> +
> +@page
> @include stdlib/mbstowcs.def
>
> @page
> @@ -153,6 +158,9 @@ The corresponding declarations are in th
> @include stdlib/strtoull.def
>
> @page
> +@include stdlib/wcsnrtombs.def
> +
> +@page
> @include stdlib/wcstod.def
>
> @page
>
>
>
More information about the Newlib
mailing list