0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/module.h>
0009 #include <linux/kernel.h>
0010 #include <linux/string.h>
0011 #include <linux/nls.h>
0012 #include <linux/errno.h>
0013
0014 static const wchar_t charset2uni[256] = {
0015
0016 0x0000, 0x0001, 0x0002, 0x0003,
0017 0x0004, 0x0005, 0x0006, 0x0007,
0018 0x0008, 0x0009, 0x000a, 0x000b,
0019 0x000c, 0x000d, 0x000e, 0x000f,
0020
0021 0x0010, 0x0011, 0x0012, 0x0013,
0022 0x0014, 0x0015, 0x0016, 0x0017,
0023 0x0018, 0x0019, 0x001a, 0x001b,
0024 0x001c, 0x001d, 0x001e, 0x001f,
0025
0026 0x0020, 0x0021, 0x0022, 0x0023,
0027 0x0024, 0x0025, 0x0026, 0x0027,
0028 0x0028, 0x0029, 0x002a, 0x002b,
0029 0x002c, 0x002d, 0x002e, 0x002f,
0030
0031 0x0030, 0x0031, 0x0032, 0x0033,
0032 0x0034, 0x0035, 0x0036, 0x0037,
0033 0x0038, 0x0039, 0x003a, 0x003b,
0034 0x003c, 0x003d, 0x003e, 0x003f,
0035
0036 0x0040, 0x0041, 0x0042, 0x0043,
0037 0x0044, 0x0045, 0x0046, 0x0047,
0038 0x0048, 0x0049, 0x004a, 0x004b,
0039 0x004c, 0x004d, 0x004e, 0x004f,
0040
0041 0x0050, 0x0051, 0x0052, 0x0053,
0042 0x0054, 0x0055, 0x0056, 0x0057,
0043 0x0058, 0x0059, 0x005a, 0x005b,
0044 0x005c, 0x005d, 0x005e, 0x005f,
0045
0046 0x0060, 0x0061, 0x0062, 0x0063,
0047 0x0064, 0x0065, 0x0066, 0x0067,
0048 0x0068, 0x0069, 0x006a, 0x006b,
0049 0x006c, 0x006d, 0x006e, 0x006f,
0050
0051 0x0070, 0x0071, 0x0072, 0x0073,
0052 0x0074, 0x0075, 0x0076, 0x0077,
0053 0x0078, 0x0079, 0x007a, 0x007b,
0054 0x007c, 0x007d, 0x007e, 0x007f,
0055
0056 0x20ac, 0x0000, 0x201a, 0x0192,
0057 0x201e, 0x2026, 0x2020, 0x2021,
0058 0x02c6, 0x2030, 0x0000, 0x2039,
0059 0x0000, 0x0000, 0x0000, 0x0000,
0060
0061 0x0000, 0x2018, 0x2019, 0x201c,
0062 0x201d, 0x2022, 0x2013, 0x2014,
0063 0x02dc, 0x2122, 0x0000, 0x203a,
0064 0x0000, 0x0000, 0x0000, 0x0000,
0065
0066 0x00a0, 0x00a1, 0x00a2, 0x00a3,
0067 0x20aa, 0x00a5, 0x00a6, 0x00a7,
0068 0x00a8, 0x00a9, 0x00d7, 0x00ab,
0069 0x00ac, 0x00ad, 0x00ae, 0x203e,
0070
0071 0x00b0, 0x00b1, 0x00b2, 0x00b3,
0072 0x00b4, 0x00b5, 0x00b6, 0x00b7,
0073 0x00b8, 0x00b9, 0x00f7, 0x00bb,
0074 0x00bc, 0x00bd, 0x00be, 0x00bf,
0075
0076 0x05b0, 0x05b1, 0x05b2, 0x05b3,
0077 0x05b4, 0x05b5, 0x05b6, 0x05b7,
0078 0x05b8, 0x05b9, 0x0000, 0x05bb,
0079 0x05bc, 0x05bd, 0x05be, 0x05bf,
0080
0081 0x05c0, 0x05c1, 0x05c2, 0x05c3,
0082 0x05f0, 0x05f1, 0x05f2, 0x05f3,
0083 0x05f4, 0x0000, 0x0000, 0x0000,
0084 0x0000, 0x0000, 0x0000, 0x2017,
0085
0086 0x05d0, 0x05d1, 0x05d2, 0x05d3,
0087 0x05d4, 0x05d5, 0x05d6, 0x05d7,
0088 0x05d8, 0x05d9, 0x05da, 0x05db,
0089 0x05dc, 0x05dd, 0x05de, 0x05df,
0090
0091 0x05e0, 0x05e1, 0x05e2, 0x05e3,
0092 0x05e4, 0x05e5, 0x05e6, 0x05e7,
0093 0x05e8, 0x05e9, 0x05ea, 0x0000,
0094 0x0000, 0x0000, 0x0000, 0x0000,
0095 };
0096
0097 static const unsigned char page00[256] = {
0098 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0099 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0100 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0101 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0102 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0103 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0104 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0105 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0106 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0107 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0108 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0109 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0110 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0111 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0112 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0113 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0114
0115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0119 0xa0, 0x00, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7,
0120 0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00,
0121 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0122 0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00,
0123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa,
0126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba,
0130 };
0131
0132 static const unsigned char page01[256] = {
0133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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
0150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0152 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00,
0153 };
0154
0155 static const unsigned char page02[256] = {
0156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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
0173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00,
0182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0183 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0184 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 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 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0212 0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0213 0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00,
0214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0215 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0216 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0217 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0218 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00,
0219 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00,
0220 };
0221
0222 static const unsigned char page20[256] = {
0223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe,
0225 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00,
0226 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00,
0227 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00,
0228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0229 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0230 0x00, 0x8b, 0x9b, 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, 0x00,
0238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0239
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, 0x00,
0244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0245 0x00, 0x00, 0xa4, 0x00, 0x80, 0x00, 0x00, 0x00,
0246 };
0247
0248 static const unsigned char page21[256] = {
0249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00,
0252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0253 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00,
0254 };
0255
0256 static const unsigned char *const page_uni2charset[256] = {
0257 page00, page01, page02, NULL, NULL, page05, NULL, NULL,
0258 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0259 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0260 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
0261 page20, page21, NULL, NULL, NULL, NULL, NULL, NULL,
0262 };
0263
0264 static const unsigned char charset2lower[256] = {
0265 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0266 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0267 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0268 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0269 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0270 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0271 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0272 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0273 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0274 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0275 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0276 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0277 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0278 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0279 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0280 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0281
0282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0286 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0287 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0288 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0289 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00,
0290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf,
0294 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0295 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0296 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0297 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00,
0298 };
0299
0300 static const unsigned char charset2upper[256] = {
0301 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0302 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0303 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0304 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0305 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0306 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0307 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0308 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0309 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0310 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0311 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0312 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0313 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0314 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0315 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0316 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0317
0318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0322 0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0323 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0324 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0x00, 0xb6, 0xb7,
0325 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00,
0326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf,
0330 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0331 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0332 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0333 0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00,
0334 };
0335
0336 static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
0337 {
0338 const unsigned char *uni2charset;
0339 unsigned char cl = uni & 0x00ff;
0340 unsigned char ch = (uni & 0xff00) >> 8;
0341
0342 if (boundlen <= 0)
0343 return -ENAMETOOLONG;
0344
0345 uni2charset = page_uni2charset[ch];
0346 if (uni2charset && uni2charset[cl])
0347 out[0] = uni2charset[cl];
0348 else
0349 return -EINVAL;
0350 return 1;
0351 }
0352
0353 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
0354 {
0355 *uni = charset2uni[*rawstring];
0356 if (*uni == 0x0000)
0357 return -EINVAL;
0358 return 1;
0359 }
0360
0361 static struct nls_table table = {
0362 .charset = "cp1255",
0363 .alias = "iso8859-8",
0364 .uni2char = uni2char,
0365 .char2uni = char2uni,
0366 .charset2lower = charset2lower,
0367 .charset2upper = charset2upper,
0368 };
0369
0370 static int __init init_nls_cp1255(void)
0371 {
0372 return register_nls(&table);
0373 }
0374
0375 static void __exit exit_nls_cp1255(void)
0376 {
0377 unregister_nls(&table);
0378 }
0379
0380 module_init(init_nls_cp1255)
0381 module_exit(exit_nls_cp1255)
0382
0383 MODULE_LICENSE("Dual BSD/GPL");
0384 MODULE_ALIAS_NLS(iso8859-8);