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