]>
Commit | Line | Data |
---|---|---|
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 | } |