]> git.saurik.com Git - apple/libc.git/blob - string/FreeBSD/wcsxfrm.c.patch
Libc-391.2.9.tar.gz
[apple/libc.git] / string / FreeBSD / wcsxfrm.c.patch
1 --- wcsxfrm.c.orig Thu Nov 25 11:38:47 2004
2 +++ wcsxfrm.c Fri Feb 18 15:01:58 2005
3 @@ -31,31 +31,35 @@
4 #endif
5 __FBSDID("$FreeBSD: src/lib/libc/string/wcsxfrm.c,v 1.3 2004/04/07 09:47:56 tjr Exp $");
6
7 +#include "xlocale_private.h"
8 +
9 #include <stdlib.h>
10 #include <string.h>
11 #include <wchar.h>
12 #include "collate.h"
13
14 -static char *__mbsdup(const wchar_t *);
15 +static char *__mbsdup(const wchar_t *, locale_t);
16
17 /*
18 * Placeholder wcsxfrm() implementation. See wcscoll.c for a description of
19 * the logic used.
20 */
21 size_t
22 -wcsxfrm(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len)
23 +wcsxfrm_l(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len,
24 + locale_t loc)
25 {
26 int prim, sec, l;
27 size_t slen;
28 char *mbsrc, *s, *ss;
29
30 + NORMALIZE_LOCALE(loc);
31 if (*src == L'\0') {
32 if (len != 0)
33 *dest = L'\0';
34 return (0);
35 }
36
37 - if (__collate_load_error || MB_CUR_MAX > 1) {
38 + if (loc->__collate_load_error || MB_CUR_MAX_L(loc) > 1) {
39 slen = wcslen(src);
40 if (len > 0) {
41 if (slen < len)
42 @@ -68,13 +72,13 @@
43 return (slen);
44 }
45
46 - mbsrc = __mbsdup(src);
47 + mbsrc = __mbsdup(src, loc);
48 slen = 0;
49 prim = sec = 0;
50 - ss = s = __collate_substitute(mbsrc);
51 + ss = s = (char *)__collate_substitute_l((unsigned char *)mbsrc, loc);
52 while (*s != '\0') {
53 while (*s != '\0' && prim == 0) {
54 - __collate_lookup(s, &l, &prim, &sec);
55 + __collate_lookup_l((unsigned char *)s, &l, &prim, &sec, loc);
56 s += l;
57 }
58 if (prim != 0) {
59 @@ -94,8 +98,14 @@
60 return (slen);
61 }
62
63 +size_t
64 +wcsxfrm(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len)
65 +{
66 + return wcsxfrm_l(dest, src, len, __current_locale());
67 +}
68 +
69 static char *
70 -__mbsdup(const wchar_t *ws)
71 +__mbsdup(const wchar_t *ws, locale_t loc)
72 {
73 static const mbstate_t initial;
74 mbstate_t st;
75 @@ -105,12 +115,12 @@
76
77 wcp = ws;
78 st = initial;
79 - if ((len = wcsrtombs(NULL, &wcp, 0, &st)) == (size_t)-1)
80 + if ((len = wcsrtombs_l(NULL, &wcp, 0, &st, loc)) == (size_t)-1)
81 return (NULL);
82 if ((mbs = malloc(len + 1)) == NULL)
83 return (NULL);
84 st = initial;
85 - wcsrtombs(mbs, &ws, len + 1, &st);
86 + wcsrtombs_l(mbs, &ws, len + 1, &st, loc);
87
88 return (mbs);
89 }