8dfaa10710fa7165c4b6261b0b0081a4f37357cf
[releases.git] / nls_cp874.c
1 /*
2  * linux/fs/nls/nls_cp874.c
3  *
4  * Charset cp874 translation tables.
5  * Generated automatically from the Unicode and charset
6  * tables from the Unicode Organization (www.unicode.org).
7  * The Unicode to charset table has only exact mappings.
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         /* 0x00*/
18         0x0000, 0x0001, 0x0002, 0x0003,
19         0x0004, 0x0005, 0x0006, 0x0007,
20         0x0008, 0x0009, 0x000a, 0x000b,
21         0x000c, 0x000d, 0x000e, 0x000f,
22         /* 0x10*/
23         0x0010, 0x0011, 0x0012, 0x0013,
24         0x0014, 0x0015, 0x0016, 0x0017,
25         0x0018, 0x0019, 0x001a, 0x001b,
26         0x001c, 0x001d, 0x001e, 0x001f,
27         /* 0x20*/
28         0x0020, 0x0021, 0x0022, 0x0023,
29         0x0024, 0x0025, 0x0026, 0x0027,
30         0x0028, 0x0029, 0x002a, 0x002b,
31         0x002c, 0x002d, 0x002e, 0x002f,
32         /* 0x30*/
33         0x0030, 0x0031, 0x0032, 0x0033,
34         0x0034, 0x0035, 0x0036, 0x0037,
35         0x0038, 0x0039, 0x003a, 0x003b,
36         0x003c, 0x003d, 0x003e, 0x003f,
37         /* 0x40*/
38         0x0040, 0x0041, 0x0042, 0x0043,
39         0x0044, 0x0045, 0x0046, 0x0047,
40         0x0048, 0x0049, 0x004a, 0x004b,
41         0x004c, 0x004d, 0x004e, 0x004f,
42         /* 0x50*/
43         0x0050, 0x0051, 0x0052, 0x0053,
44         0x0054, 0x0055, 0x0056, 0x0057,
45         0x0058, 0x0059, 0x005a, 0x005b,
46         0x005c, 0x005d, 0x005e, 0x005f,
47         /* 0x60*/
48         0x0060, 0x0061, 0x0062, 0x0063,
49         0x0064, 0x0065, 0x0066, 0x0067,
50         0x0068, 0x0069, 0x006a, 0x006b,
51         0x006c, 0x006d, 0x006e, 0x006f,
52         /* 0x70*/
53         0x0070, 0x0071, 0x0072, 0x0073,
54         0x0074, 0x0075, 0x0076, 0x0077,
55         0x0078, 0x0079, 0x007a, 0x007b,
56         0x007c, 0x007d, 0x007e, 0x007f,
57         /* 0x80*/
58         0x0000, 0x0000, 0x0000, 0x0000,
59         0x0000, 0x2026, 0x0000, 0x0000,
60         0x0000, 0x0000, 0x0000, 0x0000,
61         0x0000, 0x0000, 0x0000, 0x0000,
62         /* 0x90*/
63         0x0000, 0x2018, 0x2019, 0x201c,
64         0x201d, 0x2022, 0x2013, 0x2014,
65         0x0000, 0x0000, 0x0000, 0x0000,
66         0x0000, 0x0000, 0x0000, 0x0000,
67         /* 0xa0*/
68         0x00a0, 0x0e01, 0x0e02, 0x0e03,
69         0x0e04, 0x0e05, 0x0e06, 0x0e07,
70         0x0e08, 0x0e09, 0x0e0a, 0x0e0b,
71         0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
72         /* 0xb0*/
73         0x0e10, 0x0e11, 0x0e12, 0x0e13,
74         0x0e14, 0x0e15, 0x0e16, 0x0e17,
75         0x0e18, 0x0e19, 0x0e1a, 0x0e1b,
76         0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
77         /* 0xc0*/
78         0x0e20, 0x0e21, 0x0e22, 0x0e23,
79         0x0e24, 0x0e25, 0x0e26, 0x0e27,
80         0x0e28, 0x0e29, 0x0e2a, 0x0e2b,
81         0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
82         /* 0xd0*/
83         0x0e30, 0x0e31, 0x0e32, 0x0e33,
84         0x0e34, 0x0e35, 0x0e36, 0x0e37,
85         0x0e38, 0x0e39, 0x0e3a, 0x0000,
86         0x0000, 0x0000, 0x0000, 0x0e3f,
87         /* 0xe0*/
88         0x0e40, 0x0e41, 0x0e42, 0x0e43,
89         0x0e44, 0x0e45, 0x0e46, 0x0e47,
90         0x0e48, 0x0e49, 0x0e4a, 0x0e4b,
91         0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
92         /* 0xf0*/
93         0x0e50, 0x0e51, 0x0e52, 0x0e53,
94         0x0e54, 0x0e55, 0x0e56, 0x0e57,
95         0x0e58, 0x0e59, 0x0e5a, 0x0e5b,
96         0x0000, 0x0000, 0x0000, 0x0000,
97 };
98
99 static const unsigned char page00[256] = {
100         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
101         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
102         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
103         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
104         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
105         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
106         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
107         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
108         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
109         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
110         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
111         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
112         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
113         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
114         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
115         0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
116
117         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
118         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
119         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
120         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
121         0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
122 };
123
124 static const unsigned char page0e[256] = {
125         0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */
126         0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */
127         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */
128         0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */
129         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
130         0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
131         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
132         0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */
133         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
134         0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
135         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */
136         0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
137 };
138
139 static const unsigned char page20[256] = {
140         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
141         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
142         0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
143         0x91, 0x92, 0x00, 0x00, 0x93, 0x94, 0x00, 0x00, /* 0x18-0x1f */
144         0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
145 };
146
147 static const unsigned char *const page_uni2charset[256] = {
148         page00, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
149         NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   page0e, NULL,   
150         NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
151         NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
152         page20, NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   
153 };
154
155 static const unsigned char charset2lower[256] = {
156         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
157         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
158         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
159         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
160         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
161         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
162         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
163         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
164         0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x40-0x47 */
165         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x48-0x4f */
166         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x50-0x57 */
167         0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
168         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
169         0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
170         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
171         0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
172
173         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, /* 0x80-0x87 */
174         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
175         0x00, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */
176         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
177         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
178         0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
179         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
180         0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */
181         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
182         0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
183         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
184         0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
185         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
186         0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
187         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
188         0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
189 };
190
191 static const unsigned char charset2upper[256] = {
192         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
193         0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
194         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
195         0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
196         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
197         0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
198         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
199         0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
200         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
201         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
202         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
203         0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
204         0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x60-0x67 */
205         0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x68-0x6f */
206         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x70-0x77 */
207         0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
208
209         0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x00, /* 0x80-0x87 */
210         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
211         0x00, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */
212         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
213         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
214         0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
215         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
216         0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */
217         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
218         0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
219         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
220         0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
221         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
222         0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
223         0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
224         0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
225 };
226
227 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
228 {
229         const unsigned char *uni2charset;
230         unsigned char cl = uni & 0x00ff;
231         unsigned char ch = (uni & 0xff00) >> 8;
232
233         if (boundlen <= 0)
234                 return -ENAMETOOLONG;
235
236         uni2charset = page_uni2charset[ch];
237         if (uni2charset && uni2charset[cl])
238                 out[0] = uni2charset[cl];
239         else
240                 return -EINVAL;
241         return 1;
242 }
243
244 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
245 {
246         *uni = charset2uni[*rawstring];
247         if (*uni == 0x0000)
248                 return -EINVAL;
249         return 1;
250 }
251
252 static struct nls_table table = {
253         .charset        = "cp874",
254         .alias          = "tis-620",
255         .uni2char       = uni2char,
256         .char2uni       = char2uni,
257         .charset2lower  = charset2lower,
258         .charset2upper  = charset2upper,
259 };
260
261 static int __init init_nls_cp874(void)
262 {
263         return register_nls(&table);
264 }
265
266 static void __exit exit_nls_cp874(void)
267 {
268         unregister_nls(&table);
269 }
270
271 module_init(init_nls_cp874)
272 module_exit(exit_nls_cp874)
273
274 MODULE_LICENSE("Dual BSD/GPL");
275 MODULE_ALIAS_NLS(tis-620);