---- utf8.c.orig Tue May 20 15:21:44 2003
-+++ utf8.c Wed Jun 18 12:07:28 2003
-@@ -53,11 +53,10 @@
- int ch, len, mask;
- rune_t lbound, wch;
+--- utf8.c.orig Thu Nov 25 11:38:20 2004
++++ utf8.c Fri Feb 18 15:40:44 2005
+@@ -27,6 +27,8 @@
+ #include <sys/param.h>
+ __FBSDID("$FreeBSD: src/lib/libc/locale/utf8.c,v 1.11 2004/07/27 06:29:48 tjr Exp $");
-- if (n < 1) {
-- if (result != NULL)
-- *result = string;
-+ if (result != NULL)
-+ *result = string;
-+ if (n < 1)
- return (_INVALID_RUNE);
-- }
++#include "xlocale_private.h"
++
+ #include <errno.h>
+ #include <limits.h>
+ #include <runetype.h>
+@@ -35,14 +37,16 @@
+ #include <wchar.h>
+ #include "mblocal.h"
- /*
- * Determine the number of octets that make up this character from
-@@ -100,18 +99,15 @@
- * Malformed input; input is not UTF-8.
- */
- if (result != NULL)
-- *result = string + 1;
-+ (*result)++;
- return (_INVALID_RUNE);
- }
+-size_t _UTF8_mbrtowc(wchar_t * __restrict, const char * __restrict, size_t,
+- mbstate_t * __restrict);
+-int _UTF8_mbsinit(const mbstate_t *);
+-size_t _UTF8_mbsnrtowcs(wchar_t * __restrict, const char ** __restrict,
+- size_t, size_t, mbstate_t * __restrict);
+-size_t _UTF8_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict);
+-size_t _UTF8_wcsnrtombs(char * __restrict, const wchar_t ** __restrict,
+- size_t, size_t, mbstate_t * __restrict);
++#define UTF8_MB_CUR_MAX 6
++
++static size_t _UTF8_mbrtowc(wchar_t * __restrict, const char * __restrict, 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, locale_t);
++static size_t _UTF8_wcrtomb(char * __restrict, wchar_t, mbstate_t * __restrict, locale_t);
++static size_t _UTF8_wcsnrtombs(char * __restrict, const wchar_t ** __restrict,
++ size_t, size_t, mbstate_t * __restrict, locale_t);
-- if (n < len) {
-+ if (n < len)
- /*
- * Truncated or partial input.
- */
-- if (result != NULL)
-- *result = string;
- return (_INVALID_RUNE);
-- }
+ typedef struct {
+ wchar_t ch;
+@@ -50,31 +54,30 @@
+ wchar_t lbound;
+ } _UTF8State;
- /*
- * Decode the octet sequence representing the character in chunks
-@@ -124,19 +120,21 @@
- * Malformed input; bad characters in the middle
- * of a character.
+-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;
+
+ return (0);
+ }
+
+-int
+-_UTF8_mbsinit(const mbstate_t *ps)
++static int
++_UTF8_mbsinit(const mbstate_t *ps, locale_t loc)
+ {
+
+ return (ps == NULL || ((const _UTF8State *)ps)->want == 0);
+ }
+
+-size_t
++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;
+@@ -194,9 +197,9 @@
+ return (wch == L'\0' ? 0 : want);
+ }
+
+-size_t
++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;
+@@ -226,7 +229,7 @@
+ * 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);
+@@ -256,7 +259,7 @@
+ */
+ *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);
+@@ -276,8 +279,8 @@
+ return (nchr);
+ }
+
+-size_t
+-_UTF8_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps)
++static size_t
++_UTF8_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps, locale_t loc)
+ {
+ _UTF8State *us;
+ unsigned char lead;
+@@ -344,9 +347,9 @@
+ return (len);
+ }
+
+-size_t
++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];
+@@ -369,7 +372,7 @@
+ 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);
+@@ -386,9 +389,9 @@
+ /* 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 = (int)_UTF8_wcrtomb(dst, *s, ps)) < 0) {
++ if ((nb = (int)_UTF8_wcrtomb(dst, *s, ps, loc)) < 0) {
+ *src = s;
+ return ((size_t)-1);
+ }
+@@ -396,7 +399,7 @@
+ /*
+ * May not be enough space; use temp. buffer.
*/
-- wch = _INVALID_RUNE;
- if (result != NULL)
-- *result = string + 1;
-+ (*result)++;
- return (_INVALID_RUNE);
- }
- wch <<= 6;
- wch |= *string++ & 0x3f;
- }
-- if (wch != _INVALID_RUNE && wch < lbound)
-+ if (wch < lbound) {
- /*
- * Malformed input; redundant encoding.
- */
-- wch = _INVALID_RUNE;
-+ if (result != NULL)
-+ (*result)++;
-+ return (_INVALID_RUNE);
-+ }
- if (result != NULL)
- *result = string;
- return (wch);
+- if ((nb = (int)_UTF8_wcrtomb(buf, *s, ps)) < 0) {
++ if ((nb = (int)_UTF8_wcrtomb(buf, *s, ps, loc)) < 0) {
+ *src = s;
+ return ((size_t)-1);
+ }