]> git.saurik.com Git - apple/libc.git/blobdiff - locale/FreeBSD/utf8.c.patch
Libc-391.tar.gz
[apple/libc.git] / locale / FreeBSD / utf8.c.patch
index dadd310afec6713bbe7036a5cafeb73e1ddfe3fc..2aa8c404c2bde7ece71ab9312a383ff4ca54cfb0 100644 (file)
---- 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);
+                       }