1 --- wcsxfrm.c.orig 2004-11-25 11:38:47.000000000 -0800
2 +++ wcsxfrm.c 2005-03-30 15:06:45.000000000 -0800
5 __FBSDID("$FreeBSD: src/lib/libc/string/wcsxfrm.c,v 1.3 2004/04/07 09:47:56 tjr Exp $");
7 +#include "xlocale_private.h"
15 -static char *__mbsdup(const wchar_t *);
16 +#define WCS_XFRM_OFFSET 1
19 - * Placeholder wcsxfrm() implementation. See wcscoll.c for a description of
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,
29 - char *mbsrc, *s, *ss;
39 - if (__collate_load_error || MB_CUR_MAX > 1) {
40 + NORMALIZE_LOCALE(loc);
41 + if (loc->__collate_load_error) {
49 - mbsrc = __mbsdup(src);
52 - ss = s = __collate_substitute(mbsrc);
53 - while (*s != '\0') {
54 - while (*s != '\0' && prim == 0) {
55 - __collate_lookup(s, &l, &prim, &sec);
57 + __collate_xfrm(src, xf, loc);
59 + slen = wcslen(xf[0]);
61 + slen += wcslen(xf[1]) + 1;
67 + *dest++ = *w++ + WCS_XFRM_OFFSET;
72 - *dest++ = (wchar_t)prim;
73 + if ((w = xf[1]) != NULL) {
75 + *dest++ = WCS_XFRM_OFFSET;
79 + *dest++ = *w++ + WCS_XFRM_OFFSET;
102 -__mbsdup(const wchar_t *ws)
104 +wcsxfrm(wchar_t * __restrict dest, const wchar_t * __restrict src, size_t len)
106 - static const mbstate_t initial;
108 - const wchar_t *wcp;
114 - if ((len = wcsrtombs(NULL, &wcp, 0, &st)) == (size_t)-1)
116 - if ((mbs = malloc(len + 1)) == NULL)
119 - wcsrtombs(mbs, &ws, len + 1, &st);
122 + return wcsxfrm_l(dest, src, len, __current_locale());