Commit | Line | Data |
---|---|---|
8d7b8f97 | 1 | /*- |
2 | * Copyright 2010 Nexenta Systems, Inc. All rights reserved. | |
984263bc MD |
3 | * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua> |
4 | * at Electronni Visti IA, Kiev, Ukraine. | |
5 | * All rights reserved. | |
6 | * | |
0d5acd74 JM |
7 | * Copyright (c) 2011 The FreeBSD Foundation |
8 | * All rights reserved. | |
9 | * Portions of this software were developed by David Chisnall | |
10 | * under sponsorship from the FreeBSD Foundation. | |
11 | * | |
984263bc MD |
12 | * Redistribution and use in source and binary forms, with or without |
13 | * modification, are permitted provided that the following conditions | |
14 | * are met: | |
15 | * 1. Redistributions of source code must retain the above copyright | |
16 | * notice, this list of conditions and the following disclaimer. | |
17 | * 2. Redistributions in binary form must reproduce the above copyright | |
18 | * notice, this list of conditions and the following disclaimer in the | |
19 | * documentation and/or other materials provided with the distribution. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
32 | * | |
16db8bac | 33 | * Adapted to xlocale by John Marino <draco@marino.st> |
984263bc MD |
34 | */ |
35 | ||
36 | #ifndef _COLLATE_H_ | |
37 | #define _COLLATE_H_ | |
38 | ||
39 | #include <sys/cdefs.h> | |
40 | #include <sys/types.h> | |
41 | #include <limits.h> | |
e3c51d6d | 42 | #ifdef __LIBC |
0d5acd74 | 43 | #include "xlocale_private.h" |
e3c51d6d | 44 | #endif |
984263bc | 45 | |
eda2d2af | 46 | /* |
8d7b8f97 | 47 | * Work around buildworld bootstrapping from older systems whose limits.h |
eda2d2af JM |
48 | * sets COLL_WEIGHTS_MAX to 0. |
49 | */ | |
adb6cc9d | 50 | #ifdef BOOTSTRAPPING |
eda2d2af | 51 | #undef COLL_WEIGHTS_MAX |
adb6cc9d | 52 | #define COLL_WEIGHTS_MAX 10 /* keep in sync with <limits.h> */ |
eda2d2af JM |
53 | #endif |
54 | ||
16db8bac JM |
55 | #define COLLATE_STR_LEN 24 /* should be 64-bit multiple */ |
56 | #define COLLATE_VERSION "DragonFly-4.4\n" | |
984263bc | 57 | |
16db8bac JM |
58 | #define COLLATE_MAX_PRIORITY (0x7fffffff) /* max signed value */ |
59 | #define COLLATE_SUBST_PRIORITY (0x40000000) /* bit indicates subst table */ | |
60 | ||
61 | #define DIRECTIVE_UNDEF 0x00 | |
62 | #define DIRECTIVE_FORWARD 0x01 | |
63 | #define DIRECTIVE_BACKWARD 0x02 | |
64 | #define DIRECTIVE_POSITION 0x04 | |
65 | #define DIRECTIVE_UNDEFINED 0x08 /* special last weight for UNDEFINED */ | |
66 | ||
67 | #define DIRECTIVE_DIRECTION_MASK (DIRECTIVE_FORWARD | DIRECTIVE_BACKWARD) | |
984263bc | 68 | |
16db8bac JM |
69 | /* |
70 | * The collate file format is as follows: | |
71 | * | |
72 | * char version[COLLATE_STR_LEN]; // must be COLLATE_VERSION | |
73 | * collate_info_t info; // see below, includes padding | |
74 | * collate_char_pri_t char_data[256]; // 8 bit char values | |
75 | * collate_subst_t subst[*]; // 0 or more substitutions | |
76 | * collate_chain_pri_t chains[*]; // 0 or more chains | |
77 | * collate_large_pri_t large[*]; // extended char priorities | |
78 | * | |
79 | * Note that all structures must be 32-bit aligned, as each structure | |
80 | * contains 32-bit member fields. The entire file is mmap'd, so its | |
81 | * critical that alignment be observed. It is not generally safe to | |
82 | * use any 64-bit values in the structures. | |
83 | */ | |
84 | ||
85 | typedef struct collate_info { | |
86 | uint8_t directive_count; | |
87 | uint8_t directive[COLL_WEIGHTS_MAX]; | |
88 | int32_t pri_count[COLL_WEIGHTS_MAX]; | |
89 | int32_t flags; | |
90 | int32_t chain_count; | |
91 | int32_t large_count; | |
92 | int32_t subst_count[COLL_WEIGHTS_MAX]; | |
93 | int32_t undef_pri[COLL_WEIGHTS_MAX]; | |
94 | } collate_info_t; | |
95 | ||
96 | typedef struct collate_char { | |
97 | int32_t pri[COLL_WEIGHTS_MAX]; | |
98 | } collate_char_t; | |
99 | ||
100 | typedef struct collate_chain { | |
101 | wchar_t str[COLLATE_STR_LEN]; | |
102 | int32_t pri[COLL_WEIGHTS_MAX]; | |
103 | } collate_chain_t; | |
104 | ||
105 | typedef struct collate_large { | |
106 | int32_t val; | |
107 | collate_char_t pri; | |
108 | } collate_large_t; | |
109 | ||
110 | typedef struct collate_subst { | |
111 | int32_t key; | |
112 | int32_t pri[COLLATE_STR_LEN]; | |
113 | } collate_subst_t; | |
0d5acd74 | 114 | |
e3c51d6d | 115 | #ifdef __LIBC |
0d5acd74 JM |
116 | struct xlocale_collate { |
117 | struct xlocale_component header; | |
118 | int __collate_load_error; | |
16db8bac JM |
119 | char * map; |
120 | size_t maplen; | |
0d5acd74 | 121 | |
16db8bac JM |
122 | collate_info_t *info; |
123 | collate_char_t *char_pri_table; | |
124 | collate_large_t *large_pri_table; | |
125 | collate_chain_t *chain_pri_table; | |
126 | collate_subst_t *subst_table[COLL_WEIGHTS_MAX]; | |
0d5acd74 JM |
127 | }; |
128 | ||
984263bc | 129 | __BEGIN_DECLS |
984263bc | 130 | int __collate_load_tables(const char *); |
903faafa | 131 | int __collate_equiv_value(locale_t, const wchar_t *, size_t); |
16db8bac JM |
132 | void _collate_lookup(struct xlocale_collate *,const wchar_t *, int *, int *, |
133 | int, const int **); | |
f69bef86 | 134 | int __collate_range_cmp(char, char); |
135 | int __wcollate_range_cmp(wchar_t, wchar_t); | |
16db8bac JM |
136 | size_t _collate_wxfrm(struct xlocale_collate *, const wchar_t *, wchar_t *, |
137 | size_t); | |
138 | size_t _collate_sxfrm(struct xlocale_collate *, const wchar_t *, char *, | |
139 | size_t); | |
984263bc | 140 | __END_DECLS |
e3c51d6d | 141 | #endif |
984263bc MD |
142 | |
143 | #endif /* !_COLLATE_H_ */ |