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