cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nls_cp866.c (12642B)


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