linux/fs/nls/nls_cp866.c
<<
>>
Prefs
   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        .owner          = THIS_MODULE,
 291};
 292
 293static int __init init_nls_cp866(void)
 294{
 295        return register_nls(&table);
 296}
 297
 298static void __exit exit_nls_cp866(void)
 299{
 300        unregister_nls(&table);
 301}
 302
 303module_init(init_nls_cp866)
 304module_exit(exit_nls_cp866)
 305
 306MODULE_LICENSE("Dual BSD/GPL");
 307