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 0x0402, 0x0403, 0x201a, 0x0453,
59 0x201e, 0x2026, 0x2020, 0x2021,
60 0x20ac, 0x2030, 0x0409, 0x2039,
61 0x040a, 0x040c, 0x040b, 0x040f,
63 0x0452, 0x2018, 0x2019, 0x201c,
64 0x201d, 0x2022, 0x2013, 0x2014,
65 0x0000, 0x2122, 0x0459, 0x203a,
66 0x045a, 0x045c, 0x045b, 0x045f,
68 0x00a0, 0x040e, 0x045e, 0x0408,
69 0x00a4, 0x0490, 0x00a6, 0x00a7,
70 0x0401, 0x00a9, 0x0404, 0x00ab,
71 0x00ac, 0x00ad, 0x00ae, 0x0407,
73 0x00b0, 0x00b1, 0x0406, 0x0456,
74 0x0491, 0x00b5, 0x00b6, 0x00b7,
75 0x0451, 0x2116, 0x0454, 0x00bb,
76 0x0458, 0x0405, 0x0455, 0x0457,
78 0x0410, 0x0411, 0x0412, 0x0413,
79 0x0414, 0x0415, 0x0416, 0x0417,
80 0x0418, 0x0419, 0x041a, 0x041b,
81 0x041c, 0x041d, 0x041e, 0x041f,
83 0x0420, 0x0421, 0x0422, 0x0423,
84 0x0424, 0x0425, 0x0426, 0x0427,
85 0x0428, 0x0429, 0x042a, 0x042b,
86 0x042c, 0x042d, 0x042e, 0x042f,
88 0x0430, 0x0431, 0x0432, 0x0433,
89 0x0434, 0x0435, 0x0436, 0x0437,
90 0x0438, 0x0439, 0x043a, 0x043b,
91 0x043c, 0x043d, 0x043e, 0x043f,
93 0x0440, 0x0441, 0x0442, 0x0443,
94 0x0444, 0x0445, 0x0446, 0x0447,
95 0x0448, 0x0449, 0x044a, 0x044b,
96 0x044c, 0x044d, 0x044e, 0x044f,
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 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7,
122 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00,
123 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7,
124 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
132 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00,
135 static const unsigned char page04[256] = {
136 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf,
137 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f,
138 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
139 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
140 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
141 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
142 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
143 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
144 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
145 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
146 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf,
147 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f,
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, 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00,
158 static const unsigned char page20[256] = {
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00,
162 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00,
163 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00,
169 static const unsigned char page21[256] = {
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, 0xb9, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00,
177 static const unsigned char *
const page_uni2charset[256] = {
186 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
187 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
188 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
189 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
190 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
191 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
192 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
193 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
194 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
195 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
196 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
197 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
198 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
199 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
200 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
201 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
202 0x90, 0x83, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
203 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f,
204 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
205 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
206 0xa0, 0xa2, 0xa2, 0xbc, 0xa4, 0xb4, 0xa6, 0xa7,
207 0xb8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf,
208 0xb0, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
209 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbe, 0xbe, 0xbf,
210 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
211 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
212 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
213 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
214 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
215 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
216 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
217 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
221 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
222 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
223 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
224 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
225 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
226 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
227 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
228 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
229 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
230 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
231 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
232 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
233 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
234 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
235 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
236 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
237 0x80, 0x81, 0x82, 0x81, 0x84, 0x85, 0x86, 0x87,
238 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
239 0x80, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
240 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f,
241 0xa0, 0xa1, 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
242 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
243 0xb0, 0xb1, 0xb2, 0xb2, 0xa5, 0xb5, 0xb6, 0xb7,
244 0xa8, 0xb9, 0xaa, 0xbb, 0xa3, 0xbd, 0xbd, 0xaf,
245 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
246 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
247 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
248 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
249 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
250 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
251 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
252 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
255 static int uni2char(
wchar_t uni,
unsigned char *
out,
int boundlen)
257 const unsigned char *uni2charset;
258 unsigned char cl = uni & 0x00ff;
259 unsigned char ch = (uni & 0xff00) >> 8;
264 uni2charset = page_uni2charset[ch];
265 if (uni2charset && uni2charset[cl])
266 out[0] = uni2charset[
cl];
272 static int char2uni(
const unsigned char *rawstring,
int boundlen,
wchar_t *uni)
274 *uni = charset2uni[*rawstring];
289 static int __init init_nls_cp1251(
void)
294 static void __exit exit_nls_cp1251(
void)