]> git.saurik.com Git - apple/libc.git/blob - string/FreeBSD/wcsxfrm.c.patch
Libc-498.1.7.tar.gz
[apple/libc.git] / string / FreeBSD / wcsxfrm.c.patch
1 --- wcsxfrm.c.orig 2004-11-25 11:38:47.000000000 -0800
2 +++ wcsxfrm.c 2005-03-30 15:06:45.000000000 -0800
3 @@ -31,23 +31,23 @@
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 <errno.h>
13 #include "collate.h"
14
15 -static char *__mbsdup(const wchar_t *);
16 +#define WCS_XFRM_OFFSET 1
17
18 -/*
19 - * Placeholder wcsxfrm() implementation. See wcscoll.c for a description of
20 - * the logic used.
21 - */
22 size_t
23 -wcsxfrm(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len)
24 +wcsxfrm_l(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len,
25 + locale_t loc)
26 {
27 - int prim, sec, l;
28 size_t slen;
29 - char *mbsrc, *s, *ss;
30 + wchar_t *xf[2];
31 + int sverrno;
32
33 if (*src == L'\0') {
34 if (len != 0)
35 @@ -55,7 +55,8 @@
36 return (0);
37 }
38
39 - if (__collate_load_error || MB_CUR_MAX > 1) {
40 + NORMALIZE_LOCALE(loc);
41 + if (loc->__collate_load_error) {
42 slen = wcslen(src);
43 if (len > 0) {
44 if (slen < len)
45 @@ -68,49 +69,41 @@
46 return (slen);
47 }
48
49 - mbsrc = __mbsdup(src);
50 - slen = 0;
51 - prim = sec = 0;
52 - ss = s = __collate_substitute(mbsrc);
53 - while (*s != '\0') {
54 - while (*s != '\0' && prim == 0) {
55 - __collate_lookup(s, &l, &prim, &sec);
56 - s += l;
57 + __collate_xfrm(src, xf, loc);
58 +
59 + slen = wcslen(xf[0]);
60 + if (xf[1])
61 + slen += wcslen(xf[1]) + 1;
62 + if (len > 0) {
63 + wchar_t *w = xf[0];
64 + while (len > 1) {
65 + if (!*w)
66 + break;
67 + *dest++ = *w++ + WCS_XFRM_OFFSET;
68 + len--;
69 }
70 - if (prim != 0) {
71 - if (len > 1) {
72 - *dest++ = (wchar_t)prim;
73 + if ((w = xf[1]) != NULL) {
74 + if (len > 1)
75 + *dest++ = WCS_XFRM_OFFSET;
76 + while (len > 1) {
77 + if (!*w)
78 + break;
79 + *dest++ = *w++ + WCS_XFRM_OFFSET;
80 len--;
81 }
82 - slen++;
83 - prim = 0;
84 }
85 - }
86 - free(ss);
87 - free(mbsrc);
88 - if (len != 0)
89 - *dest = L'\0';
90 -
91 + *dest = 0;
92 + }
93 + sverrno = errno;
94 + free(xf[0]);
95 + free(xf[1]);
96 + errno = sverrno;
97 +
98 return (slen);
99 }
100
101 -static char *
102 -__mbsdup(const wchar_t *ws)
103 +size_t
104 +wcsxfrm(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len)
105 {
106 - static const mbstate_t initial;
107 - mbstate_t st;
108 - const wchar_t *wcp;
109 - size_t len;
110 - char *mbs;
111 -
112 - wcp = ws;
113 - st = initial;
114 - if ((len = wcsrtombs(NULL, &wcp, 0, &st)) == (size_t)-1)
115 - return (NULL);
116 - if ((mbs = malloc(len + 1)) == NULL)
117 - return (NULL);
118 - st = initial;
119 - wcsrtombs(mbs, &ws, len + 1, &st);
120 -
121 - return (mbs);
122 + return wcsxfrm_l(dest, src, len, __current_locale());
123 }