1 /*
2  * linux/fs/nls/nls_cp874.c
3  *
4  * Charset cp874 translation tables.
5  * Generated automatically from the Unicode and charset
6  * tables from the Unicode Organization (www.unicode.org).
7  * The Unicode to charset table has only exact mappings.
8  */
9 
10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/string.h>
13 #include <linux/nls.h>
14 #include <linux/errno.h>
15 
16 static const wchar_t charset2uni[256] = {
17 	/* 0x00*/
18 	0x0000, 0x0001, 0x0002, 0x0003,
19 	0x0004, 0x0005, 0x0006, 0x0007,
20 	0x0008, 0x0009, 0x000a, 0x000b,
21 	0x000c, 0x000d, 0x000e, 0x000f,
22 	/* 0x10*/
23 	0x0010, 0x0011, 0x0012, 0x0013,
24 	0x0014, 0x0015, 0x0016, 0x0017,
25 	0x0018, 0x0019, 0x001a, 0x001b,
26 	0x001c, 0x001d, 0x001e, 0x001f,
27 	/* 0x20*/
28 	0x0020, 0x0021, 0x0022, 0x0023,
29 	0x0024, 0x0025, 0x0026, 0x0027,
30 	0x0028, 0x0029, 0x002a, 0x002b,
31 	0x002c, 0x002d, 0x002e, 0x002f,
32 	/* 0x30*/
33 	0x0030, 0x0031, 0x0032, 0x0033,
34 	0x0034, 0x0035, 0x0036, 0x0037,
35 	0x0038, 0x0039, 0x003a, 0x003b,
36 	0x003c, 0x003d, 0x003e, 0x003f,
37 	/* 0x40*/
38 	0x0040, 0x0041, 0x0042, 0x0043,
39 	0x0044, 0x0045, 0x0046, 0x0047,
40 	0x0048, 0x0049, 0x004a, 0x004b,
41 	0x004c, 0x004d, 0x004e, 0x004f,
42 	/* 0x50*/
43 	0x0050, 0x0051, 0x0052, 0x0053,
44 	0x0054, 0x0055, 0x0056, 0x0057,
45 	0x0058, 0x0059, 0x005a, 0x005b,
46 	0x005c, 0x005d, 0x005e, 0x005f,
47 	/* 0x60*/
48 	0x0060, 0x0061, 0x0062, 0x0063,
49 	0x0064, 0x0065, 0x0066, 0x0067,
50 	0x0068, 0x0069, 0x006a, 0x006b,
51 	0x006c, 0x006d, 0x006e, 0x006f,
52 	/* 0x70*/
53 	0x0070, 0x0071, 0x0072, 0x0073,
54 	0x0074, 0x0075, 0x0076, 0x0077,
55 	0x0078, 0x0079, 0x007a, 0x007b,
56 	0x007c, 0x007d, 0x007e, 0x007f,
57 	/* 0x80*/
58 	0x0000, 0x0000, 0x0000, 0x0000,
59 	0x0000, 0x2026, 0x0000, 0x0000,
60 	0x0000, 0x0000, 0x0000, 0x0000,
61 	0x0000, 0x0000, 0x0000, 0x0000,
62 	/* 0x90*/
63 	0x0000, 0x2018, 0x2019, 0x201c,
64 	0x201d, 0x2022, 0x2013, 0x2014,
65 	0x0000, 0x0000, 0x0000, 0x0000,
66 	0x0000, 0x0000, 0x0000, 0x0000,
67 	/* 0xa0*/
68 	0x00a0, 0x0e01, 0x0e02, 0x0e03,
69 	0x0e04, 0x0e05, 0x0e06, 0x0e07,
70 	0x0e08, 0x0e09, 0x0e0a, 0x0e0b,
71 	0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
72 	/* 0xb0*/
73 	0x0e10, 0x0e11, 0x0e12, 0x0e13,
74 	0x0e14, 0x0e15, 0x0e16, 0x0e17,
75 	0x0e18, 0x0e19, 0x0e1a, 0x0e1b,
76 	0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
77 	/* 0xc0*/
78 	0x0e20, 0x0e21, 0x0e22, 0x0e23,
79 	0x0e24, 0x0e25, 0x0e26, 0x0e27,
80 	0x0e28, 0x0e29, 0x0e2a, 0x0e2b,
81 	0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
82 	/* 0xd0*/
83 	0x0e30, 0x0e31, 0x0e32, 0x0e33,
84 	0x0e34, 0x0e35, 0x0e36, 0x0e37,
85 	0x0e38, 0x0e39, 0x0e3a, 0x0000,
86 	0x0000, 0x0000, 0x0000, 0x0e3f,
87 	/* 0xe0*/
88 	0x0e40, 0x0e41, 0x0e42, 0x0e43,
89 	0x0e44, 0x0e45, 0x0e46, 0x0e47,
90 	0x0e48, 0x0e49, 0x0e4a, 0x0e4b,
91 	0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
92 	/* 0xf0*/
93 	0x0e50, 0x0e51, 0x0e52, 0x0e53,
94 	0x0e54, 0x0e55, 0x0e56, 0x0e57,
95 	0x0e58, 0x0e59, 0x0e5a, 0x0e5b,
96 	0x0000, 0x0000, 0x0000, 0x0000,
97 };
98 
99 static const unsigned char page00[256] = {
100 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
101 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
102 	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
103 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
104 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
105 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
106 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
107 	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
108 	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
109 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
110 	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
111 	0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
112 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
113 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
114 	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
115 	0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
116 
117 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
118 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
119 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
120 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
121 	0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
122 };
123 
124 static const unsigned char page0e[256] = {
125 	0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */
126 	0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */
127 	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */
128 	0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */
129 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
130 	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
131 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
132 	0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */
133 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
134 	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
135 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */
136 	0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
137 };
138 
139 static const unsigned char page20[256] = {
140 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
141 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
142 	0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
143 	0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x00, 0x00, /* 0x18-0x1f */
144 	0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
145 };
146 
147 static const unsigned char *const page_uni2charset[256] = {
148 	page00, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
149 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   page0e, NULL,
150 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
151 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
152 	page20, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
153 };
154 
155 static const unsigned char charset2lower[256] = {
156 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
157 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
158 	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
159 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
160 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
161 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
162 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
163 	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
164 	0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x40-0x47 */
165 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x48-0x4f */
166 	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x50-0x57 */
167 	0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
168 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
169 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
170 	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
171 	0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
172 
173 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, /* 0x80-0x87 */
174 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
175 	0x00, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */
176 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
177 	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
178 	0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
179 	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
180 	0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */
181 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
182 	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
183 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
184 	0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
185 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
186 	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
187 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
188 	0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
189 };
190 
191 static const unsigned char charset2upper[256] = {
192 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
193 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
194 	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
195 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
196 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
197 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
198 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
199 	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
200 	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
201 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
202 	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
203 	0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
204 	0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x60-0x67 */
205 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x68-0x6f */
206 	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x70-0x77 */
207 	0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
208 
209 	0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, /* 0x80-0x87 */
210 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
211 	0x00, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */
212 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
213 	0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
214 	0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
215 	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
216 	0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */
217 	0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
218 	0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
219 	0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
220 	0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
221 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
222 	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
223 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
224 	0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
225 };
226 
uni2char(wchar_t uni,unsigned char * out,int boundlen)227 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
228 {
229 	const unsigned char *uni2charset;
230 	unsigned char cl = uni & 0x00ff;
231 	unsigned char ch = (uni & 0xff00) >> 8;
232 
233 	if (boundlen <= 0)
234 		return -ENAMETOOLONG;
235 
236 	uni2charset = page_uni2charset[ch];
237 	if (uni2charset && uni2charset[cl])
238 		out[0] = uni2charset[cl];
239 	else
240 		return -EINVAL;
241 	return 1;
242 }
243 
char2uni(const unsigned char * rawstring,int boundlen,wchar_t * uni)244 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
245 {
246 	*uni = charset2uni[*rawstring];
247 	if (*uni == 0x0000)
248 		return -EINVAL;
249 	return 1;
250 }
251 
252 static struct nls_table table = {
253 	.charset	= "cp874",
254 	.alias		= "tis-620",
255 	.uni2char	= uni2char,
256 	.char2uni	= char2uni,
257 	.charset2lower	= charset2lower,
258 	.charset2upper	= charset2upper,
259 };
260 
init_nls_cp874(void)261 static int __init init_nls_cp874(void)
262 {
263 	return register_nls(&table);
264 }
265 
exit_nls_cp874(void)266 static void __exit exit_nls_cp874(void)
267 {
268 	unregister_nls(&table);
269 }
270 
271 module_init(init_nls_cp874)
272 module_exit(exit_nls_cp874)
273 
274 MODULE_DESCRIPTION("NLS Thai charset (CP874, TIS-620)");
275 MODULE_LICENSE("Dual BSD/GPL");
276 MODULE_ALIAS_NLS(tis-620);
277