10 #include <linux/module.h>
11 #include <linux/kernel.h>
12 #include <linux/string.h>
14 #include <linux/errno.h>
16 static const wchar_t charset2uni[256] = {
18 0x0000, 0x0001, 0x0002, 0x0003,
19 0x0004, 0x0005, 0x0006, 0x0007,
20 0x0008, 0x0009, 0x000a, 0x000b,
21 0x000c, 0x000d, 0x000e, 0x000f,
23 0x0010, 0x0011, 0x0012, 0x0013,
24 0x0014, 0x0015, 0x0016, 0x0017,
25 0x0018, 0x0019, 0x001a, 0x001b,
26 0x001c, 0x001d, 0x001e, 0x001f,
28 0x0020, 0x0021, 0x0022, 0x0023,
29 0x0024, 0x0025, 0x0026, 0x0027,
30 0x0028, 0x0029, 0x002a, 0x002b,
31 0x002c, 0x002d, 0x002e, 0x002f,
33 0x0030, 0x0031, 0x0032, 0x0033,
34 0x0034, 0x0035, 0x0036, 0x0037,
35 0x0038, 0x0039, 0x003a, 0x003b,
36 0x003c, 0x003d, 0x003e, 0x003f,
38 0x0040, 0x0041, 0x0042, 0x0043,
39 0x0044, 0x0045, 0x0046, 0x0047,
40 0x0048, 0x0049, 0x004a, 0x004b,
41 0x004c, 0x004d, 0x004e, 0x004f,
43 0x0050, 0x0051, 0x0052, 0x0053,
44 0x0054, 0x0055, 0x0056, 0x0057,
45 0x0058, 0x0059, 0x005a, 0x005b,
46 0x005c, 0x005d, 0x005e, 0x005f,
48 0x0060, 0x0061, 0x0062, 0x0063,
49 0x0064, 0x0065, 0x0066, 0x0067,
50 0x0068, 0x0069, 0x006a, 0x006b,
51 0x006c, 0x006d, 0x006e, 0x006f,
53 0x0070, 0x0071, 0x0072, 0x0073,
54 0x0074, 0x0075, 0x0076, 0x0077,
55 0x0078, 0x0079, 0x007a, 0x007b,
56 0x007c, 0x007d, 0x007e, 0x007f,
58 0x00c7, 0x00fc, 0x00e9, 0x00e2,
59 0x00e3, 0x00e0, 0x00c1, 0x00e7,
60 0x00ea, 0x00ca, 0x00e8, 0x00cd,
61 0x00d4, 0x00ec, 0x00c3, 0x00c2,
63 0x00c9, 0x00c0, 0x00c8, 0x00f4,
64 0x00f5, 0x00f2, 0x00da, 0x00f9,
65 0x00cc, 0x00d5, 0x00dc, 0x00a2,
66 0x00a3, 0x00d9, 0x20a7, 0x00d3,
68 0x00e1, 0x00ed, 0x00f3, 0x00fa,
69 0x00f1, 0x00d1, 0x00aa, 0x00ba,
70 0x00bf, 0x00d2, 0x00ac, 0x00bd,
71 0x00bc, 0x00a1, 0x00ab, 0x00bb,
73 0x2591, 0x2592, 0x2593, 0x2502,
74 0x2524, 0x2561, 0x2562, 0x2556,
75 0x2555, 0x2563, 0x2551, 0x2557,
76 0x255d, 0x255c, 0x255b, 0x2510,
78 0x2514, 0x2534, 0x252c, 0x251c,
79 0x2500, 0x253c, 0x255e, 0x255f,
80 0x255a, 0x2554, 0x2569, 0x2566,
81 0x2560, 0x2550, 0x256c, 0x2567,
83 0x2568, 0x2564, 0x2565, 0x2559,
84 0x2558, 0x2552, 0x2553, 0x256b,
85 0x256a, 0x2518, 0x250c, 0x2588,
86 0x2584, 0x258c, 0x2590, 0x2580,
88 0x03b1, 0x00df, 0x0393, 0x03c0,
89 0x03a3, 0x03c3, 0x00b5, 0x03c4,
90 0x03a6, 0x0398, 0x03a9, 0x03b4,
91 0x221e, 0x03c6, 0x03b5, 0x2229,
93 0x2261, 0x00b1, 0x2265, 0x2264,
94 0x2320, 0x2321, 0x00f7, 0x2248,
95 0x00b0, 0x2219, 0x00b7, 0x221a,
96 0x207f, 0x00b2, 0x25a0, 0x00a0,
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, 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,
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, 0x9b, 0x9c, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00,
123 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa,
124 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8,
125 0x91, 0x86, 0x8f, 0x8e, 0x00, 0x00, 0x00, 0x80,
126 0x92, 0x90, 0x89, 0x00, 0x98, 0x8b, 0x00, 0x00,
127 0x00, 0xa5, 0xa9, 0x9f, 0x8c, 0x99, 0x00, 0x00,
128 0x00, 0x9d, 0x96, 0x00, 0x9a, 0x00, 0x00, 0xe1,
129 0x85, 0xa0, 0x83, 0x84, 0x00, 0x00, 0x00, 0x87,
130 0x8a, 0x82, 0x88, 0x00, 0x8d, 0xa1, 0x00, 0x00,
131 0x00, 0xa4, 0x95, 0xa2, 0x93, 0x94, 0x00, 0xf6,
132 0x00, 0x97, 0xa3, 0x00, 0x81, 0x00, 0x00, 0x00,
135 static const unsigned char page03[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,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00,
156 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00,
158 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00,
164 static const unsigned char page20[256] = {
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e,
189 static const unsigned char page22[256] = {
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, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0xef, 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 0xf7, 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, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00,
205 static const unsigned char page23[256] = {
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 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 static const unsigned char page25[256] = {
214 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00,
216 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
217 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
218 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
219 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
220 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb,
225 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7,
226 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf,
227 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00,
232 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00,
233 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 static const unsigned char *
const page_uni2charset[256] = {
247 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
248 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
249 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
250 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
251 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
252 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
253 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
254 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
255 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
256 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
257 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
258 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
259 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
260 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
261 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
262 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
264 0x87, 0x81, 0x82, 0x83, 0x84, 0x85, 0xa0, 0x87,
265 0x88, 0x88, 0x8a, 0xa1, 0x93, 0x8d, 0x84, 0x83,
266 0x82, 0x85, 0x8a, 0x93, 0x94, 0x95, 0xa3, 0x97,
267 0x8d, 0x94, 0x81, 0x9b, 0x9c, 0x97, 0x9e, 0xa2,
268 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa6, 0xa7,
269 0xa8, 0x95, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
270 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
271 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
272 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
273 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
274 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
275 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
276 0xe0, 0xe1, 0x00, 0xe3, 0xe5, 0xe5, 0xe6, 0xe7,
277 0xed, 0x00, 0x00, 0xeb, 0xec, 0xed, 0xee, 0xef,
278 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
279 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
283 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
284 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
285 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
286 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
287 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
288 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
289 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
290 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
291 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
292 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
293 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
294 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
295 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
296 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
297 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
298 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
300 0x80, 0x9a, 0x90, 0x8f, 0x8e, 0x91, 0x86, 0x80,
301 0x89, 0x89, 0x92, 0x8b, 0x8c, 0x98, 0x8e, 0x8f,
302 0x90, 0x91, 0x92, 0x8c, 0x99, 0xa9, 0x96, 0x9d,
303 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
304 0x86, 0x8b, 0x9f, 0x96, 0xa5, 0xa5, 0xa6, 0xa7,
305 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
306 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
307 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
308 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
309 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
310 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
311 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
312 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0xe4, 0x00, 0x00,
313 0xe8, 0xe9, 0xea, 0x00, 0xec, 0xe8, 0x00, 0xef,
314 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
315 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
318 static int uni2char(
wchar_t uni,
unsigned char *
out,
int boundlen)
320 const unsigned char *uni2charset;
321 unsigned char cl = uni & 0x00ff;
322 unsigned char ch = (uni & 0xff00) >> 8;
327 uni2charset = page_uni2charset[ch];
328 if (uni2charset && uni2charset[cl])
329 out[0] = uni2charset[
cl];
335 static int char2uni(
const unsigned char *rawstring,
int boundlen,
wchar_t *uni)
337 *uni = charset2uni[*rawstring];
352 static int __init init_nls_cp860(
void)
357 static void __exit exit_nls_cp860(
void)