0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/kernel.h>
0012 #include <linux/string.h>
0013 #include <linux/nls.h>
0014 #include <linux/errno.h>
0015
0016 static const wchar_t charset2uni[256] = {
0017
0018 0x0000, 0x0001, 0x0002, 0x0003,
0019 0x0004, 0x0005, 0x0006, 0x0007,
0020 0x0008, 0x0009, 0x000a, 0x000b,
0021 0x000c, 0x000d, 0x000e, 0x000f,
0022
0023 0x0010, 0x0011, 0x0012, 0x0013,
0024 0x0014, 0x0015, 0x0016, 0x0017,
0025 0x0018, 0x0019, 0x001a, 0x001b,
0026 0x001c, 0x001d, 0x001e, 0x001f,
0027
0028 0x0020, 0x0021, 0x0022, 0x0023,
0029 0x0024, 0x0025, 0x0026, 0x0027,
0030 0x0028, 0x0029, 0x002a, 0x002b,
0031 0x002c, 0x002d, 0x002e, 0x002f,
0032
0033 0x0660, 0x0661, 0x0662, 0x0663,
0034 0x0664, 0x0665, 0x0666, 0x0667,
0035 0x0668, 0x0669, 0x003a, 0x003b,
0036 0x003c, 0x003d, 0x003e, 0x003f,
0037
0038 0x0040, 0x0041, 0x0042, 0x0043,
0039 0x0044, 0x0045, 0x0046, 0x0047,
0040 0x0048, 0x0049, 0x004a, 0x004b,
0041 0x004c, 0x004d, 0x004e, 0x004f,
0042
0043 0x0050, 0x0051, 0x0052, 0x0053,
0044 0x0054, 0x0055, 0x0056, 0x0057,
0045 0x0058, 0x0059, 0x005a, 0x005b,
0046 0x005c, 0x005d, 0x005e, 0x005f,
0047
0048 0x0060, 0x0061, 0x0062, 0x0063,
0049 0x0064, 0x0065, 0x0066, 0x0067,
0050 0x0068, 0x0069, 0x006a, 0x006b,
0051 0x006c, 0x006d, 0x006e, 0x006f,
0052
0053 0x0070, 0x0071, 0x0072, 0x0073,
0054 0x0074, 0x0075, 0x0076, 0x0077,
0055 0x0078, 0x0079, 0x007a, 0x007b,
0056 0x007c, 0x007d, 0x007e, 0x007f,
0057
0058 0x0080, 0x0081, 0x0082, 0x0083,
0059 0x0084, 0x0085, 0x0086, 0x0087,
0060 0x0088, 0x0089, 0x008a, 0x008b,
0061 0x008c, 0x008d, 0x008e, 0x008f,
0062
0063 0x0090, 0x0091, 0x0092, 0x0093,
0064 0x0094, 0x0095, 0x0096, 0x0097,
0065 0x0098, 0x0099, 0x009a, 0x009b,
0066 0x009c, 0x009d, 0x009e, 0x009f,
0067
0068 0x00a0, 0x0000, 0x0000, 0x0000,
0069 0x00a4, 0x0000, 0x0000, 0x0000,
0070 0x0000, 0x0000, 0x0000, 0x0000,
0071 0x060c, 0x00ad, 0x0000, 0x0000,
0072
0073 0x0000, 0x0000, 0x0000, 0x0000,
0074 0x0000, 0x0000, 0x0000, 0x0000,
0075 0x0000, 0x0000, 0x0000, 0x061b,
0076 0x0000, 0x0000, 0x0000, 0x061f,
0077
0078 0x0000, 0x0621, 0x0622, 0x0623,
0079 0x0624, 0x0625, 0x0626, 0x0627,
0080 0x0628, 0x0629, 0x062a, 0x062b,
0081 0x062c, 0x062d, 0x062e, 0x062f,
0082
0083 0x0630, 0x0631, 0x0632, 0x0633,
0084 0x0634, 0x0635, 0x0636, 0x0637,
0085 0x0638, 0x0639, 0x063a, 0x0000,
0086 0x0000, 0x0000, 0x0000, 0x0000,
0087
0088 0x0640, 0x0641, 0x0642, 0x0643,
0089 0x0644, 0x0645, 0x0646, 0x0647,
0090 0x0648, 0x0649, 0x064a, 0x064b,
0091 0x064c, 0x064d, 0x064e, 0x064f,
0092
0093 0x0650, 0x0651, 0x0652, 0x0000,
0094 0x0000, 0x0000, 0x0000, 0x0000,
0095 0x0000, 0x0000, 0x0000, 0x0000,
0096 0x0000, 0x0000, 0x0000, 0x0000,
0097 };
0098
0099 static const unsigned char page00[256] = {
0100 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0101 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0104 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0105 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0107 0x00, 0x00, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0108 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0109 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0110 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0111 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0112 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0113 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0114 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0115 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0116
0117 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0118 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0119 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0120 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0121 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
0122 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00,
0123 };
0124
0125 static const unsigned char page06[256] = {
0126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0127 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
0128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0129 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
0130 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0131 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0132 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0133 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
0134 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0135 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0136 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
0137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0138 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0139 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0140 };
0141
0142 static const unsigned char *const page_uni2charset[256] = {
0143 page00, NULL, NULL, NULL, NULL, NULL, page06, NULL,
0144 };
0145
0146 static const unsigned char charset2lower[256] = {
0147 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0148 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0149 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0150 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0151 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0152 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0153 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0154 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0155 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0156 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0157 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0158 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0159 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0160 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0161 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0162 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0163
0164 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0165 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0166 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0167 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0168 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
0169 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0x00, 0x00,
0170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0171 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
0172 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0173 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0174 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0175 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
0176 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0177 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0178 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
0179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0180 };
0181
0182 static const unsigned char charset2upper[256] = {
0183 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0184 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0185 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0186 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0187 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0188 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0189 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0190 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0191 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0192 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0193 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0194 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0195 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0196 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0197 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0198 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0199
0200 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0201 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0202 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0203 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0204 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00,
0205 0x00, 0x00, 0x00, 0x00, 0xac, 0xad, 0x00, 0x00,
0206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0207 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
0208 0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0209 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0210 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0211 0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00,
0212 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0213 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0214 0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00,
0215 };
0216
0217 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
0218 {
0219 const unsigned char *uni2charset;
0220 unsigned char cl = uni & 0x00ff;
0221 unsigned char ch = (uni & 0xff00) >> 8;
0222
0223 if (boundlen <= 0)
0224 return -ENAMETOOLONG;
0225
0226 uni2charset = page_uni2charset[ch];
0227 if (uni2charset && uni2charset[cl])
0228 out[0] = uni2charset[cl];
0229 else
0230 return -EINVAL;
0231 return 1;
0232 }
0233
0234 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
0235 {
0236 *uni = charset2uni[*rawstring];
0237 if (*uni == 0x0000)
0238 return -EINVAL;
0239 return 1;
0240 }
0241
0242 static struct nls_table table = {
0243 .charset = "iso8859-6",
0244 .uni2char = uni2char,
0245 .char2uni = char2uni,
0246 .charset2lower = charset2lower,
0247 .charset2upper = charset2upper,
0248 };
0249
0250 static int __init init_nls_iso8859_6(void)
0251 {
0252 return register_nls(&table);
0253 }
0254
0255 static void __exit exit_nls_iso8859_6(void)
0256 {
0257 unregister_nls(&table);
0258 }
0259
0260 module_init(init_nls_iso8859_6)
0261 module_exit(exit_nls_iso8859_6)
0262
0263 MODULE_LICENSE("Dual BSD/GPL");