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, 0x066a, 0x0026, 0x0027,
0030 0x0028, 0x0029, 0x002a, 0x002b,
0031 0x002c, 0x002d, 0x002e, 0x002f,
0032
0033 0x0030, 0x0031, 0x0032, 0x0033,
0034 0x0034, 0x0035, 0x0036, 0x0037,
0035 0x0038, 0x0039, 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 0x00b0, 0x00b7, 0x2219, 0x221a,
0059 0x2592, 0x2500, 0x2502, 0x253c,
0060 0x2524, 0x252c, 0x251c, 0x2534,
0061 0x2510, 0x250c, 0x2514, 0x2518,
0062
0063 0x03b2, 0x221e, 0x03c6, 0x00b1,
0064 0x00bd, 0x00bc, 0x2248, 0x00ab,
0065 0x00bb, 0xfef7, 0xfef8, 0x0000,
0066 0x0000, 0xfefb, 0xfefc, 0x0000,
0067
0068 0x00a0, 0x00ad, 0xfe82, 0x00a3,
0069 0x00a4, 0xfe84, 0x0000, 0x0000,
0070 0xfe8e, 0xfe8f, 0xfe95, 0xfe99,
0071 0x060c, 0xfe9d, 0xfea1, 0xfea5,
0072
0073 0x0660, 0x0661, 0x0662, 0x0663,
0074 0x0664, 0x0665, 0x0666, 0x0667,
0075 0x0668, 0x0669, 0xfed1, 0x061b,
0076 0xfeb1, 0xfeb5, 0xfeb9, 0x061f,
0077
0078 0x00a2, 0xfe80, 0xfe81, 0xfe83,
0079 0xfe85, 0xfeca, 0xfe8b, 0xfe8d,
0080 0xfe91, 0xfe93, 0xfe97, 0xfe9b,
0081 0xfe9f, 0xfea3, 0xfea7, 0xfea9,
0082
0083 0xfeab, 0xfead, 0xfeaf, 0xfeb3,
0084 0xfeb7, 0xfebb, 0xfebf, 0xfec1,
0085 0xfec5, 0xfecb, 0xfecf, 0x00a6,
0086 0x00ac, 0x00f7, 0x00d7, 0xfec9,
0087
0088 0x0640, 0xfed3, 0xfed7, 0xfedb,
0089 0xfedf, 0xfee3, 0xfee7, 0xfeeb,
0090 0xfeed, 0xfeef, 0xfef3, 0xfebd,
0091 0xfecc, 0xfece, 0xfecd, 0xfee1,
0092
0093 0xfe7d, 0x0651, 0xfee5, 0xfee9,
0094 0xfeec, 0xfef0, 0xfef2, 0xfed0,
0095 0xfed5, 0xfef5, 0xfef6, 0xfedd,
0096 0xfed9, 0xfef1, 0x25a0, 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, 0x00, 0x26, 0x27,
0105 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0106 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0107 0x38, 0x39, 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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0121 0xa0, 0x00, 0xc0, 0xa3, 0xa4, 0x00, 0xdb, 0x00,
0122 0x00, 0x00, 0x00, 0x97, 0xdc, 0xa1, 0x00, 0x00,
0123 0x80, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81,
0124 0x00, 0x00, 0x00, 0x98, 0x95, 0x94, 0x00, 0x00,
0125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde,
0128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdd,
0132 };
0133
0134 static const unsigned char page03[256] = {
0135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0151
0152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0158 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00,
0159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x00,
0161 };
0162
0163 static const unsigned char page06[256] = {
0164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0165 0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00,
0166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0167 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf,
0168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0172 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0174 0x00, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0176 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0177 0xb8, 0xb9, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00,
0178 };
0179
0180 static const unsigned char page22[256] = {
0181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0184 0x00, 0x82, 0x83, 0x00, 0x00, 0x00, 0x91, 0x00,
0185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0190 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0191 };
0192
0193 static const unsigned char page25[256] = {
0194 0x85, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00,
0195 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, 0x00, 0x00,
0196 0x8c, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00,
0197 0x8f, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00,
0198 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00,
0199 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00,
0200 0x00, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00,
0201 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00,
0202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0210
0211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0213 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
0214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0215 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0216 };
0217
0218 static const unsigned char pagefe[256] = {
0219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0234 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
0235
0236 0xc1, 0xc2, 0xa2, 0xc3, 0xa5, 0xc4, 0x00, 0x00,
0237 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc7, 0xa8, 0xa9,
0238 0x00, 0xc8, 0x00, 0xc9, 0x00, 0xaa, 0x00, 0xca,
0239 0x00, 0xab, 0x00, 0xcb, 0x00, 0xad, 0x00, 0xcc,
0240 0x00, 0xae, 0x00, 0xcd, 0x00, 0xaf, 0x00, 0xce,
0241 0x00, 0xcf, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xd2,
0242 0x00, 0xbc, 0x00, 0xd3, 0x00, 0xbd, 0x00, 0xd4,
0243 0x00, 0xbe, 0x00, 0xd5, 0x00, 0xeb, 0x00, 0xd6,
0244 0x00, 0xd7, 0x00, 0x00, 0x00, 0xd8, 0x00, 0x00,
0245 0x00, 0xdf, 0xc5, 0xd9, 0xec, 0xee, 0xed, 0xda,
0246 0xf7, 0xba, 0x00, 0xe1, 0x00, 0xf8, 0x00, 0xe2,
0247 0x00, 0xfc, 0x00, 0xe3, 0x00, 0xfb, 0x00, 0xe4,
0248 0x00, 0xef, 0x00, 0xe5, 0x00, 0xf2, 0x00, 0xe6,
0249 0x00, 0xf3, 0x00, 0xe7, 0xf4, 0xe8, 0x00, 0xe9,
0250 0xf5, 0xfd, 0xf6, 0xea, 0x00, 0xf9, 0xfa, 0x99,
0251 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00, 0x00, 0x00,
0252 };
0253
0254 static const unsigned char *const page_uni2charset[256] = {
0255 page00, NULL, NULL, page03, NULL, NULL, page06, NULL,
0256 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0257 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0258 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0259 NULL, NULL, page22, NULL, NULL, page25, NULL, NULL,
0260 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0261 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0262 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0263 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0264 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0265 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0266 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0267 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0268 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0269 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0270 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0271 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0272 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0273 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0274 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0275 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0276 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0277 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0278 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0279 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0280 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0281 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0282 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0283 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0284 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0285 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0286 NULL, NULL, NULL, NULL, NULL, NULL, pagefe, NULL,
0287 };
0288
0289 static const unsigned char charset2lower[256] = {
0290 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0291 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0292 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0293 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0294 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0295 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0296 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0297 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0298 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0299 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0300 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0301 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0302 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0303 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0304 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0305 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0306
0307 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0308 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0309 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0310 0x98, 0x99, 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00,
0311 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
0312 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0313 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0314 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0315 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0316 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0317 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0318 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0319 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0320 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0321 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0322 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00,
0323 };
0324
0325 static const unsigned char charset2upper[256] = {
0326 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0327 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0328 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0329 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0330 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0331 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0332 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0333 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0334 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0335 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0336 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0337 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0338 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0339 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0340 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0341 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0342
0343 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0344 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0345 0x00, 0x91, 0x00, 0x93, 0x94, 0x95, 0x96, 0x97,
0346 0x98, 0x99, 0x9a, 0x00, 0x00, 0x9d, 0x9e, 0x00,
0347 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0x00, 0x00,
0348 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0349 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0350 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0351 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0352 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0353 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0354 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0355 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0356 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0357 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0358 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00,
0359 };
0360
0361 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
0362 {
0363 const unsigned char *uni2charset;
0364 unsigned char cl = uni & 0x00ff;
0365 unsigned char ch = (uni & 0xff00) >> 8;
0366
0367 if (boundlen <= 0)
0368 return -ENAMETOOLONG;
0369
0370 uni2charset = page_uni2charset[ch];
0371 if (uni2charset && uni2charset[cl])
0372 out[0] = uni2charset[cl];
0373 else
0374 return -EINVAL;
0375 return 1;
0376 }
0377
0378 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
0379 {
0380 *uni = charset2uni[*rawstring];
0381 if (*uni == 0x0000)
0382 return -EINVAL;
0383 return 1;
0384 }
0385
0386 static struct nls_table table = {
0387 .charset = "cp864",
0388 .uni2char = uni2char,
0389 .char2uni = char2uni,
0390 .charset2lower = charset2lower,
0391 .charset2upper = charset2upper,
0392 };
0393
0394 static int __init init_nls_cp864(void)
0395 {
0396 return register_nls(&table);
0397 }
0398
0399 static void __exit exit_nls_cp864(void)
0400 {
0401 unregister_nls(&table);
0402 }
0403
0404 module_init(init_nls_cp864)
0405 module_exit(exit_nls_cp864)
0406
0407 MODULE_LICENSE("Dual BSD/GPL");