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
16static 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, 0x0025, 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 0x00c7, 0x00fc, 0x00e9, 0x00e2,
59 0x00e4, 0x00e0, 0x00e5, 0x00e7,
60 0x00ea, 0x00eb, 0x00e8, 0x00d0,
61 0x00f0, 0x00de, 0x00c4, 0x00c5,
62
63 0x00c9, 0x00e6, 0x00c6, 0x00f4,
64 0x00f6, 0x00fe, 0x00fb, 0x00dd,
65 0x00fd, 0x00d6, 0x00dc, 0x00f8,
66 0x00a3, 0x00d8, 0x20a7, 0x0192,
67
68 0x00e1, 0x00ed, 0x00f3, 0x00fa,
69 0x00c1, 0x00cd, 0x00d3, 0x00da,
70 0x00bf, 0x2310, 0x00ac, 0x00bd,
71 0x00bc, 0x00a1, 0x00ab, 0x00bb,
72
73 0x2591, 0x2592, 0x2593, 0x2502,
74 0x2524, 0x2561, 0x2562, 0x2556,
75 0x2555, 0x2563, 0x2551, 0x2557,
76 0x255d, 0x255c, 0x255b, 0x2510,
77
78 0x2514, 0x2534, 0x252c, 0x251c,
79 0x2500, 0x253c, 0x255e, 0x255f,
80 0x255a, 0x2554, 0x2569, 0x2566,
81 0x2560, 0x2550, 0x256c, 0x2567,
82
83 0x2568, 0x2564, 0x2565, 0x2559,
84 0x2558, 0x2552, 0x2553, 0x256b,
85 0x256a, 0x2518, 0x250c, 0x2588,
86 0x2584, 0x258c, 0x2590, 0x2580,
87
88 0x03b1, 0x00df, 0x0393, 0x03c0,
89 0x03a3, 0x03c3, 0x00b5, 0x03c4,
90 0x03a6, 0x0398, 0x03a9, 0x03b4,
91 0x221e, 0x03c6, 0x03b5, 0x2229,
92
93 0x2261, 0x00b1, 0x2265, 0x2264,
94 0x2320, 0x2321, 0x00f7, 0x2248,
95 0x00b0, 0x2219, 0x00b7, 0x221a,
96 0x207f, 0x00b2, 0x25a0, 0x00a0,
97};
98
99static 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, 0x25, 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 0xff, 0xad, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0xae, 0xaa, 0x00, 0x00, 0x00,
123 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa,
124 0x00, 0x00, 0x00, 0xaf, 0xac, 0xab, 0x00, 0xa8,
125 0x00, 0xa4, 0x00, 0x00, 0x8e, 0x8f, 0x92, 0x80,
126 0x00, 0x90, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00,
127 0x8b, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x99, 0x00,
128 0x9d, 0x00, 0xa7, 0x00, 0x9a, 0x97, 0x8d, 0xe1,
129 0x85, 0xa0, 0x83, 0x00, 0x84, 0x86, 0x91, 0x87,
130 0x8a, 0x82, 0x88, 0x89, 0x00, 0xa1, 0x00, 0x00,
131 0x8c, 0x00, 0x00, 0xa2, 0x93, 0x00, 0x94, 0xf6,
132 0x9b, 0x00, 0xa3, 0x96, 0x81, 0x98, 0x95, 0x00,
133};
134
135static const unsigned char page01[256] = {
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00,
156};
157
158static const unsigned char page03[256] = {
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00,
179 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00,
181 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00,
185};
186
187static const unsigned char page20[256] = {
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
204
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, 0x9e,
210};
211
212static const unsigned char page22[256] = {
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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 0xf7, 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, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00,
226};
227
228static const unsigned char page23[256] = {
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234};
235
236static const unsigned char page25[256] = {
237 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00,
239 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
240 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb,
248 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7,
249 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf,
250 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253
254 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00,
255 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00,
256 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00,
257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
259};
260
261static const unsigned char *const page_uni2charset[256] = {
262 page00, page01, NULL, page03, 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 page20, NULL, page22, page23, NULL, page25, NULL, NULL,
267};
268
269static const unsigned char charset2lower[256] = {
270 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
271 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
272 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
273 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
274 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
275 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
276 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
277 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
278 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
279 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
280 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
281 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
282 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
283 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
284 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
285 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
286
287 0x87, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
288 0x88, 0x89, 0x8a, 0x8c, 0x8c, 0x95, 0x84, 0x86,
289 0x82, 0x91, 0x91, 0x93, 0x94, 0x95, 0x96, 0x98,
290 0x98, 0x94, 0x81, 0x9b, 0x9c, 0x9b, 0x9e, 0x9f,
291 0xa0, 0xa1, 0xa2, 0xa3, 0xa0, 0xa1, 0xa2, 0xa3,
292 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
293 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
294 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
295 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
296 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
297 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
298 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
299 0xe0, 0xe1, 0x00, 0xe3, 0xe5, 0xe5, 0xe6, 0xe7,
300 0xed, 0x00, 0x00, 0xeb, 0xec, 0xed, 0xee, 0xef,
301 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
302 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
303};
304
305static const unsigned char charset2upper[256] = {
306 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
307 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
308 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
309 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
310 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
311 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
312 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
313 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
314 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
315 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
316 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
317 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
318 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
319 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
320 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
321 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
322
323 0x80, 0x9a, 0x90, 0x00, 0x8e, 0x00, 0x8f, 0x80,
324 0x00, 0x00, 0x00, 0x8b, 0x8b, 0x8d, 0x8e, 0x8f,
325 0x90, 0x92, 0x92, 0x00, 0x99, 0x8d, 0x00, 0x97,
326 0x97, 0x99, 0x9a, 0x9d, 0x9c, 0x9d, 0x9e, 0x00,
327 0xa4, 0xa5, 0xa6, 0xa7, 0xa4, 0xa5, 0xa6, 0xa7,
328 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
329 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
330 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
331 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
332 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
333 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
334 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
335 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0xe4, 0x00, 0x00,
336 0xe8, 0xe9, 0xea, 0x00, 0xec, 0xe8, 0x00, 0xef,
337 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
338 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
339};
340
341static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
342{
343 const unsigned char *uni2charset;
344 unsigned char cl = uni & 0x00ff;
345 unsigned char ch = (uni & 0xff00) >> 8;
346
347 if (boundlen <= 0)
348 return -ENAMETOOLONG;
349
350 uni2charset = page_uni2charset[ch];
351 if (uni2charset && uni2charset[cl])
352 out[0] = uni2charset[cl];
353 else
354 return -EINVAL;
355 return 1;
356}
357
358static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
359{
360 *uni = charset2uni[*rawstring];
361 if (*uni == 0x0000)
362 return -EINVAL;
363 return 1;
364}
365
366static struct nls_table table = {
367 .charset = "cp861",
368 .uni2char = uni2char,
369 .char2uni = char2uni,
370 .charset2lower = charset2lower,
371 .charset2upper = charset2upper,
372 .owner = THIS_MODULE,
373};
374
375static int __init init_nls_cp861(void)
376{
377 return register_nls(&table);
378}
379
380static void __exit exit_nls_cp861(void)
381{
382 unregister_nls(&table);
383}
384
385module_init(init_nls_cp861)
386module_exit(exit_nls_cp861)
387
388MODULE_LICENSE("Dual BSD/GPL");
389