* 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.
This commit is contained in:
Corinna Vinschen 2009-02-19 09:19:42 +00:00
parent 3f60f7e544
commit 2e10d61ccb
9 changed files with 427 additions and 123 deletions

View File

@ -1,3 +1,22 @@
2009-02-19 Corinna Vinschen <corinna@vinschen.de>
* 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.
2009-02-18 Jeff Johnston <jjohnstn@redhat.com>
* libc/stdio/open_memstream.c (internal_open_memstream_r): Fix max

View File

@ -47,10 +47,18 @@ size_t _EXFUN(mbrtowc, (wchar_t * , const char * , size_t, mbstate_t *));
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 *));

View File

@ -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

View File

@ -111,9 +111,10 @@ am__objects_3 = lib_a-a64l.$(OBJEXT) lib_a-btowc.$(OBJEXT) \
lib_a-getopt.$(OBJEXT) lib_a-getsubopt.$(OBJEXT) \
lib_a-l64a.$(OBJEXT) lib_a-malign.$(OBJEXT) \
lib_a-mbrlen.$(OBJEXT) lib_a-mbrtowc.$(OBJEXT) \
lib_a-mbsinit.$(OBJEXT) lib_a-mbsrtowcs.$(OBJEXT) \
lib_a-on_exit.$(OBJEXT) lib_a-valloc.$(OBJEXT) \
lib_a-wcrtomb.$(OBJEXT) lib_a-wcsrtombs.$(OBJEXT) \
lib_a-mbsinit.$(OBJEXT) lib_a-mbsnrtowcs.$(OBJEXT) \
lib_a-mbsrtowcs.$(OBJEXT) lib_a-on_exit.$(OBJEXT) \
lib_a-valloc.$(OBJEXT) lib_a-wcrtomb.$(OBJEXT) \
lib_a-wcsnrtombs.$(OBJEXT) lib_a-wcsrtombs.$(OBJEXT) \
lib_a-wctob.$(OBJEXT)
am__objects_4 = lib_a-putenv.$(OBJEXT) lib_a-putenv_r.$(OBJEXT) \
lib_a-setenv.$(OBJEXT) lib_a-setenv_r.$(OBJEXT)
@ -146,8 +147,9 @@ am__objects_8 = cxa_atexit.lo cxa_finalize.lo drand48.lo ecvtbuf.lo \
wcstoll.lo wcstoll_r.lo wcstoull.lo wcstoull_r.lo atoll.lo \
llabs.lo lldiv.lo
am__objects_9 = a64l.lo btowc.lo getopt.lo getsubopt.lo l64a.lo \
malign.lo mbrlen.lo mbrtowc.lo mbsinit.lo mbsrtowcs.lo \
on_exit.lo valloc.lo wcrtomb.lo wcsrtombs.lo wctob.lo
malign.lo mbrlen.lo mbrtowc.lo mbsinit.lo mbsnrtowcs.lo \
mbsrtowcs.lo on_exit.lo valloc.lo wcrtomb.lo wcsnrtombs.lo \
wcsrtombs.lo wctob.lo
am__objects_10 = putenv.lo putenv_r.lo setenv.lo setenv_r.lo
am__objects_11 = system.lo
@ELIX_LEVEL_1_FALSE@@ELIX_LEVEL_2_FALSE@@ELIX_LEVEL_3_FALSE@am__objects_12 = $(am__objects_9) \
@ -440,10 +442,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
@ -1142,6 +1146,12 @@ lib_a-mbsinit.o: mbsinit.c
lib_a-mbsinit.obj: mbsinit.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mbsinit.obj `if test -f 'mbsinit.c'; then $(CYGPATH_W) 'mbsinit.c'; else $(CYGPATH_W) '$(srcdir)/mbsinit.c'; fi`
lib_a-mbsnrtowcs.o: mbsnrtowcs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mbsnrtowcs.o `test -f 'mbsnrtowcs.c' || echo '$(srcdir)/'`mbsnrtowcs.c
lib_a-mbsnrtowcs.obj: mbsnrtowcs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mbsnrtowcs.obj `if test -f 'mbsnrtowcs.c'; then $(CYGPATH_W) 'mbsnrtowcs.c'; else $(CYGPATH_W) '$(srcdir)/mbsnrtowcs.c'; fi`
lib_a-mbsrtowcs.o: mbsrtowcs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-mbsrtowcs.o `test -f 'mbsrtowcs.c' || echo '$(srcdir)/'`mbsrtowcs.c
@ -1166,6 +1176,12 @@ lib_a-wcrtomb.o: wcrtomb.c
lib_a-wcrtomb.obj: wcrtomb.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcrtomb.obj `if test -f 'wcrtomb.c'; then $(CYGPATH_W) 'wcrtomb.c'; else $(CYGPATH_W) '$(srcdir)/wcrtomb.c'; fi`
lib_a-wcsnrtombs.o: wcsnrtombs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcsnrtombs.o `test -f 'wcsnrtombs.c' || echo '$(srcdir)/'`wcsnrtombs.c
lib_a-wcsnrtombs.obj: wcsnrtombs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcsnrtombs.obj `if test -f 'wcsnrtombs.c'; then $(CYGPATH_W) 'wcsnrtombs.c'; else $(CYGPATH_W) '$(srcdir)/wcsnrtombs.c'; fi`
lib_a-wcsrtombs.o: wcsrtombs.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wcsrtombs.o `test -f 'wcsrtombs.c' || echo '$(srcdir)/'`wcsrtombs.c

View File

@ -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 */

View File

@ -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 */

View File

@ -29,6 +29,7 @@ The corresponding declarations are in the header file @file{stdlib.h}.
* 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 the header file @file{stdlib.h}.
* 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
@ -122,6 +124,9 @@ The corresponding declarations are in the header file @file{stdlib.h}.
@page
@include stdlib/mblen.def
@page
@include stdlib/mbsnrtowcs.def
@page
@include stdlib/mbstowcs.def
@ -152,6 +157,9 @@ The corresponding declarations are in the header file @file{stdlib.h}.
@page
@include stdlib/strtoull.def
@page
@include stdlib/wcsnrtombs.def
@page
@include stdlib/wcstod.def

View File

@ -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 */

View File

@ -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 */