utf8.c.patch   [plain text]


--- utf8.c.bsdnew	2009-11-09 15:05:25.000000000 -0800
+++ utf8.c	2009-11-09 17:35:23.000000000 -0800
@@ -27,6 +27,8 @@
 #include <sys/param.h>
 __FBSDID("$FreeBSD: src/lib/libc/locale/utf8.c,v 1.16 2007/10/15 09:51:30 ache Exp $");
 
+#include "xlocale_private.h"
+
 #include <errno.h>
 #include <limits.h>
 #include <runetype.h>
@@ -35,18 +37,18 @@ __FBSDID("$FreeBSD: src/lib/libc/locale/
 #include <wchar.h>
 #include "mblocal.h"
 
-extern int __mb_sb_limit;
+#define UTF8_MB_CUR_MAX		6
 
 static size_t	_UTF8_mbrtowc(wchar_t * __restrict, const char * __restrict,
-		    size_t, mbstate_t * __restrict);
-static int	_UTF8_mbsinit(const mbstate_t *);
+		    size_t, mbstate_t * __restrict, locale_t);
+static int	_UTF8_mbsinit(const mbstate_t *, locale_t);
 static size_t	_UTF8_mbsnrtowcs(wchar_t * __restrict,
 		    const char ** __restrict, size_t, size_t,
-		    mbstate_t * __restrict);
+		    mbstate_t * __restrict, locale_t);
 static size_t	_UTF8_wcrtomb(char * __restrict, wchar_t,
-		    mbstate_t * __restrict);
+		    mbstate_t * __restrict, locale_t);
 static size_t	_UTF8_wcsnrtombs(char * __restrict, const wchar_t ** __restrict,
-		    size_t, size_t, mbstate_t * __restrict);
+		    size_t, size_t, mbstate_t * __restrict, locale_t);
 
 typedef struct {
 	wchar_t	ch;
@@ -54,29 +56,28 @@ typedef struct {
 	wchar_t	lbound;
 } _UTF8State;
 
-int
-_UTF8_init(_RuneLocale *rl)
+__private_extern__ int
+_UTF8_init(struct __xlocale_st_runelocale *xrl)
 {
 
-	__mbrtowc = _UTF8_mbrtowc;
-	__wcrtomb = _UTF8_wcrtomb;
-	__mbsinit = _UTF8_mbsinit;
-	__mbsnrtowcs = _UTF8_mbsnrtowcs;
-	__wcsnrtombs = _UTF8_wcsnrtombs;
-	_CurrentRuneLocale = rl;
-	__mb_cur_max = 6;
+	xrl->__mbrtowc = _UTF8_mbrtowc;
+	xrl->__wcrtomb = _UTF8_wcrtomb;
+	xrl->__mbsinit = _UTF8_mbsinit;
+	xrl->__mbsnrtowcs = _UTF8_mbsnrtowcs;
+	xrl->__wcsnrtombs = _UTF8_wcsnrtombs;
+	xrl->__mb_cur_max = UTF8_MB_CUR_MAX;
 	/*
 	 * UCS-4 encoding used as the internal representation, so
 	 * slots 0x0080-0x00FF are occuped and must be excluded
 	 * from the single byte ctype by setting the limit.
 	 */
-	__mb_sb_limit = 128;
+	xrl->__mb_sb_limit = 128;
 
 	return (0);
 }
 
 static int
-_UTF8_mbsinit(const mbstate_t *ps)
+_UTF8_mbsinit(const mbstate_t *ps, locale_t loc)
 {
 
 	return (ps == NULL || ((const _UTF8State *)ps)->want == 0);
@@ -84,7 +85,7 @@ _UTF8_mbsinit(const mbstate_t *ps)
 
 static size_t
 _UTF8_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n,
-    mbstate_t * __restrict ps)
+    mbstate_t * __restrict ps, locale_t loc)
 {
 	_UTF8State *us;
 	int ch, i, mask, want;
@@ -206,7 +207,7 @@ _UTF8_mbrtowc(wchar_t * __restrict pwc, 
 
 static size_t
 _UTF8_mbsnrtowcs(wchar_t * __restrict dst, const char ** __restrict src,
-    size_t nms, size_t len, mbstate_t * __restrict ps)
+    size_t nms, size_t len, mbstate_t * __restrict ps, locale_t loc)
 {
 	_UTF8State *us;
 	const char *s;
@@ -236,7 +237,7 @@ _UTF8_mbsnrtowcs(wchar_t * __restrict ds
 				 * excluding NUL.
 				 */
 				nb = 1;
-			else if ((nb = _UTF8_mbrtowc(&wc, s, nms, ps)) ==
+			else if ((nb = _UTF8_mbrtowc(&wc, s, nms, ps, loc)) ==
 			    (size_t)-1)
 				/* Invalid sequence - mbrtowc() sets errno. */
 				return ((size_t)-1);
@@ -266,7 +267,7 @@ _UTF8_mbsnrtowcs(wchar_t * __restrict ds
 			 */
 			*dst = (wchar_t)*s;
 			nb = 1;
-		} else if ((nb = _UTF8_mbrtowc(dst, s, nms, ps)) ==
+		} else if ((nb = _UTF8_mbrtowc(dst, s, nms, ps, loc)) ==
 		    (size_t)-1) {
 			*src = s;
 			return ((size_t)-1);
@@ -287,7 +288,7 @@ _UTF8_mbsnrtowcs(wchar_t * __restrict ds
 }
 
 static size_t
-_UTF8_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps)
+_UTF8_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps, locale_t loc)
 {
 	_UTF8State *us;
 	unsigned char lead;
@@ -356,7 +357,7 @@ _UTF8_wcrtomb(char * __restrict s, wchar
 
 static size_t
 _UTF8_wcsnrtombs(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)
 {
 	_UTF8State *us;
 	char buf[MB_LEN_MAX];
@@ -379,7 +380,7 @@ _UTF8_wcsnrtombs(char * __restrict dst, 
 			if (0 <= *s && *s < 0x80)
 				/* Fast path for plain ASCII characters. */
 				nb = 1;
-			else if ((nb = _UTF8_wcrtomb(buf, *s, ps)) ==
+			else if ((nb = _UTF8_wcrtomb(buf, *s, ps, loc)) ==
 			    (size_t)-1)
 				/* Invalid character - wcrtomb() sets errno. */
 				return ((size_t)-1);
@@ -396,9 +397,9 @@ _UTF8_wcsnrtombs(char * __restrict dst, 
 			/* Fast path for plain ASCII characters. */
 			nb = 1;
 			*dst = *s;
-		} else if (len > (size_t)MB_CUR_MAX) {
+		} else if (len > (size_t)UTF8_MB_CUR_MAX) {
 			/* Enough space to translate in-place. */
-			if ((nb = _UTF8_wcrtomb(dst, *s, ps)) == (size_t)-1) {
+			if ((nb = _UTF8_wcrtomb(dst, *s, ps, loc)) == (size_t)-1) {
 				*src = s;
 				return ((size_t)-1);
 			}
@@ -406,7 +407,7 @@ _UTF8_wcsnrtombs(char * __restrict dst, 
 			/*
 			 * May not be enough space; use temp. buffer.
 			 */
-			if ((nb = _UTF8_wcrtomb(buf, *s, ps)) == (size_t)-1) {
+			if ((nb = _UTF8_wcrtomb(buf, *s, ps, loc)) == (size_t)-1) {
 				*src = s;
 				return ((size_t)-1);
 			}