1 /* 1 /* 2 * linux/fs/nls/nls_cp1251.c 2 * linux/fs/nls/nls_cp1251.c 3 * 3 * 4 * Charset cp1251 translation tables. 4 * Charset cp1251 translation tables. 5 * Generated automatically from the Unicode an 5 * Generated automatically from the Unicode and charset 6 * tables from the Unicode Organization (www.u 6 * tables from the Unicode Organization (www.unicode.org). 7 * The Unicode to charset table has only exact 7 * The Unicode to charset table has only exact mappings. 8 */ 8 */ 9 9 10 #include <linux/module.h> 10 #include <linux/module.h> 11 #include <linux/kernel.h> 11 #include <linux/kernel.h> 12 #include <linux/string.h> 12 #include <linux/string.h> 13 #include <linux/nls.h> 13 #include <linux/nls.h> 14 #include <linux/errno.h> 14 #include <linux/errno.h> 15 15 16 static const wchar_t charset2uni[256] = { 16 static const wchar_t charset2uni[256] = { 17 /* 0x00*/ 17 /* 0x00*/ 18 0x0000, 0x0001, 0x0002, 0x0003, 18 0x0000, 0x0001, 0x0002, 0x0003, 19 0x0004, 0x0005, 0x0006, 0x0007, 19 0x0004, 0x0005, 0x0006, 0x0007, 20 0x0008, 0x0009, 0x000a, 0x000b, 20 0x0008, 0x0009, 0x000a, 0x000b, 21 0x000c, 0x000d, 0x000e, 0x000f, 21 0x000c, 0x000d, 0x000e, 0x000f, 22 /* 0x10*/ 22 /* 0x10*/ 23 0x0010, 0x0011, 0x0012, 0x0013, 23 0x0010, 0x0011, 0x0012, 0x0013, 24 0x0014, 0x0015, 0x0016, 0x0017, 24 0x0014, 0x0015, 0x0016, 0x0017, 25 0x0018, 0x0019, 0x001a, 0x001b, 25 0x0018, 0x0019, 0x001a, 0x001b, 26 0x001c, 0x001d, 0x001e, 0x001f, 26 0x001c, 0x001d, 0x001e, 0x001f, 27 /* 0x20*/ 27 /* 0x20*/ 28 0x0020, 0x0021, 0x0022, 0x0023, 28 0x0020, 0x0021, 0x0022, 0x0023, 29 0x0024, 0x0025, 0x0026, 0x0027, 29 0x0024, 0x0025, 0x0026, 0x0027, 30 0x0028, 0x0029, 0x002a, 0x002b, 30 0x0028, 0x0029, 0x002a, 0x002b, 31 0x002c, 0x002d, 0x002e, 0x002f, 31 0x002c, 0x002d, 0x002e, 0x002f, 32 /* 0x30*/ 32 /* 0x30*/ 33 0x0030, 0x0031, 0x0032, 0x0033, 33 0x0030, 0x0031, 0x0032, 0x0033, 34 0x0034, 0x0035, 0x0036, 0x0037, 34 0x0034, 0x0035, 0x0036, 0x0037, 35 0x0038, 0x0039, 0x003a, 0x003b, 35 0x0038, 0x0039, 0x003a, 0x003b, 36 0x003c, 0x003d, 0x003e, 0x003f, 36 0x003c, 0x003d, 0x003e, 0x003f, 37 /* 0x40*/ 37 /* 0x40*/ 38 0x0040, 0x0041, 0x0042, 0x0043, 38 0x0040, 0x0041, 0x0042, 0x0043, 39 0x0044, 0x0045, 0x0046, 0x0047, 39 0x0044, 0x0045, 0x0046, 0x0047, 40 0x0048, 0x0049, 0x004a, 0x004b, 40 0x0048, 0x0049, 0x004a, 0x004b, 41 0x004c, 0x004d, 0x004e, 0x004f, 41 0x004c, 0x004d, 0x004e, 0x004f, 42 /* 0x50*/ 42 /* 0x50*/ 43 0x0050, 0x0051, 0x0052, 0x0053, 43 0x0050, 0x0051, 0x0052, 0x0053, 44 0x0054, 0x0055, 0x0056, 0x0057, 44 0x0054, 0x0055, 0x0056, 0x0057, 45 0x0058, 0x0059, 0x005a, 0x005b, 45 0x0058, 0x0059, 0x005a, 0x005b, 46 0x005c, 0x005d, 0x005e, 0x005f, 46 0x005c, 0x005d, 0x005e, 0x005f, 47 /* 0x60*/ 47 /* 0x60*/ 48 0x0060, 0x0061, 0x0062, 0x0063, 48 0x0060, 0x0061, 0x0062, 0x0063, 49 0x0064, 0x0065, 0x0066, 0x0067, 49 0x0064, 0x0065, 0x0066, 0x0067, 50 0x0068, 0x0069, 0x006a, 0x006b, 50 0x0068, 0x0069, 0x006a, 0x006b, 51 0x006c, 0x006d, 0x006e, 0x006f, 51 0x006c, 0x006d, 0x006e, 0x006f, 52 /* 0x70*/ 52 /* 0x70*/ 53 0x0070, 0x0071, 0x0072, 0x0073, 53 0x0070, 0x0071, 0x0072, 0x0073, 54 0x0074, 0x0075, 0x0076, 0x0077, 54 0x0074, 0x0075, 0x0076, 0x0077, 55 0x0078, 0x0079, 0x007a, 0x007b, 55 0x0078, 0x0079, 0x007a, 0x007b, 56 0x007c, 0x007d, 0x007e, 0x007f, 56 0x007c, 0x007d, 0x007e, 0x007f, 57 /* 0x80*/ 57 /* 0x80*/ 58 0x0402, 0x0403, 0x201a, 0x0453, 58 0x0402, 0x0403, 0x201a, 0x0453, 59 0x201e, 0x2026, 0x2020, 0x2021, 59 0x201e, 0x2026, 0x2020, 0x2021, 60 0x20ac, 0x2030, 0x0409, 0x2039, 60 0x20ac, 0x2030, 0x0409, 0x2039, 61 0x040a, 0x040c, 0x040b, 0x040f, 61 0x040a, 0x040c, 0x040b, 0x040f, 62 /* 0x90*/ 62 /* 0x90*/ 63 0x0452, 0x2018, 0x2019, 0x201c, 63 0x0452, 0x2018, 0x2019, 0x201c, 64 0x201d, 0x2022, 0x2013, 0x2014, 64 0x201d, 0x2022, 0x2013, 0x2014, 65 0x0000, 0x2122, 0x0459, 0x203a, 65 0x0000, 0x2122, 0x0459, 0x203a, 66 0x045a, 0x045c, 0x045b, 0x045f, 66 0x045a, 0x045c, 0x045b, 0x045f, 67 /* 0xa0*/ 67 /* 0xa0*/ 68 0x00a0, 0x040e, 0x045e, 0x0408, 68 0x00a0, 0x040e, 0x045e, 0x0408, 69 0x00a4, 0x0490, 0x00a6, 0x00a7, 69 0x00a4, 0x0490, 0x00a6, 0x00a7, 70 0x0401, 0x00a9, 0x0404, 0x00ab, 70 0x0401, 0x00a9, 0x0404, 0x00ab, 71 0x00ac, 0x00ad, 0x00ae, 0x0407, 71 0x00ac, 0x00ad, 0x00ae, 0x0407, 72 /* 0xb0*/ 72 /* 0xb0*/ 73 0x00b0, 0x00b1, 0x0406, 0x0456, 73 0x00b0, 0x00b1, 0x0406, 0x0456, 74 0x0491, 0x00b5, 0x00b6, 0x00b7, 74 0x0491, 0x00b5, 0x00b6, 0x00b7, 75 0x0451, 0x2116, 0x0454, 0x00bb, 75 0x0451, 0x2116, 0x0454, 0x00bb, 76 0x0458, 0x0405, 0x0455, 0x0457, 76 0x0458, 0x0405, 0x0455, 0x0457, 77 /* 0xc0*/ 77 /* 0xc0*/ 78 0x0410, 0x0411, 0x0412, 0x0413, 78 0x0410, 0x0411, 0x0412, 0x0413, 79 0x0414, 0x0415, 0x0416, 0x0417, 79 0x0414, 0x0415, 0x0416, 0x0417, 80 0x0418, 0x0419, 0x041a, 0x041b, 80 0x0418, 0x0419, 0x041a, 0x041b, 81 0x041c, 0x041d, 0x041e, 0x041f, 81 0x041c, 0x041d, 0x041e, 0x041f, 82 /* 0xd0*/ 82 /* 0xd0*/ 83 0x0420, 0x0421, 0x0422, 0x0423, 83 0x0420, 0x0421, 0x0422, 0x0423, 84 0x0424, 0x0425, 0x0426, 0x0427, 84 0x0424, 0x0425, 0x0426, 0x0427, 85 0x0428, 0x0429, 0x042a, 0x042b, 85 0x0428, 0x0429, 0x042a, 0x042b, 86 0x042c, 0x042d, 0x042e, 0x042f, 86 0x042c, 0x042d, 0x042e, 0x042f, 87 /* 0xe0*/ 87 /* 0xe0*/ 88 0x0430, 0x0431, 0x0432, 0x0433, 88 0x0430, 0x0431, 0x0432, 0x0433, 89 0x0434, 0x0435, 0x0436, 0x0437, 89 0x0434, 0x0435, 0x0436, 0x0437, 90 0x0438, 0x0439, 0x043a, 0x043b, 90 0x0438, 0x0439, 0x043a, 0x043b, 91 0x043c, 0x043d, 0x043e, 0x043f, 91 0x043c, 0x043d, 0x043e, 0x043f, 92 /* 0xf0*/ 92 /* 0xf0*/ 93 0x0440, 0x0441, 0x0442, 0x0443, 93 0x0440, 0x0441, 0x0442, 0x0443, 94 0x0444, 0x0445, 0x0446, 0x0447, 94 0x0444, 0x0445, 0x0446, 0x0447, 95 0x0448, 0x0449, 0x044a, 0x044b, 95 0x0448, 0x0449, 0x044a, 0x044b, 96 0x044c, 0x044d, 0x044e, 0x044f, 96 0x044c, 0x044d, 0x044e, 0x044f, 97 }; 97 }; 98 98 99 static const unsigned char page00[256] = { 99 static const unsigned char page00[256] = { 100 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x 100 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ 101 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x 101 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ 102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x 102 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ 103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x 103 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ 104 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x 104 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ 105 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x 105 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ 106 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x 106 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ 107 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x 107 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ 108 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x 108 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ 109 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x 109 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ 110 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x 110 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ 111 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x 111 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ 112 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x 112 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */ 113 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x 113 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */ 114 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x 114 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */ 115 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x 115 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ 116 116 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */ 121 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x 121 0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */ 122 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x 122 0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */ 123 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0x 123 0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 124 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 124 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */ 125 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 125 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */ 126 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 126 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */ 127 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 127 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */ 128 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 128 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */ 129 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 129 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */ 130 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 130 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */ 131 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 131 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */ 132 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x 132 0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */ 133 }; 133 }; 134 134 135 static const unsigned char page04[256] = { 135 static const unsigned char page04[256] = { 136 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0x 136 0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */ 137 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0x 137 0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */ 138 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x 138 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */ 139 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x 139 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */ 140 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0x 140 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */ 141 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x 141 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */ 142 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x 142 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */ 143 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x 143 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */ 144 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0x 144 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */ 145 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x 145 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */ 146 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0x 146 0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */ 147 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0x 147 0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */ 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */ 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */ 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */ 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */ 152 152 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */ 154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */ 155 0x00, 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x 155 0x00, 0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */ 156 }; 156 }; 157 157 158 static const unsigned char page20[256] = { 158 static const unsigned char page20[256] = { 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 161 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x 161 0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */ 162 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x 162 0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */ 163 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x 163 0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */ 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */ 165 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 165 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */ 166 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x 166 0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */ 167 }; 167 }; 168 168 169 static const unsigned char page21[256] = { 169 static const unsigned char page21[256] = { 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */ 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */ 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */ 173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x 173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */ 174 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x 174 0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */ 175 }; 175 }; 176 176 177 static const unsigned char *const page_uni2cha 177 static const unsigned char *const page_uni2charset[256] = { 178 page00, NULL, NULL, NULL, page04 178 page00, NULL, NULL, NULL, page04, NULL, NULL, NULL, 179 NULL, NULL, NULL, NULL, NULL, 179 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 180 NULL, NULL, NULL, NULL, NULL, 180 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 181 NULL, NULL, NULL, NULL, NULL, 181 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 182 page20, page21, NULL, NULL, NULL, 182 page20, page21, NULL, NULL, NULL, NULL, NULL, NULL, 183 }; 183 }; 184 184 185 static const unsigned char charset2lower[256] 185 static const unsigned char charset2lower[256] = { 186 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x 186 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ 187 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x 187 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ 188 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x 188 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ 189 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x 189 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ 190 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x 190 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ 191 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x 191 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ 192 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x 192 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ 193 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x 193 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ 194 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x 194 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ 195 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x 195 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ 196 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x 196 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ 197 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x 197 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ 198 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x 198 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x60-0x67 */ 199 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x 199 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x68-0x6f */ 200 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x 200 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x70-0x77 */ 201 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x 201 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ 202 0x90, 0x83, 0x82, 0x83, 0x84, 0x85, 0x 202 0x90, 0x83, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x80-0x87 */ 203 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x 203 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x88-0x8f */ 204 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x 204 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */ 205 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x 205 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x98-0x9f */ 206 0xa0, 0xa2, 0xa2, 0xbc, 0xa4, 0xb4, 0x 206 0xa0, 0xa2, 0xa2, 0xbc, 0xa4, 0xb4, 0xa6, 0xa7, /* 0xa0-0xa7 */ 207 0xb8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0x 207 0xb8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf, /* 0xa8-0xaf */ 208 0xb0, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0x 208 0xb0, 0xb1, 0xb3, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 209 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbe, 0x 209 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbe, 0xbe, 0xbf, /* 0xb8-0xbf */ 210 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x 210 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xc0-0xc7 */ 211 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x 211 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xc8-0xcf */ 212 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0x 212 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */ 213 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x 213 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xd8-0xdf */ 214 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x 214 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */ 215 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x 215 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */ 216 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0x 216 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */ 217 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x 217 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0xf8-0xff */ 218 }; 218 }; 219 219 220 static const unsigned char charset2upper[256] 220 static const unsigned char charset2upper[256] = { 221 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x 221 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */ 222 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x 222 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */ 223 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x 223 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */ 224 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x 224 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */ 225 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x 225 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */ 226 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x 226 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */ 227 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x 227 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */ 228 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x 228 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */ 229 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x 229 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */ 230 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x 230 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */ 231 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x 231 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */ 232 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x 232 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */ 233 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x 233 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x60-0x67 */ 234 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x 234 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x68-0x6f */ 235 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x 235 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x70-0x77 */ 236 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x 236 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */ 237 0x80, 0x81, 0x82, 0x81, 0x84, 0x85, 0x 237 0x80, 0x81, 0x82, 0x81, 0x84, 0x85, 0x86, 0x87, /* 0x80-0x87 */ 238 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x 238 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */ 239 0x80, 0x91, 0x92, 0x93, 0x94, 0x95, 0x 239 0x80, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x90-0x97 */ 240 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x 240 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x98-0x9f */ 241 0xa0, 0xa1, 0xa1, 0xa3, 0xa4, 0xa5, 0x 241 0xa0, 0xa1, 0xa1, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */ 242 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0x 242 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */ 243 0xb0, 0xb1, 0xb2, 0xb2, 0xa5, 0xb5, 0x 243 0xb0, 0xb1, 0xb2, 0xb2, 0xa5, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */ 244 0xa8, 0xb9, 0xaa, 0xbb, 0xa3, 0xbd, 0x 244 0xa8, 0xb9, 0xaa, 0xbb, 0xa3, 0xbd, 0xbd, 0xaf, /* 0xb8-0xbf */ 245 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x 245 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */ 246 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x 246 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */ 247 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0x 247 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */ 248 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x 248 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */ 249 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x 249 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xe0-0xe7 */ 250 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0x 250 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xe8-0xef */ 251 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0x 251 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xf0-0xf7 */ 252 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x 252 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xf8-0xff */ 253 }; 253 }; 254 254 255 static int uni2char(wchar_t uni, unsigned char 255 static int uni2char(wchar_t uni, unsigned char *out, int boundlen) 256 { 256 { 257 const unsigned char *uni2charset; 257 const unsigned char *uni2charset; 258 unsigned char cl = uni & 0x00ff; 258 unsigned char cl = uni & 0x00ff; 259 unsigned char ch = (uni & 0xff00) >> 8 259 unsigned char ch = (uni & 0xff00) >> 8; 260 260 261 if (boundlen <= 0) 261 if (boundlen <= 0) 262 return -ENAMETOOLONG; 262 return -ENAMETOOLONG; 263 263 264 uni2charset = page_uni2charset[ch]; 264 uni2charset = page_uni2charset[ch]; 265 if (uni2charset && uni2charset[cl]) 265 if (uni2charset && uni2charset[cl]) 266 out[0] = uni2charset[cl]; 266 out[0] = uni2charset[cl]; 267 else 267 else 268 return -EINVAL; 268 return -EINVAL; 269 return 1; 269 return 1; 270 } 270 } 271 271 272 static int char2uni(const unsigned char *rawst 272 static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni) 273 { 273 { 274 *uni = charset2uni[*rawstring]; 274 *uni = charset2uni[*rawstring]; 275 if (*uni == 0x0000) 275 if (*uni == 0x0000) 276 return -EINVAL; 276 return -EINVAL; 277 return 1; 277 return 1; 278 } 278 } 279 279 280 static struct nls_table table = { 280 static struct nls_table table = { 281 .charset = "cp1251", 281 .charset = "cp1251", 282 .uni2char = uni2char, 282 .uni2char = uni2char, 283 .char2uni = char2uni, 283 .char2uni = char2uni, 284 .charset2lower = charset2lower, 284 .charset2lower = charset2lower, 285 .charset2upper = charset2upper, 285 .charset2upper = charset2upper, 286 }; 286 }; 287 287 288 static int __init init_nls_cp1251(void) 288 static int __init init_nls_cp1251(void) 289 { 289 { 290 return register_nls(&table); 290 return register_nls(&table); 291 } 291 } 292 292 293 static void __exit exit_nls_cp1251(void) 293 static void __exit exit_nls_cp1251(void) 294 { 294 { 295 unregister_nls(&table); 295 unregister_nls(&table); 296 } 296 } 297 297 298 module_init(init_nls_cp1251) 298 module_init(init_nls_cp1251) 299 module_exit(exit_nls_cp1251) 299 module_exit(exit_nls_cp1251) 300 300 301 MODULE_DESCRIPTION("NLS Windows CP1251 (Bulgar << 302 MODULE_LICENSE("Dual BSD/GPL"); 301 MODULE_LICENSE("Dual BSD/GPL"); 303 302
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.