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 *
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#include <ctype.h>
41#include <runetype.h>
42#include <wchar.h>
43#include "mblocal.h"
44
45const _RuneLocale _DefaultRuneLocale = {
46    _RUNE_MAGIC_1,
47    "NONE",
48    NULL,
49    NULL,
50    0xFFFD,
51
52    {	/*00*/	_CTYPE_C,
53		_CTYPE_C,
54		_CTYPE_C,
55		_CTYPE_C,
56		_CTYPE_C,
57		_CTYPE_C,
58		_CTYPE_C,
59		_CTYPE_C,
60	/*08*/	_CTYPE_C,
61		_CTYPE_C|_CTYPE_S|_CTYPE_B,
62		_CTYPE_C|_CTYPE_S,
63		_CTYPE_C|_CTYPE_S,
64		_CTYPE_C|_CTYPE_S,
65		_CTYPE_C|_CTYPE_S,
66		_CTYPE_C,
67		_CTYPE_C,
68	/*10*/	_CTYPE_C,
69		_CTYPE_C,
70		_CTYPE_C,
71		_CTYPE_C,
72		_CTYPE_C,
73		_CTYPE_C,
74		_CTYPE_C,
75		_CTYPE_C,
76	/*18*/	_CTYPE_C,
77		_CTYPE_C,
78		_CTYPE_C,
79		_CTYPE_C,
80		_CTYPE_C,
81		_CTYPE_C,
82		_CTYPE_C,
83		_CTYPE_C,
84	/*20*/	_CTYPE_S|_CTYPE_B|_CTYPE_R,
85		_CTYPE_P|_CTYPE_R|_CTYPE_G,
86		_CTYPE_P|_CTYPE_R|_CTYPE_G,
87		_CTYPE_P|_CTYPE_R|_CTYPE_G,
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	/*28*/	_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		_CTYPE_P|_CTYPE_R|_CTYPE_G,
99		_CTYPE_P|_CTYPE_R|_CTYPE_G,
100	/*30*/	_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|0,
101		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|1,
102		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|2,
103		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|3,
104		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|4,
105		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|5,
106		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|6,
107		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|7,
108	/*38*/	_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|8,
109		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|_CTYPE_N|9,
110		_CTYPE_P|_CTYPE_R|_CTYPE_G,
111		_CTYPE_P|_CTYPE_R|_CTYPE_G,
112		_CTYPE_P|_CTYPE_R|_CTYPE_G,
113		_CTYPE_P|_CTYPE_R|_CTYPE_G,
114		_CTYPE_P|_CTYPE_R|_CTYPE_G,
115		_CTYPE_P|_CTYPE_R|_CTYPE_G,
116	/*40*/	_CTYPE_P|_CTYPE_R|_CTYPE_G,
117		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
118		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
119		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
120		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
121		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
122		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
123		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
124	/*48*/	_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
125		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
126		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
127		_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	/*50*/	_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		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
139		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
140	/*58*/	_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_P|_CTYPE_R|_CTYPE_G,
144		_CTYPE_P|_CTYPE_R|_CTYPE_G,
145		_CTYPE_P|_CTYPE_R|_CTYPE_G,
146		_CTYPE_P|_CTYPE_R|_CTYPE_G,
147		_CTYPE_P|_CTYPE_R|_CTYPE_G,
148	/*60*/	_CTYPE_P|_CTYPE_R|_CTYPE_G,
149		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
150		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
151		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
152		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
153		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
154		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
155		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
156	/*68*/	_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
157		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
158		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
159		_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	/*70*/	_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		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
171		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
172	/*78*/	_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_P|_CTYPE_R|_CTYPE_G,
176		_CTYPE_P|_CTYPE_R|_CTYPE_G,
177		_CTYPE_P|_CTYPE_R|_CTYPE_G,
178		_CTYPE_P|_CTYPE_R|_CTYPE_G,
179		_CTYPE_C,
180    },
181    {	0x00,	0x01,	0x02,	0x03,	0x04,	0x05,	0x06,	0x07,
182     	0x08,	0x09,	0x0a,	0x0b,	0x0c,	0x0d,	0x0e,	0x0f,
183	0x10,	0x11,	0x12,	0x13,	0x14,	0x15,	0x16,	0x17,
184     	0x18,	0x19,	0x1a,	0x1b,	0x1c,	0x1d,	0x1e,	0x1f,
185	0x20,	0x21,	0x22,	0x23,	0x24,	0x25,	0x26,	0x27,
186     	0x28,	0x29,	0x2a,	0x2b,	0x2c,	0x2d,	0x2e,	0x2f,
187	0x30,	0x31,	0x32,	0x33,	0x34,	0x35,	0x36,	0x37,
188     	0x38,	0x39,	0x3a,	0x3b,	0x3c,	0x3d,	0x3e,	0x3f,
189	0x40,	'a',	'b',	'c',	'd',	'e',	'f',	'g',
190     	'h',	'i',	'j',	'k',	'l',	'm',	'n',	'o',
191	'p',	'q',	'r',	's',	't',	'u',	'v',	'w',
192     	'x',	'y',	'z',	0x5b,	0x5c,	0x5d,	0x5e,	0x5f,
193	0x60,	'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',	0x7b,	0x7c,	0x7d,	0x7e,	0x7f,
197	0x80,	0x81,	0x82,	0x83,	0x84,	0x85,	0x86,	0x87,
198     	0x88,	0x89,	0x8a,	0x8b,	0x8c,	0x8d,	0x8e,	0x8f,
199	0x90,	0x91,	0x92,	0x93,	0x94,	0x95,	0x96,	0x97,
200     	0x98,	0x99,	0x9a,	0x9b,	0x9c,	0x9d,	0x9e,	0x9f,
201	0xa0,	0xa1,	0xa2,	0xa3,	0xa4,	0xa5,	0xa6,	0xa7,
202     	0xa8,	0xa9,	0xaa,	0xab,	0xac,	0xad,	0xae,	0xaf,
203	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0xb6,	0xb7,
204     	0xb8,	0xb9,	0xba,	0xbb,	0xbc,	0xbd,	0xbe,	0xbf,
205	0xc0,	0xc1,	0xc2,	0xc3,	0xc4,	0xc5,	0xc6,	0xc7,
206     	0xc8,	0xc9,	0xca,	0xcb,	0xcc,	0xcd,	0xce,	0xcf,
207	0xd0,	0xd1,	0xd2,	0xd3,	0xd4,	0xd5,	0xd6,	0xd7,
208     	0xd8,	0xd9,	0xda,	0xdb,	0xdc,	0xdd,	0xde,	0xdf,
209	0xe0,	0xe1,	0xe2,	0xe3,	0xe4,	0xe5,	0xe6,	0xe7,
210     	0xe8,	0xe9,	0xea,	0xeb,	0xec,	0xed,	0xee,	0xef,
211	0xf0,	0xf1,	0xf2,	0xf3,	0xf4,	0xf5,	0xf6,	0xf7,
212     	0xf8,	0xf9,	0xfa,	0xfb,	0xfc,	0xfd,	0xfe,	0xff,
213    },
214    {	0x00,	0x01,	0x02,	0x03,	0x04,	0x05,	0x06,	0x07,
215     	0x08,	0x09,	0x0a,	0x0b,	0x0c,	0x0d,	0x0e,	0x0f,
216	0x10,	0x11,	0x12,	0x13,	0x14,	0x15,	0x16,	0x17,
217     	0x18,	0x19,	0x1a,	0x1b,	0x1c,	0x1d,	0x1e,	0x1f,
218	0x20,	0x21,	0x22,	0x23,	0x24,	0x25,	0x26,	0x27,
219     	0x28,	0x29,	0x2a,	0x2b,	0x2c,	0x2d,	0x2e,	0x2f,
220	0x30,	0x31,	0x32,	0x33,	0x34,	0x35,	0x36,	0x37,
221     	0x38,	0x39,	0x3a,	0x3b,	0x3c,	0x3d,	0x3e,	0x3f,
222	0x40,	'A',	'B',	'C',	'D',	'E',	'F',	'G',
223     	'H',	'I',	'J',	'K',	'L',	'M',	'N',	'O',
224	'P',	'Q',	'R',	'S',	'T',	'U',	'V',	'W',
225     	'X',	'Y',	'Z',	0x5b,	0x5c,	0x5d,	0x5e,	0x5f,
226	0x60,	'A',	'B',	'C',	'D',	'E',	'F',	'G',
227     	'H',	'I',	'J',	'K',	'L',	'M',	'N',	'O',
228	'P',	'Q',	'R',	'S',	'T',	'U',	'V',	'W',
229     	'X',	'Y',	'Z',	0x7b,	0x7c,	0x7d,	0x7e,	0x7f,
230	0x80,	0x81,	0x82,	0x83,	0x84,	0x85,	0x86,	0x87,
231     	0x88,	0x89,	0x8a,	0x8b,	0x8c,	0x8d,	0x8e,	0x8f,
232	0x90,	0x91,	0x92,	0x93,	0x94,	0x95,	0x96,	0x97,
233     	0x98,	0x99,	0x9a,	0x9b,	0x9c,	0x9d,	0x9e,	0x9f,
234	0xa0,	0xa1,	0xa2,	0xa3,	0xa4,	0xa5,	0xa6,	0xa7,
235     	0xa8,	0xa9,	0xaa,	0xab,	0xac,	0xad,	0xae,	0xaf,
236	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0xb6,	0xb7,
237     	0xb8,	0xb9,	0xba,	0xbb,	0xbc,	0xbd,	0xbe,	0xbf,
238	0xc0,	0xc1,	0xc2,	0xc3,	0xc4,	0xc5,	0xc6,	0xc7,
239     	0xc8,	0xc9,	0xca,	0xcb,	0xcc,	0xcd,	0xce,	0xcf,
240	0xd0,	0xd1,	0xd2,	0xd3,	0xd4,	0xd5,	0xd6,	0xd7,
241     	0xd8,	0xd9,	0xda,	0xdb,	0xdc,	0xdd,	0xde,	0xdf,
242	0xe0,	0xe1,	0xe2,	0xe3,	0xe4,	0xe5,	0xe6,	0xe7,
243     	0xe8,	0xe9,	0xea,	0xeb,	0xec,	0xed,	0xee,	0xef,
244	0xf0,	0xf1,	0xf2,	0xf3,	0xf4,	0xf5,	0xf6,	0xf7,
245     	0xf8,	0xf9,	0xfa,	0xfb,	0xfc,	0xfd,	0xfe,	0xff,
246    },
247};
248
249#undef _CurrentRuneLocale
250const _RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale;
251
252_RuneLocale *
253__runes_for_locale(locale_t locale, int *mb_sb_limit)
254{
255	FIX_LOCALE(locale);
256	struct xlocale_ctype *c = XLOCALE_CTYPE(locale);
257	*mb_sb_limit = c->__mb_sb_limit;
258	return c->runes;
259}
260