]>
git.saurik.com Git - apple/libc.git/blob - string/strxfrm-fbsd.c
2 * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
3 * at Electronni Visti IA, Kiev, Ukraine.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD: src/lib/libc/string/strxfrm.c,v 1.15 2002/09/06 11:24:06 tjr Exp $");
31 #include "xlocale_private.h"
40 * In the non-POSIX case, we transform each character into a string of
41 * characters representing the character's priority. Since char is usually
42 * signed, we are limited by 7 bits per byte. To avoid zero, we need to add
43 * XFRM_OFFSET, so we can't use a full 7 bits. For simplicity, we choose 6
44 * bits per byte. We choose 4 bytes per character as a good compromise
45 * between maximum coverage and minimum size. This gives 24 bits, or 16M
46 * priorities. So we choose COLLATE_MAX_PRIORITY to be (2^24 - 1). This
47 * this can be increased if more is needed.
51 #define XFRM_OFFSET ('0') /* make all printable characters */
53 #define XFRM_MASK ((1 << XFRM_SHIFT) - 1)
56 xfrm(unsigned char *p
, int pri
)
59 p
[3] = (pri
& XFRM_MASK
) + XFRM_OFFSET
;
61 p
[2] = (pri
& XFRM_MASK
) + XFRM_OFFSET
;
63 p
[1] = (pri
& XFRM_MASK
) + XFRM_OFFSET
;
65 p
[0] = (pri
& XFRM_MASK
) + XFRM_OFFSET
;
69 strxfrm_l(char * __restrict dest
, const char * __restrict src
, size_t len
,
82 NORMALIZE_LOCALE(loc
);
83 if (loc
->__collate_load_error
|| (wcs
= __collate_mbstowcs(src
, loc
)) == NULL
) {
89 strncpy(dest
, src
, len
- 1);
96 __collate_xfrm(wcs
, xf
, loc
);
98 slen
= wcslen(xf
[0]) * XFRM_BYTES
;
100 slen
+= (wcslen(xf
[1]) + 1) * XFRM_BYTES
;
104 unsigned char buf
[XFRM_BYTES
];
110 xfrm(bp
= buf
, *w
++);
113 *dest
++ = *(char *)bp
++;
117 if ((w
= xf
[1]) != NULL
) {
123 *dest
++ = *(char *)bp
++;
132 xfrm(bp
= buf
, *w
++);
135 *dest
++ = *(char *)bp
++;
152 strxfrm(char * __restrict dest
, const char * __restrict src
, size_t len
)
154 return strxfrm_l(dest
, src
, len
, __current_locale());