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 0x0660, 0x0661, 0x0662, 0x0663,
34 0x0664, 0x0665, 0x0666, 0x0667,
35 0x0668, 0x0669, 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 0x0080, 0x0081, 0x0082, 0x0083,
59 0x0084, 0x0085, 0x0086, 0x0087,
60 0x0088, 0x0089, 0x008a, 0x008b,
61 0x008c, 0x008d, 0x008e, 0x008f,
62
63 0x0090, 0x0091, 0x0092, 0x0093,
64 0x0094, 0x0095, 0x0096, 0x0097,
65 0x0098, 0x0099, 0x009a, 0x009b,
66 0x009c, 0x009d, 0x009e, 0x009f,
67
68 0x00a0, 0x0000, 0x0000, 0x0000,
69 0x00a4, 0x0000, 0x0000, 0x0000,
70 0x0000, 0x0000, 0x0000, 0x0000,
71 0x060c, 0x00ad, 0x0000, 0x0000,
72
73 0x0000, 0x0000, 0x0000, 0x0000,
74 0x0000, 0x0000, 0x0000, 0x0000,
75 0x0000, 0x0000, 0x0000, 0x061b,
76 0x0000, 0x0000, 0x0000, 0x061f,
77
78 0x0000, 0x0621, 0x0622, 0x0623,
79 0x0624, 0x0625, 0x0626, 0x0627,
80 0x0628, 0x0629, 0x062a, 0x062b,
81 0x062c, 0x062d, 0x062e, 0x062f,
82
83 0x0630, 0x0631, 0x0632, 0x0633,
84 0x0634, 0x0635, 0x0636, 0x0637,
85 0x0638, 0x0639, 0x063a, 0x0000,
86 0x0000, 0x0000, 0x0000, 0x0000,
87
88 0x0640, 0x0641, 0x0642, 0x0643,
89 0x0644, 0x0645, 0x0646, 0x0647,
90 0x0648, 0x0649, 0x064a, 0x064b,
91 0x064c, 0x064d, 0x064e, 0x064f,
92
93 0x0650, 0x0651, 0x0652, 0x0000,
94 0x0000, 0x0000, 0x0000, 0x0000,
95 0x0000, 0x0000, 0x0000, 0x0000,
96 0x0000, 0x0000, 0x0000, 0x0000,
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 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 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
118 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
119 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
120 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
121 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00,
123};
124
125static const unsigned char page06[256] = {
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
130 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
131 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
132 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
133 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
134 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
135 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
136 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
138 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
139 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140};
141
142static const unsigned char *const page_uni2charset[256] = {
143 page00, NULL, NULL, NULL, NULL, NULL, page06, NULL,
144};
145
146static const unsigned char charset2lower[256] = {
147 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
148 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
149 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
150 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
151 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
152 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
153 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
154 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
155 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
156 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
157 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
158 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
159 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
160 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
161 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
162 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
163
164 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
165 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
166 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
167 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
168 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
172 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
173 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
174 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
175 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
177 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
178 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180};
181
182static const unsigned char charset2upper[256] = {
183 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
184 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
185 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
186 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
187 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
188 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
189 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
190 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
191 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
192 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
193 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
194 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
195 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
196 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
197 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
198 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
199
200 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
201 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
202 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
203 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
204 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
208 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
209 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
210 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
211 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
213 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
214 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
215};
216
217static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
218{
219 const unsigned char *uni2charset;
220 unsigned char cl = uni & 0x00ff;
221 unsigned char ch = (uni & 0xff00) >> 8;
222
223 if (boundlen <= 0)
224 return -ENAMETOOLONG;
225
226 uni2charset = page_uni2charset[ch];
227 if (uni2charset && uni2charset[cl])
228 out[0] = uni2charset[cl];
229 else
230 return -EINVAL;
231 return 1;
232}
233
234static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
235{
236 *uni = charset2uni[*rawstring];
237 if (*uni == 0x0000)
238 return -EINVAL;
239 return 1;
240}
241
242static struct nls_table table = {
243 .charset = "iso8859-6",
244 .uni2char = uni2char,
245 .char2uni = char2uni,
246 .charset2lower = charset2lower,
247 .charset2upper = charset2upper,
248};
249
250static int __init init_nls_iso8859_6(void)
251{
252 return register_nls(&table);
253}
254
255static void __exit exit_nls_iso8859_6(void)
256{
257 unregister_nls(&table);
258}
259
260module_init(init_nls_iso8859_6)
261module_exit(exit_nls_iso8859_6)
262
263MODULE_LICENSE("Dual BSD/GPL");
264