This source file includes following definitions.
- uni2char
- char2uni
- init_nls_cp864
- exit_nls_cp864
1
2
3
4
5
6
7
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
18 0x0000, 0x0001, 0x0002, 0x0003,
19 0x0004, 0x0005, 0x0006, 0x0007,
20 0x0008, 0x0009, 0x000a, 0x000b,
21 0x000c, 0x000d, 0x000e, 0x000f,
22
23 0x0010, 0x0011, 0x0012, 0x0013,
24 0x0014, 0x0015, 0x0016, 0x0017,
25 0x0018, 0x0019, 0x001a, 0x001b,
26 0x001c, 0x001d, 0x001e, 0x001f,
27
28 0x0020, 0x0021, 0x0022, 0x0023,
29 0x0024, 0x066a, 0x0026, 0x0027,
30 0x0028, 0x0029, 0x002a, 0x002b,
31 0x002c, 0x002d, 0x002e, 0x002f,
32
33 0x0030, 0x0031, 0x0032, 0x0033,
34 0x0034, 0x0035, 0x0036, 0x0037,
35 0x0038, 0x0039, 0x003a, 0x003b,
36 0x003c, 0x003d, 0x003e, 0x003f,
37
38 0x0040, 0x0041, 0x0042, 0x0043,
39 0x0044, 0x0045, 0x0046, 0x0047,
40 0x0048, 0x0049, 0x004a, 0x004b,
41 0x004c, 0x004d, 0x004e, 0x004f,
42
43 0x0050, 0x0051, 0x0052, 0x0053,
44 0x0054, 0x0055, 0x0056, 0x0057,
45 0x0058, 0x0059, 0x005a, 0x005b,
46 0x005c, 0x005d, 0x005e, 0x005f,
47
48 0x0060, 0x0061, 0x0062, 0x0063,
49 0x0064, 0x0065, 0x0066, 0x0067,
50 0x0068, 0x0069, 0x006a, 0x006b,
51 0x006c, 0x006d, 0x006e, 0x006f,
52
53 0x0070, 0x0071, 0x0072, 0x0073,
54 0x0074, 0x0075, 0x0076, 0x0077,
55 0x0078, 0x0079, 0x007a, 0x007b,
56 0x007c, 0x007d, 0x007e, 0x007f,
57
58 0x00b0, 0x00b7, 0x2219, 0x221a,
59 0x2592, 0x2500, 0x2502, 0x253c,
60 0x2524, 0x252c, 0x251c, 0x2534,
61 0x2510, 0x250c, 0x2514, 0x2518,
62
63 0x03b2, 0x221e, 0x03c6, 0x00b1,
64 0x00bd, 0x00bc, 0x2248, 0x00ab,
65 0x00bb, 0xfef7, 0xfef8, 0x0000,
66 0x0000, 0xfefb, 0xfefc, 0x0000,
67
68 0x00a0, 0x00ad, 0xfe82, 0x00a3,
69 0x00a4, 0xfe84, 0x0000, 0x0000,
70 0xfe8e, 0xfe8f, 0xfe95, 0xfe99,
71 0x060c, 0xfe9d, 0xfea1, 0xfea5,
72
73 0x0660, 0x0661, 0x0662, 0x0663,
74 0x0664, 0x0665, 0x0666, 0x0667,
75 0x0668, 0x0669, 0xfed1, 0x061b,
76 0xfeb1, 0xfeb5, 0xfeb9, 0x061f,
77
78 0x00a2, 0xfe80, 0xfe81, 0xfe83,
79 0xfe85, 0xfeca, 0xfe8b, 0xfe8d,
80 0xfe91, 0xfe93, 0xfe97, 0xfe9b,
81 0xfe9f, 0xfea3, 0xfea7, 0xfea9,
82
83 0xfeab, 0xfead, 0xfeaf, 0xfeb3,
84 0xfeb7, 0xfebb, 0xfebf, 0xfec1,
85 0xfec5, 0xfecb, 0xfecf, 0x00a6,
86 0x00ac, 0x00f7, 0x00d7, 0xfec9,
87
88 0x0640, 0xfed3, 0xfed7, 0xfedb,
89 0xfedf, 0xfee3, 0xfee7, 0xfeeb,
90 0xfeed, 0xfeef, 0xfef3, 0xfebd,
91 0xfecc, 0xfece, 0xfecd, 0xfee1,
92
93 0xfe7d, 0x0651, 0xfee5, 0xfee9,
94 0xfeec, 0xfef0, 0xfef2, 0xfed0,
95 0xfed5, 0xfef5, 0xfef6, 0xfedd,
96 0xfed9, 0xfef1, 0x25a0, 0x0000,
97 };
98
99 static const unsigned char page00[256] = {
100 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
101 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
104 0x20, 0x21, 0x22, 0x23, 0x24, 0x00, 0x26, 0x27,
105 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
106 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
107 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
108 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
109 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
110 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
111 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
112 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
113 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
114 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
115 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
116
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0xa0, 0x00, 0xc0, 0xa3, 0xa4, 0x00, 0xdb, 0x00,
122 0x00, 0x00, 0x00, 0x97, 0xdc, 0xa1, 0x00, 0x00,
123 0x80, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
124 0x00, 0x00, 0x00, 0x98, 0x95, 0x94, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd,
132 };
133
134 static const unsigned char page03[256] = {
135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00,
161 };
162
163 static const unsigned char page06[256] = {
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
177 0xb8, 0xb9, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00,
178 };
179
180 static const unsigned char page22[256] = {
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x82, 0x83, 0x00, 0x00, 0x00, 0x91, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 };
192
193 static const unsigned char page25[256] = {
194 0x85, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00,
196 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00,
197 0x8f, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 };
217
218 static const unsigned char pagefe[256] = {
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
235
236 0xc1, 0xc2, 0xa2, 0xc3, 0xa5, 0xc4, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc7, 0xa8, 0xa9,
238 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xaa, 0x00, 0xca,
239 0x00, 0xab, 0x00, 0xcb, 0x00, 0xad, 0x00, 0xcc,
240 0x00, 0xae, 0x00, 0xcd, 0x00, 0xaf, 0x00, 0xce,
241 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2,
242 0x00, 0xbc, 0x00, 0xd3, 0x00, 0xbd, 0x00, 0xd4,
243 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xeb, 0x00, 0xd6,
244 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00,
245 0x00, 0xdf, 0xc5, 0xd9, 0xec, 0xee, 0xed, 0xda,
246 0xf7, 0xba, 0x00, 0xe1, 0x00, 0xf8, 0x00, 0xe2,
247 0x00, 0xfc, 0x00, 0xe3, 0x00, 0xfb, 0x00, 0xe4,
248 0x00, 0xef, 0x00, 0xe5, 0x00, 0xf2, 0x00, 0xe6,
249 0x00, 0xf3, 0x00, 0xe7, 0xf4, 0xe8, 0x00, 0xe9,
250 0xf5, 0xfd, 0xf6, 0xea, 0x00, 0xf9, 0xfa, 0x99,
251 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00, 0x00, 0x00,
252 };
253
254 static const unsigned char *const page_uni2charset[256] = {
255 page00, NULL, NULL, page03, NULL, NULL, page06, NULL,
256 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
257 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
258 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
259 NULL, NULL, page22, NULL, NULL, page25, NULL, NULL,
260 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
261 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
262 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
263 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
264 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
265 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
266 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
267 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
268 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
269 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
270 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
271 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
272 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
273 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
274 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
275 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
276 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
277 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
278 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
279 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
280 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
281 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
282 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
283 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
284 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
285 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
286 NULL, NULL, NULL, NULL, NULL, NULL, pagefe, NULL,
287 };
288
289 static const unsigned char charset2lower[256] = {
290 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
291 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
292 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
293 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
294 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
295 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
296 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
297 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
298 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
299 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
300 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
301 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
302 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
303 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
304 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
305 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
306
307 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
308 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
309 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
310 0x98, 0x99, 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00,
311 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
312 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
313 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
314 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
315 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
316 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
317 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
318 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
319 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
320 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
321 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
322 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00,
323 };
324
325 static const unsigned char charset2upper[256] = {
326 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
327 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
328 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
329 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
330 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
331 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
332 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
333 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
334 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
335 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
336 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
337 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
338 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
339 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
340 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
341 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
342
343 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
344 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
345 0x00, 0x91, 0x00, 0x93, 0x94, 0x95, 0x96, 0x97,
346 0x98, 0x99, 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00,
347 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
348 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
349 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
350 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
351 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
352 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
353 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
354 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
355 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
356 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
357 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
358 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00,
359 };
360
361 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
362 {
363 const unsigned char *uni2charset;
364 unsigned char cl = uni & 0x00ff;
365 unsigned char ch = (uni & 0xff00) >> 8;
366
367 if (boundlen <= 0)
368 return -ENAMETOOLONG;
369
370 uni2charset = page_uni2charset[ch];
371 if (uni2charset && uni2charset[cl])
372 out[0] = uni2charset[cl];
373 else
374 return -EINVAL;
375 return 1;
376 }
377
378 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
379 {
380 *uni = charset2uni[*rawstring];
381 if (*uni == 0x0000)
382 return -EINVAL;
383 return 1;
384 }
385
386 static struct nls_table table = {
387 .charset = "cp864",
388 .uni2char = uni2char,
389 .char2uni = char2uni,
390 .charset2lower = charset2lower,
391 .charset2upper = charset2upper,
392 };
393
394 static int __init init_nls_cp864(void)
395 {
396 return register_nls(&table);
397 }
398
399 static void __exit exit_nls_cp864(void)
400 {
401 unregister_nls(&table);
402 }
403
404 module_init(init_nls_cp864)
405 module_exit(exit_nls_cp864)
406
407 MODULE_LICENSE("Dual BSD/GPL");