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 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 0x05d0, 0x05d1, 0x05d2, 0x05d3,
0059 0x05d4, 0x05d5, 0x05d6, 0x05d7,
0060 0x05d8, 0x05d9, 0x05da, 0x05db,
0061 0x05dc, 0x05dd, 0x05de, 0x05df,
0062
0063 0x05e0, 0x05e1, 0x05e2, 0x05e3,
0064 0x05e4, 0x05e5, 0x05e6, 0x05e7,
0065 0x05e8, 0x05e9, 0x05ea, 0x00a2,
0066 0x00a3, 0x00a5, 0x20a7, 0x0192,
0067
0068 0x00e1, 0x00ed, 0x00f3, 0x00fa,
0069 0x00f1, 0x00d1, 0x00aa, 0x00ba,
0070 0x00bf, 0x2310, 0x00ac, 0x00bd,
0071 0x00bc, 0x00a1, 0x00ab, 0x00bb,
0072
0073 0x2591, 0x2592, 0x2593, 0x2502,
0074 0x2524, 0x2561, 0x2562, 0x2556,
0075 0x2555, 0x2563, 0x2551, 0x2557,
0076 0x255d, 0x255c, 0x255b, 0x2510,
0077
0078 0x2514, 0x2534, 0x252c, 0x251c,
0079 0x2500, 0x253c, 0x255e, 0x255f,
0080 0x255a, 0x2554, 0x2569, 0x2566,
0081 0x2560, 0x2550, 0x256c, 0x2567,
0082
0083 0x2568, 0x2564, 0x2565, 0x2559,
0084 0x2558, 0x2552, 0x2553, 0x256b,
0085 0x256a, 0x2518, 0x250c, 0x2588,
0086 0x2584, 0x258c, 0x2590, 0x2580,
0087
0088 0x03b1, 0x00df, 0x0393, 0x03c0,
0089 0x03a3, 0x03c3, 0x00b5, 0x03c4,
0090 0x03a6, 0x0398, 0x03a9, 0x03b4,
0091 0x221e, 0x03c6, 0x03b5, 0x2229,
0092
0093 0x2261, 0x00b1, 0x2265, 0x2264,
0094 0x2320, 0x2321, 0x00f7, 0x2248,
0095 0x00b0, 0x2219, 0x00b7, 0x221a,
0096 0x207f, 0x00b2, 0x25a0, 0x00a0,
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 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 0xff, 0xad, 0x9b, 0x9c, 0x00, 0x9d, 0x00, 0x00,
0122 0x00, 0x00, 0xa6, 0xae, 0xaa, 0x00, 0x00, 0x00,
0123 0xf8, 0xf1, 0xfd, 0x00, 0x00, 0xe6, 0x00, 0xfa,
0124 0x00, 0x00, 0xa7, 0xaf, 0xac, 0xab, 0x00, 0xa8,
0125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0127 0x00, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1,
0129 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0130 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00,
0131 0x00, 0xa4, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xf6,
0132 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00,
0133 };
0134
0135 static const unsigned char page01[256] = {
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0152
0153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0155 0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00,
0156 };
0157
0158 static const unsigned char page03[256] = {
0159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0175
0176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0178 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00,
0179 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0180 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0xe8, 0x00,
0181 0x00, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0182 0x00, 0xe0, 0x00, 0x00, 0xeb, 0xee, 0x00, 0x00,
0183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0184 0xe3, 0x00, 0x00, 0xe5, 0xe7, 0x00, 0xed, 0x00,
0185 };
0186
0187 static const unsigned char page05[256] = {
0188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0204
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 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0215 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0216 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0217 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0218 0x98, 0x99, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00,
0219 };
0220
0221 static const unsigned char page20[256] = {
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, 0x00, 0x00, 0x00,
0235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
0238
0239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e,
0244 };
0245
0246 static const unsigned char page22[256] = {
0247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0250 0x00, 0xf9, 0xfb, 0x00, 0x00, 0x00, 0xec, 0x00,
0251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0252 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0256 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0259 0x00, 0xf0, 0x00, 0x00, 0xf3, 0xf2, 0x00, 0x00,
0260 };
0261
0262 static const unsigned char page23[256] = {
0263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0265 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0267 0xf4, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0268 };
0269
0270 static const unsigned char page25[256] = {
0271 0xc4, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00,
0272 0x00, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00,
0273 0xbf, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
0274 0xd9, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00,
0275 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00,
0276 0x00, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00,
0277 0x00, 0x00, 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00,
0278 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00,
0279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0281 0xcd, 0xba, 0xd5, 0xd6, 0xc9, 0xb8, 0xb7, 0xbb,
0282 0xd4, 0xd3, 0xc8, 0xbe, 0xbd, 0xbc, 0xc6, 0xc7,
0283 0xcc, 0xb5, 0xb6, 0xb9, 0xd1, 0xd2, 0xcb, 0xcf,
0284 0xd0, 0xca, 0xd8, 0xd7, 0xce, 0x00, 0x00, 0x00,
0285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0287
0288 0xdf, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00,
0289 0xdb, 0x00, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00,
0290 0xde, 0xb0, 0xb1, 0xb2, 0x00, 0x00, 0x00, 0x00,
0291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0292 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0293 };
0294
0295 static const unsigned char *const page_uni2charset[256] = {
0296 page00, page01, NULL, page03, NULL, page05, NULL, NULL,
0297 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0298 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0299 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0300 page20, NULL, page22, page23, NULL, page25, NULL, NULL,
0301 };
0302
0303 static const unsigned char charset2lower[256] = {
0304 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0305 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0306 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0307 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0308 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0309 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0310 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0311 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0312 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0313 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0314 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0315 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0316 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0317 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0318 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0319 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0320
0321 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0322 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0323 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0324 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0325 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa4, 0xa6, 0xa7,
0326 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0327 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0328 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0329 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0330 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0331 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0332 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0333 0xe0, 0xe1, 0x00, 0xe3, 0xe5, 0xe5, 0xe6, 0xe7,
0334 0xed, 0x00, 0x00, 0xeb, 0xec, 0xed, 0xee, 0xef,
0335 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0336 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0337 };
0338
0339 static const unsigned char charset2upper[256] = {
0340 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0341 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0342 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0343 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0344 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0345 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0346 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0347 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0348 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0349 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0350 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0351 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0352 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0353 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0354 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0355 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0356
0357 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0358 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0359 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0360 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x00,
0361 0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0xa6, 0xa7,
0362 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0363 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0364 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0365 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0366 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0367 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0368 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0369 0x00, 0xe1, 0xe2, 0x00, 0xe4, 0xe4, 0x00, 0x00,
0370 0xe8, 0xe9, 0xea, 0x00, 0xec, 0xe8, 0x00, 0xef,
0371 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0372 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0373 };
0374
0375 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
0376 {
0377 const unsigned char *uni2charset;
0378 unsigned char cl = uni & 0x00ff;
0379 unsigned char ch = (uni & 0xff00) >> 8;
0380
0381 if (boundlen <= 0)
0382 return -ENAMETOOLONG;
0383
0384 uni2charset = page_uni2charset[ch];
0385 if (uni2charset && uni2charset[cl])
0386 out[0] = uni2charset[cl];
0387 else
0388 return -EINVAL;
0389 return 1;
0390 }
0391
0392 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
0393 {
0394 *uni = charset2uni[*rawstring];
0395 if (*uni == 0x0000)
0396 return -EINVAL;
0397 return 1;
0398 }
0399
0400 static struct nls_table table = {
0401 .charset = "cp862",
0402 .uni2char = uni2char,
0403 .char2uni = char2uni,
0404 .charset2lower = charset2lower,
0405 .charset2upper = charset2upper,
0406 };
0407
0408 static int __init init_nls_cp862(void)
0409 {
0410 return register_nls(&table);
0411 }
0412
0413 static void __exit exit_nls_cp862(void)
0414 {
0415 unregister_nls(&table);
0416 }
0417
0418 module_init(init_nls_cp862)
0419 module_exit(exit_nls_cp862)
0420
0421 MODULE_LICENSE("Dual BSD/GPL");