From 7d4be1efd53045983acf1d00041e70086d2c029f Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Wed, 21 Jan 2004 20:09:16 +0000 Subject: 2004-01-21 Jeff Johnston * libc/stdlib/mbrtowc.c (_mbrtowc_r): Fix case where s is null pointer to match C99 spec. * libc/stdlib/mbsrtowcs.c (_mbsrtowc_r): Fix to ignore len when dst is NULL. Also fix to not alter src pointer when dst is NULL and call _mbrtowc_r instead of _mbtowc_r. * libc/stdlib/wcsrtombs.c (_wcsrtombs_r): Call _wcrtomb_r instead of _wctomb_r. --- newlib/libc/stdlib/mbsrtowcs.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'newlib/libc/stdlib/mbsrtowcs.c') diff --git a/newlib/libc/stdlib/mbsrtowcs.c b/newlib/libc/stdlib/mbsrtowcs.c index 10d3a72d4..d050bf837 100644 --- a/newlib/libc/stdlib/mbsrtowcs.c +++ b/newlib/libc/stdlib/mbsrtowcs.c @@ -13,7 +13,9 @@ _DEFUN (_mbsrtowcs_r, (r, dst, src, n, ps), mbstate_t *ps) { wchar_t *ptr = dst; - size_t max = n; + const char *tmp_src; + size_t max; + size_t count = 0; int bytes; #ifdef MB_CAPABLE @@ -24,13 +26,24 @@ _DEFUN (_mbsrtowcs_r, (r, dst, src, n, ps), } #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 = _mbtowc_r (r, ptr, *src, MB_CUR_MAX, ps); + bytes = _mbrtowc_r (r, ptr, *src, MB_CUR_MAX, ps); if (bytes > 0) { *src += bytes; - ++ptr; + ++count; + ptr = (dst == NULL) ? NULL : ptr + 1; --n; } else if (bytes == -2) @@ -40,7 +53,7 @@ _DEFUN (_mbsrtowcs_r, (r, dst, src, n, ps), else if (bytes == 0) { *src = NULL; - return (size_t)(ptr - dst); + return count; } else { -- cgit v1.2.3