table.c revision 232498
1327Sjkh/*-
24996Sjkh * Copyright (c) 1993
3327Sjkh *	The Regents of the University of California.  All rights reserved.
4327Sjkh *
5327Sjkh * This code is derived from software contributed to Berkeley by
6327Sjkh * Paul Borman at Krystal Technologies.
7327Sjkh *
8327Sjkh * Copyright (c) 2011 The FreeBSD Foundation
9327Sjkh * All rights reserved.
10327Sjkh * Portions of this software were developed by David Chisnall
11327Sjkh * under sponsorship from the FreeBSD Foundation.
12327Sjkh *
13327Sjkh * Redistribution and use in source and binary forms, with or without
14327Sjkh * modification, are permitted provided that the following conditions
15327Sjkh * are met:
16327Sjkh * 1. Redistributions of source code must retain the above copyright
17327Sjkh *    notice, this list of conditions and the following disclaimer.
18327Sjkh * 2. Redistributions in binary form must reproduce the above copyright
194996Sjkh *    notice, this list of conditions and the following disclaimer in the
20327Sjkh *    documentation and/or other materials provided with the distribution.
21327Sjkh * 4. Neither the name of the University nor the names of its contributors
22327Sjkh *    may be used to endorse or promote products derived from this software
23327Sjkh *    without specific prior written permission.
244996Sjkh *
25327Sjkh * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26327Sjkh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27327Sjkh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28327Sjkh * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29383Sjkh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30445Sjkh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
314996Sjkh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
321520Salm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33327Sjkh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34327Sjkh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35327Sjkh * SUCH DAMAGE.
36327Sjkh */
37327Sjkh
38327Sjkh#if defined(LIBC_SCCS) && !defined(lint)
39327Sjkhstatic char sccsid[] = "@(#)table.c	8.1 (Berkeley) 6/27/93";
40327Sjkh#endif /* LIBC_SCCS and not lint */
41327Sjkh#include <sys/cdefs.h>
42327Sjkh__FBSDID("$FreeBSD: head/lib/libc/locale/table.c 232498 2012-03-04 15:31:13Z theraven $");
43327Sjkh
44327Sjkh#include <ctype.h>
45327Sjkh#include <runetype.h>
46327Sjkh#include <wchar.h>
47327Sjkh#include "mblocal.h"
481337Sjkh
491337Sjkhconst _RuneLocale _DefaultRuneLocale = {
501337Sjkh    _RUNE_MAGIC_1,
511337Sjkh    "NONE",
521337Sjkh    NULL,
531337Sjkh    NULL,
541337Sjkh    0xFFFD,
551337Sjkh
56327Sjkh    {	/*00*/	_CTYPE_C,
57327Sjkh		_CTYPE_C,
58327Sjkh		_CTYPE_C,
59327Sjkh		_CTYPE_C,
60327Sjkh		_CTYPE_C,
61327Sjkh		_CTYPE_C,
62327Sjkh		_CTYPE_C,
63327Sjkh		_CTYPE_C,
64327Sjkh	/*08*/	_CTYPE_C,
65327Sjkh		_CTYPE_C|_CTYPE_S|_CTYPE_B,
66327Sjkh		_CTYPE_C|_CTYPE_S,
67327Sjkh		_CTYPE_C|_CTYPE_S,
68327Sjkh		_CTYPE_C|_CTYPE_S,
69327Sjkh		_CTYPE_C|_CTYPE_S,
70327Sjkh		_CTYPE_C,
71327Sjkh		_CTYPE_C,
72327Sjkh	/*10*/	_CTYPE_C,
73327Sjkh		_CTYPE_C,
74327Sjkh		_CTYPE_C,
75327Sjkh		_CTYPE_C,
76327Sjkh		_CTYPE_C,
77327Sjkh		_CTYPE_C,
78327Sjkh		_CTYPE_C,
79327Sjkh		_CTYPE_C,
80327Sjkh	/*18*/	_CTYPE_C,
81327Sjkh		_CTYPE_C,
82327Sjkh		_CTYPE_C,
83327Sjkh		_CTYPE_C,
84383Sjkh		_CTYPE_C,
85383Sjkh		_CTYPE_C,
86383Sjkh		_CTYPE_C,
87383Sjkh		_CTYPE_C,
88445Sjkh	/*20*/	_CTYPE_S|_CTYPE_B|_CTYPE_R,
89445Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
90445Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
91445Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
92327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
931520Salm		_CTYPE_P|_CTYPE_R|_CTYPE_G,
941520Salm		_CTYPE_P|_CTYPE_R|_CTYPE_G,
951520Salm		_CTYPE_P|_CTYPE_R|_CTYPE_G,
964996Sjkh	/*28*/	_CTYPE_P|_CTYPE_R|_CTYPE_G,
974996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
984996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
994996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
1004996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
1014996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
1024996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
1034996Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
104327Sjkh	/*30*/	_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|0,
105327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|1,
106327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|2,
107327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|3,
108327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|4,
109327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|5,
110327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|6,
111327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|7,
112327Sjkh	/*38*/	_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|8,
113327Sjkh		_CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X|9,
114327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
115327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
116327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
117327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
118327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
119327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
120327Sjkh	/*40*/	_CTYPE_P|_CTYPE_R|_CTYPE_G,
121327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
122327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
123327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
124327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
125327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
126327Sjkh		_CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
127327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
128327Sjkh	/*48*/	_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
129327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
130327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
131327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
132327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
133327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
134327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
135327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
136327Sjkh	/*50*/	_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
137327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
138327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
139327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
140327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
141327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
142327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
143327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
144327Sjkh	/*58*/	_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
145327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
146327Sjkh		_CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A,
147327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
148327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
149327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
150327Sjkh		_CTYPE_P|_CTYPE_R|_CTYPE_G,
1511520Salm		_CTYPE_P|_CTYPE_R|_CTYPE_G,
152327Sjkh	/*60*/	_CTYPE_P|_CTYPE_R|_CTYPE_G,
153327Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|10,
1544996Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|11,
1554996Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|12,
1564996Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|13,
157327Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|14,
158383Sjkh		_CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A|15,
159445Sjkh		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
160327Sjkh	/*68*/	_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
1614996Sjkh		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
1624996Sjkh		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
163327Sjkh		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
164327Sjkh		_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	/*70*/	_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		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
176	/*78*/	_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
177		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
178		_CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A,
179		_CTYPE_P|_CTYPE_R|_CTYPE_G,
180		_CTYPE_P|_CTYPE_R|_CTYPE_G,
181		_CTYPE_P|_CTYPE_R|_CTYPE_G,
182		_CTYPE_P|_CTYPE_R|_CTYPE_G,
183		_CTYPE_C,
184    },
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    {	0x00,	0x01,	0x02,	0x03,	0x04,	0x05,	0x06,	0x07,
219     	0x08,	0x09,	0x0a,	0x0b,	0x0c,	0x0d,	0x0e,	0x0f,
220	0x10,	0x11,	0x12,	0x13,	0x14,	0x15,	0x16,	0x17,
221     	0x18,	0x19,	0x1a,	0x1b,	0x1c,	0x1d,	0x1e,	0x1f,
222	0x20,	0x21,	0x22,	0x23,	0x24,	0x25,	0x26,	0x27,
223     	0x28,	0x29,	0x2a,	0x2b,	0x2c,	0x2d,	0x2e,	0x2f,
224	0x30,	0x31,	0x32,	0x33,	0x34,	0x35,	0x36,	0x37,
225     	0x38,	0x39,	0x3a,	0x3b,	0x3c,	0x3d,	0x3e,	0x3f,
226	0x40,	'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',	0x5b,	0x5c,	0x5d,	0x5e,	0x5f,
230	0x60,	'A',	'B',	'C',	'D',	'E',	'F',	'G',
231     	'H',	'I',	'J',	'K',	'L',	'M',	'N',	'O',
232	'P',	'Q',	'R',	'S',	'T',	'U',	'V',	'W',
233     	'X',	'Y',	'Z',	0x7b,	0x7c,	0x7d,	0x7e,	0x7f,
234	0x80,	0x81,	0x82,	0x83,	0x84,	0x85,	0x86,	0x87,
235     	0x88,	0x89,	0x8a,	0x8b,	0x8c,	0x8d,	0x8e,	0x8f,
236	0x90,	0x91,	0x92,	0x93,	0x94,	0x95,	0x96,	0x97,
237     	0x98,	0x99,	0x9a,	0x9b,	0x9c,	0x9d,	0x9e,	0x9f,
238	0xa0,	0xa1,	0xa2,	0xa3,	0xa4,	0xa5,	0xa6,	0xa7,
239     	0xa8,	0xa9,	0xaa,	0xab,	0xac,	0xad,	0xae,	0xaf,
240	0xb0,	0xb1,	0xb2,	0xb3,	0xb4,	0xb5,	0xb6,	0xb7,
241     	0xb8,	0xb9,	0xba,	0xbb,	0xbc,	0xbd,	0xbe,	0xbf,
242	0xc0,	0xc1,	0xc2,	0xc3,	0xc4,	0xc5,	0xc6,	0xc7,
243     	0xc8,	0xc9,	0xca,	0xcb,	0xcc,	0xcd,	0xce,	0xcf,
244	0xd0,	0xd1,	0xd2,	0xd3,	0xd4,	0xd5,	0xd6,	0xd7,
245     	0xd8,	0xd9,	0xda,	0xdb,	0xdc,	0xdd,	0xde,	0xdf,
246	0xe0,	0xe1,	0xe2,	0xe3,	0xe4,	0xe5,	0xe6,	0xe7,
247     	0xe8,	0xe9,	0xea,	0xeb,	0xec,	0xed,	0xee,	0xef,
248	0xf0,	0xf1,	0xf2,	0xf3,	0xf4,	0xf5,	0xf6,	0xf7,
249     	0xf8,	0xf9,	0xfa,	0xfb,	0xfc,	0xfd,	0xfe,	0xff,
250    },
251};
252
253#undef _CurrentRuneLocale
254const _RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale;
255
256_RuneLocale *
257__runes_for_locale(locale_t locale, int *mb_sb_limit)
258{
259	FIX_LOCALE(locale);
260	struct xlocale_ctype *c = XLOCALE_CTYPE(locale);
261	*mb_sb_limit = c->__mb_sb_limit;
262	return c->runes;
263}
264