]> git.saurik.com Git - apple/libc.git/blame - string/FreeBSD/wcsxfrm.c.patch
Libc-391.5.22.tar.gz
[apple/libc.git] / string / FreeBSD / wcsxfrm.c.patch
CommitLineData
3d9156a7
A
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 }