xref: /dragonfly/lib/libc/locale/table.c (revision 6173c3df1b8620e08fd4b7a56592763b1641270d)
1 /*-
2  * Copyright (c) 1993
3  *        The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Paul Borman at Krystal Technologies.
7  *
8  * Copyright (c) 2011 The FreeBSD Foundation
9  * All rights reserved.
10  * Portions of this software were developed by David Chisnall
11  * under sponsorship from the FreeBSD Foundation.
12  *
13  * Redistribution and use in source and binary forms, with or without
14  * modification, are permitted provided that the following conditions
15  * are met:
16  * 1. Redistributions of source code must retain the above copyright
17  *    notice, this list of conditions and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  * 3. Neither the name of the University nor the names of its contributors
22  *    may be used to endorse or promote products derived from this software
23  *    without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35  * SUCH DAMAGE.
36  *
37  * @(#)table.c      8.1 (Berkeley) 6/27/93
38  * $FreeBSD: head/lib/libc/locale/table.c 232498 2012-03-04 15:31:13Z theraven $
39  */
40 
41 
42 #include <ctype.h>
43 #include <runetype.h>
44 #include <wchar.h>
45 #include "mblocal.h"
46 
47 const _RuneLocale _DefaultRuneLocale = {
48     .__magic = _RUNE_MAGIC_1,
49     .__encoding = "NONE",
50     .__sgetrune = NULL,
51     .__sputrune = NULL,
52     .__invalid_rune = 0xFFFD,
53 
54     .__runetype = {
55           /*00*/    _CTYPE_C,
56                     _CTYPE_C,
57                     _CTYPE_C,
58                     _CTYPE_C,
59                     _CTYPE_C,
60                     _CTYPE_C,
61                     _CTYPE_C,
62                     _CTYPE_C,
63           /*08*/    _CTYPE_C,
64                     _CTYPE_C|_CTYPE_S|_CTYPE_B,
65                     _CTYPE_C|_CTYPE_S,
66                     _CTYPE_C|_CTYPE_S,
67                     _CTYPE_C|_CTYPE_S,
68                     _CTYPE_C|_CTYPE_S,
69                     _CTYPE_C,
70                     _CTYPE_C,
71           /*10*/    _CTYPE_C,
72                     _CTYPE_C,
73                     _CTYPE_C,
74                     _CTYPE_C,
75                     _CTYPE_C,
76                     _CTYPE_C,
77                     _CTYPE_C,
78                     _CTYPE_C,
79           /*18*/    _CTYPE_C,
80                     _CTYPE_C,
81                     _CTYPE_C,
82                     _CTYPE_C,
83                     _CTYPE_C,
84                     _CTYPE_C,
85                     _CTYPE_C,
86                     _CTYPE_C,
87           /*20*/    _CTYPE_S|_CTYPE_B|_CTYPE_R,
88                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
89                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
90                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
91                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
92                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
93                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
94                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
95           /*28*/    _CTYPE_P|_CTYPE_R|_CTYPE_G,
96                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
97                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
98                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
99                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
100                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
101                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
102                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
103           /*30*/    _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|0,
104                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|1,
105                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|2,
106                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|3,
107                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|4,
108                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|5,
109                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|6,
110                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|7,
111           /*38*/    _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|8,
112                     _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|9,
113                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
114                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
115                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
116                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
117                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
118                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
119           /*40*/    _CTYPE_P|_CTYPE_R|_CTYPE_G,
120                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
121                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
122                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
123                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
124                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
125                     _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
126                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
127           /*48*/    _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
128                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
129                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
130                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
131                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
132                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
133                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
134                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
135           /*50*/    _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
136                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
137                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
138                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
139                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
140                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
141                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
142                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
143           /*58*/    _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
144                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
145                     _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
146                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
147                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
148                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
149                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
150                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
151           /*60*/    _CTYPE_P|_CTYPE_R|_CTYPE_G,
152                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
153                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
154                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
155                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
156                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
157                     _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
158                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
159           /*68*/    _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
160                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
161                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
162                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
163                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
164                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
165                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
166                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
167           /*70*/    _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
168                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
169                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
170                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
171                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
172                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
173                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
174                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
175           /*78*/    _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
176                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
177                     _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
178                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
179                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
180                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
181                     _CTYPE_P|_CTYPE_R|_CTYPE_G,
182                     _CTYPE_C,
183     },
184     .__maplower = {
185           0x00,     0x01,     0x02,     0x03,     0x04,     0x05,     0x06,     0x07,
186           0x08,     0x09,     0x0a,     0x0b,     0x0c,     0x0d,     0x0e,     0x0f,
187           0x10,     0x11,     0x12,     0x13,     0x14,     0x15,     0x16,     0x17,
188           0x18,     0x19,     0x1a,     0x1b,     0x1c,     0x1d,     0x1e,     0x1f,
189           0x20,     0x21,     0x22,     0x23,     0x24,     0x25,     0x26,     0x27,
190           0x28,     0x29,     0x2a,     0x2b,     0x2c,     0x2d,     0x2e,     0x2f,
191           0x30,     0x31,     0x32,     0x33,     0x34,     0x35,     0x36,     0x37,
192           0x38,     0x39,     0x3a,     0x3b,     0x3c,     0x3d,     0x3e,     0x3f,
193           0x40,     'a',      'b',      'c',      'd',      'e',      'f',      'g',
194           'h',      'i',      'j',      'k',      'l',      'm',      'n',      'o',
195           'p',      'q',      'r',      's',      't',      'u',      'v',      'w',
196           'x',      'y',      'z',      0x5b,     0x5c,     0x5d,     0x5e,     0x5f,
197           0x60,     'a',      'b',      'c',      'd',      'e',      'f',      'g',
198           'h',      'i',      'j',      'k',      'l',      'm',      'n',      'o',
199           'p',      'q',      'r',      's',      't',      'u',      'v',      'w',
200           'x',      'y',      'z',      0x7b,     0x7c,     0x7d,     0x7e,     0x7f,
201           0x80,     0x81,     0x82,     0x83,     0x84,     0x85,     0x86,     0x87,
202           0x88,     0x89,     0x8a,     0x8b,     0x8c,     0x8d,     0x8e,     0x8f,
203           0x90,     0x91,     0x92,     0x93,     0x94,     0x95,     0x96,     0x97,
204           0x98,     0x99,     0x9a,     0x9b,     0x9c,     0x9d,     0x9e,     0x9f,
205           0xa0,     0xa1,     0xa2,     0xa3,     0xa4,     0xa5,     0xa6,     0xa7,
206           0xa8,     0xa9,     0xaa,     0xab,     0xac,     0xad,     0xae,     0xaf,
207           0xb0,     0xb1,     0xb2,     0xb3,     0xb4,     0xb5,     0xb6,     0xb7,
208           0xb8,     0xb9,     0xba,     0xbb,     0xbc,     0xbd,     0xbe,     0xbf,
209           0xc0,     0xc1,     0xc2,     0xc3,     0xc4,     0xc5,     0xc6,     0xc7,
210           0xc8,     0xc9,     0xca,     0xcb,     0xcc,     0xcd,     0xce,     0xcf,
211           0xd0,     0xd1,     0xd2,     0xd3,     0xd4,     0xd5,     0xd6,     0xd7,
212           0xd8,     0xd9,     0xda,     0xdb,     0xdc,     0xdd,     0xde,     0xdf,
213           0xe0,     0xe1,     0xe2,     0xe3,     0xe4,     0xe5,     0xe6,     0xe7,
214           0xe8,     0xe9,     0xea,     0xeb,     0xec,     0xed,     0xee,     0xef,
215           0xf0,     0xf1,     0xf2,     0xf3,     0xf4,     0xf5,     0xf6,     0xf7,
216           0xf8,     0xf9,     0xfa,     0xfb,     0xfc,     0xfd,     0xfe,     0xff,
217     },
218     .__mapupper = {
219           0x00,     0x01,     0x02,     0x03,     0x04,     0x05,     0x06,     0x07,
220           0x08,     0x09,     0x0a,     0x0b,     0x0c,     0x0d,     0x0e,     0x0f,
221           0x10,     0x11,     0x12,     0x13,     0x14,     0x15,     0x16,     0x17,
222           0x18,     0x19,     0x1a,     0x1b,     0x1c,     0x1d,     0x1e,     0x1f,
223           0x20,     0x21,     0x22,     0x23,     0x24,     0x25,     0x26,     0x27,
224           0x28,     0x29,     0x2a,     0x2b,     0x2c,     0x2d,     0x2e,     0x2f,
225           0x30,     0x31,     0x32,     0x33,     0x34,     0x35,     0x36,     0x37,
226           0x38,     0x39,     0x3a,     0x3b,     0x3c,     0x3d,     0x3e,     0x3f,
227           0x40,     'A',      'B',      'C',      'D',      'E',      'F',      'G',
228           'H',      'I',      'J',      'K',      'L',      'M',      'N',      'O',
229           'P',      'Q',      'R',      'S',      'T',      'U',      'V',      'W',
230           'X',      'Y',      'Z',      0x5b,     0x5c,     0x5d,     0x5e,     0x5f,
231           0x60,     'A',      'B',      'C',      'D',      'E',      'F',      'G',
232           'H',      'I',      'J',      'K',      'L',      'M',      'N',      'O',
233           'P',      'Q',      'R',      'S',      'T',      'U',      'V',      'W',
234           'X',      'Y',      'Z',      0x7b,     0x7c,     0x7d,     0x7e,     0x7f,
235           0x80,     0x81,     0x82,     0x83,     0x84,     0x85,     0x86,     0x87,
236           0x88,     0x89,     0x8a,     0x8b,     0x8c,     0x8d,     0x8e,     0x8f,
237           0x90,     0x91,     0x92,     0x93,     0x94,     0x95,     0x96,     0x97,
238           0x98,     0x99,     0x9a,     0x9b,     0x9c,     0x9d,     0x9e,     0x9f,
239           0xa0,     0xa1,     0xa2,     0xa3,     0xa4,     0xa5,     0xa6,     0xa7,
240           0xa8,     0xa9,     0xaa,     0xab,     0xac,     0xad,     0xae,     0xaf,
241           0xb0,     0xb1,     0xb2,     0xb3,     0xb4,     0xb5,     0xb6,     0xb7,
242           0xb8,     0xb9,     0xba,     0xbb,     0xbc,     0xbd,     0xbe,     0xbf,
243           0xc0,     0xc1,     0xc2,     0xc3,     0xc4,     0xc5,     0xc6,     0xc7,
244           0xc8,     0xc9,     0xca,     0xcb,     0xcc,     0xcd,     0xce,     0xcf,
245           0xd0,     0xd1,     0xd2,     0xd3,     0xd4,     0xd5,     0xd6,     0xd7,
246           0xd8,     0xd9,     0xda,     0xdb,     0xdc,     0xdd,     0xde,     0xdf,
247           0xe0,     0xe1,     0xe2,     0xe3,     0xe4,     0xe5,     0xe6,     0xe7,
248           0xe8,     0xe9,     0xea,     0xeb,     0xec,     0xed,     0xee,     0xef,
249           0xf0,     0xf1,     0xf2,     0xf3,     0xf4,     0xf5,     0xf6,     0xf7,
250           0xf8,     0xf9,     0xfa,     0xfb,     0xfc,     0xfd,     0xfe,     0xff,
251     }
252 };
253 
254 #undef _CurrentRuneLocale
255 const _RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale;
256 
257 _RuneLocale *
__runes_for_locale(locale_t locale,int * mb_sb_limit)258 __runes_for_locale(locale_t locale, int *mb_sb_limit)
259 {
260           FIX_LOCALE(locale);
261           struct xlocale_ctype *c = XLOCALE_CTYPE(locale);
262           *mb_sb_limit = c->__mb_sb_limit;
263           return c->runes;
264 }
265