wcsnrtombs.c.patch   [plain text]


--- wcsnrtombs.c.orig	2004-11-25 11:38:20.000000000 -0800
+++ wcsnrtombs.c	2005-02-18 18:38:25.000000000 -0800
@@ -27,6 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/lib/libc/locale/wcsnrtombs.c,v 1.2 2004/07/22 02:57:29 tjr Exp $");
 
+#include "xlocale_private.h"
+
 #include <limits.h>
 #include <stdlib.h>
 #include <string.h>
@@ -34,32 +36,41 @@
 #include "mblocal.h"
 
 size_t
-wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
-    size_t len, mbstate_t * __restrict ps)
+wcsnrtombs_l(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
+    size_t len, mbstate_t * __restrict ps, locale_t loc)
 {
-	static mbstate_t mbs;
-
+	NORMALIZE_LOCALE(loc);
 	if (ps == NULL)
-		ps = &mbs;
-	return (__wcsnrtombs(dst, src, nwc, len, ps));
+		ps = &loc->__mbs_wcsnrtombs;
+	return (loc->__lc_ctype->__wcsnrtombs(dst, src, nwc, len, ps, loc));
 }
 
 size_t
+wcsnrtombs(char * __restrict dst, const wchar_t ** __restrict src, size_t nwc,
+    size_t len, mbstate_t * __restrict ps)
+{
+	return wcsnrtombs_l(dst, src, nwc, len, ps, __current_locale());
+}
+
+__private_extern__ size_t
 __wcsnrtombs_std(char * __restrict dst, const wchar_t ** __restrict src,
-    size_t nwc, size_t len, mbstate_t * __restrict ps)
+    size_t nwc, size_t len, mbstate_t * __restrict ps, locale_t loc)
 {
 	mbstate_t mbsbak;
 	char buf[MB_LEN_MAX];
 	const wchar_t *s;
 	size_t nbytes;
 	size_t nb;
+	struct __xlocale_st_runelocale *runeLocale = loc->__lc_ctype;
+	size_t (*__wcrtomb)(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t) = runeLocale->__wcrtomb;
+	int mb_cur_max = runeLocale->__mb_cur_max;
 
 	s = *src;
 	nbytes = 0;
 
 	if (dst == NULL) {
 		while (nwc-- > 0) {
-			if ((nb = __wcrtomb(buf, *s, ps)) == (size_t)-1)
+			if ((nb = __wcrtomb(buf, *s, ps, loc)) == (size_t)-1)
 				/* Invalid character - wcrtomb() sets errno. */
 				return ((size_t)-1);
 			else if (*s == L'\0')
@@ -71,9 +82,9 @@
 	}
 
 	while (len > 0 && nwc-- > 0) {
-		if (len > (size_t)MB_CUR_MAX) {
+		if (len > (size_t)mb_cur_max) {
 			/* Enough space to translate in-place. */
-			if ((nb = (int)__wcrtomb(dst, *s, ps)) < 0) {
+			if ((nb = (int)__wcrtomb(dst, *s, ps, loc)) < 0) {
 				*src = s;
 				return ((size_t)-1);
 			}
@@ -86,7 +97,7 @@
 			 * character is too long for the buffer.
 			 */
 			mbsbak = *ps;
-			if ((nb = (int)__wcrtomb(buf, *s, ps)) < 0) {
+			if ((nb = (int)__wcrtomb(buf, *s, ps, loc)) < 0) {
 				*src = s;
 				return ((size_t)-1);
 			}