xref: /linux/fs/nls/mac-cyrillic.c (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
171ca97daSVladimir Serbinenko /*
2*8b8c0daaSLinus Torvalds  * linux/fs/nls/mac-cyrillic.c
371ca97daSVladimir Serbinenko  *
471ca97daSVladimir Serbinenko  * Charset maccyrillic translation tables.
571ca97daSVladimir Serbinenko  * Generated automatically from the Unicode and charset
671ca97daSVladimir Serbinenko  * tables from the Unicode Organization (www.unicode.org).
771ca97daSVladimir Serbinenko  * The Unicode to charset table has only exact mappings.
871ca97daSVladimir Serbinenko  */
971ca97daSVladimir Serbinenko 
1071ca97daSVladimir Serbinenko /*
1171ca97daSVladimir Serbinenko  * COPYRIGHT AND PERMISSION NOTICE
1271ca97daSVladimir Serbinenko  *
1371ca97daSVladimir Serbinenko  * Copyright 1991-2012 Unicode, Inc.  All rights reserved.  Distributed under
1471ca97daSVladimir Serbinenko  * the Terms of Use in http://www.unicode.org/copyright.html.
1571ca97daSVladimir Serbinenko  *
1671ca97daSVladimir Serbinenko  * Permission is hereby granted, free of charge, to any person obtaining a
1771ca97daSVladimir Serbinenko  * copy of the Unicode data files and any associated documentation (the "Data
1871ca97daSVladimir Serbinenko  * Files") or Unicode software and any associated documentation (the
1971ca97daSVladimir Serbinenko  * "Software") to deal in the Data Files or Software without restriction,
2071ca97daSVladimir Serbinenko  * including without limitation the rights to use, copy, modify, merge,
2171ca97daSVladimir Serbinenko  * publish, distribute, and/or sell copies of the Data Files or Software, and
2271ca97daSVladimir Serbinenko  * to permit persons to whom the Data Files or Software are furnished to do
2371ca97daSVladimir Serbinenko  * so, provided that (a) the above copyright notice(s) and this permission
2471ca97daSVladimir Serbinenko  * notice appear with all copies of the Data Files or Software, (b) both the
2571ca97daSVladimir Serbinenko  * above copyright notice(s) and this permission notice appear in associated
2671ca97daSVladimir Serbinenko  * documentation, and (c) there is clear notice in each modified Data File or
2771ca97daSVladimir Serbinenko  * in the Software as well as in the documentation associated with the Data
2871ca97daSVladimir Serbinenko  * File(s) or Software that the data or software has been modified.
2971ca97daSVladimir Serbinenko  *
3071ca97daSVladimir Serbinenko  * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
3171ca97daSVladimir Serbinenko  * KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3271ca97daSVladimir Serbinenko  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
3371ca97daSVladimir Serbinenko  * THIRD PARTY RIGHTS.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
3471ca97daSVladimir Serbinenko  * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
3571ca97daSVladimir Serbinenko  * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
3671ca97daSVladimir Serbinenko  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
3771ca97daSVladimir Serbinenko  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
3871ca97daSVladimir Serbinenko  * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
3971ca97daSVladimir Serbinenko  *
4071ca97daSVladimir Serbinenko  * Except as contained in this notice, the name of a copyright holder shall
4171ca97daSVladimir Serbinenko  * not be used in advertising or otherwise to promote the sale, use or other
4271ca97daSVladimir Serbinenko  * dealings in these Data Files or Software without prior written
4371ca97daSVladimir Serbinenko  * authorization of the copyright holder.
4471ca97daSVladimir Serbinenko  */
4571ca97daSVladimir Serbinenko 
4671ca97daSVladimir Serbinenko #include <linux/module.h>
4771ca97daSVladimir Serbinenko #include <linux/kernel.h>
4871ca97daSVladimir Serbinenko #include <linux/string.h>
4971ca97daSVladimir Serbinenko #include <linux/nls.h>
5071ca97daSVladimir Serbinenko #include <linux/errno.h>
5171ca97daSVladimir Serbinenko 
5271ca97daSVladimir Serbinenko static const wchar_t charset2uni[256] = {
5371ca97daSVladimir Serbinenko 	/* 0x00 */
5471ca97daSVladimir Serbinenko 	0x0000, 0x0001, 0x0002, 0x0003,
5571ca97daSVladimir Serbinenko 	0x0004, 0x0005, 0x0006, 0x0007,
5671ca97daSVladimir Serbinenko 	0x0008, 0x0009, 0x000a, 0x000b,
5771ca97daSVladimir Serbinenko 	0x000c, 0x000d, 0x000e, 0x000f,
5871ca97daSVladimir Serbinenko 	/* 0x10 */
5971ca97daSVladimir Serbinenko 	0x0010, 0x0011, 0x0012, 0x0013,
6071ca97daSVladimir Serbinenko 	0x0014, 0x0015, 0x0016, 0x0017,
6171ca97daSVladimir Serbinenko 	0x0018, 0x0019, 0x001a, 0x001b,
6271ca97daSVladimir Serbinenko 	0x001c, 0x001d, 0x001e, 0x001f,
6371ca97daSVladimir Serbinenko 	/* 0x20 */
6471ca97daSVladimir Serbinenko 	0x0020, 0x0021, 0x0022, 0x0023,
6571ca97daSVladimir Serbinenko 	0x0024, 0x0025, 0x0026, 0x0027,
6671ca97daSVladimir Serbinenko 	0x0028, 0x0029, 0x002a, 0x002b,
6771ca97daSVladimir Serbinenko 	0x002c, 0x002d, 0x002e, 0x002f,
6871ca97daSVladimir Serbinenko 	/* 0x30 */
6971ca97daSVladimir Serbinenko 	0x0030, 0x0031, 0x0032, 0x0033,
7071ca97daSVladimir Serbinenko 	0x0034, 0x0035, 0x0036, 0x0037,
7171ca97daSVladimir Serbinenko 	0x0038, 0x0039, 0x003a, 0x003b,
7271ca97daSVladimir Serbinenko 	0x003c, 0x003d, 0x003e, 0x003f,
7371ca97daSVladimir Serbinenko 	/* 0x40 */
7471ca97daSVladimir Serbinenko 	0x0040, 0x0041, 0x0042, 0x0043,
7571ca97daSVladimir Serbinenko 	0x0044, 0x0045, 0x0046, 0x0047,
7671ca97daSVladimir Serbinenko 	0x0048, 0x0049, 0x004a, 0x004b,
7771ca97daSVladimir Serbinenko 	0x004c, 0x004d, 0x004e, 0x004f,
7871ca97daSVladimir Serbinenko 	/* 0x50 */
7971ca97daSVladimir Serbinenko 	0x0050, 0x0051, 0x0052, 0x0053,
8071ca97daSVladimir Serbinenko 	0x0054, 0x0055, 0x0056, 0x0057,
8171ca97daSVladimir Serbinenko 	0x0058, 0x0059, 0x005a, 0x005b,
8271ca97daSVladimir Serbinenko 	0x005c, 0x005d, 0x005e, 0x005f,
8371ca97daSVladimir Serbinenko 	/* 0x60 */
8471ca97daSVladimir Serbinenko 	0x0060, 0x0061, 0x0062, 0x0063,
8571ca97daSVladimir Serbinenko 	0x0064, 0x0065, 0x0066, 0x0067,
8671ca97daSVladimir Serbinenko 	0x0068, 0x0069, 0x006a, 0x006b,
8771ca97daSVladimir Serbinenko 	0x006c, 0x006d, 0x006e, 0x006f,
8871ca97daSVladimir Serbinenko 	/* 0x70 */
8971ca97daSVladimir Serbinenko 	0x0070, 0x0071, 0x0072, 0x0073,
9071ca97daSVladimir Serbinenko 	0x0074, 0x0075, 0x0076, 0x0077,
9171ca97daSVladimir Serbinenko 	0x0078, 0x0079, 0x007a, 0x007b,
9271ca97daSVladimir Serbinenko 	0x007c, 0x007d, 0x007e, 0x007f,
9371ca97daSVladimir Serbinenko 	/* 0x80 */
9471ca97daSVladimir Serbinenko 	0x0410, 0x0411, 0x0412, 0x0413,
9571ca97daSVladimir Serbinenko 	0x0414, 0x0415, 0x0416, 0x0417,
9671ca97daSVladimir Serbinenko 	0x0418, 0x0419, 0x041a, 0x041b,
9771ca97daSVladimir Serbinenko 	0x041c, 0x041d, 0x041e, 0x041f,
9871ca97daSVladimir Serbinenko 	/* 0x90 */
9971ca97daSVladimir Serbinenko 	0x0420, 0x0421, 0x0422, 0x0423,
10071ca97daSVladimir Serbinenko 	0x0424, 0x0425, 0x0426, 0x0427,
10171ca97daSVladimir Serbinenko 	0x0428, 0x0429, 0x042a, 0x042b,
10271ca97daSVladimir Serbinenko 	0x042c, 0x042d, 0x042e, 0x042f,
10371ca97daSVladimir Serbinenko 	/* 0xa0 */
10471ca97daSVladimir Serbinenko 	0x2020, 0x00b0, 0x0490, 0x00a3,
10571ca97daSVladimir Serbinenko 	0x00a7, 0x2022, 0x00b6, 0x0406,
10671ca97daSVladimir Serbinenko 	0x00ae, 0x00a9, 0x2122, 0x0402,
10771ca97daSVladimir Serbinenko 	0x0452, 0x2260, 0x0403, 0x0453,
10871ca97daSVladimir Serbinenko 	/* 0xb0 */
10971ca97daSVladimir Serbinenko 	0x221e, 0x00b1, 0x2264, 0x2265,
11071ca97daSVladimir Serbinenko 	0x0456, 0x00b5, 0x0491, 0x0408,
11171ca97daSVladimir Serbinenko 	0x0404, 0x0454, 0x0407, 0x0457,
11271ca97daSVladimir Serbinenko 	0x0409, 0x0459, 0x040a, 0x045a,
11371ca97daSVladimir Serbinenko 	/* 0xc0 */
11471ca97daSVladimir Serbinenko 	0x0458, 0x0405, 0x00ac, 0x221a,
11571ca97daSVladimir Serbinenko 	0x0192, 0x2248, 0x2206, 0x00ab,
11671ca97daSVladimir Serbinenko 	0x00bb, 0x2026, 0x00a0, 0x040b,
11771ca97daSVladimir Serbinenko 	0x045b, 0x040c, 0x045c, 0x0455,
11871ca97daSVladimir Serbinenko 	/* 0xd0 */
11971ca97daSVladimir Serbinenko 	0x2013, 0x2014, 0x201c, 0x201d,
12071ca97daSVladimir Serbinenko 	0x2018, 0x2019, 0x00f7, 0x201e,
12171ca97daSVladimir Serbinenko 	0x040e, 0x045e, 0x040f, 0x045f,
12271ca97daSVladimir Serbinenko 	0x2116, 0x0401, 0x0451, 0x044f,
12371ca97daSVladimir Serbinenko 	/* 0xe0 */
12471ca97daSVladimir Serbinenko 	0x0430, 0x0431, 0x0432, 0x0433,
12571ca97daSVladimir Serbinenko 	0x0434, 0x0435, 0x0436, 0x0437,
12671ca97daSVladimir Serbinenko 	0x0438, 0x0439, 0x043a, 0x043b,
12771ca97daSVladimir Serbinenko 	0x043c, 0x043d, 0x043e, 0x043f,
12871ca97daSVladimir Serbinenko 	/* 0xf0 */
12971ca97daSVladimir Serbinenko 	0x0440, 0x0441, 0x0442, 0x0443,
13071ca97daSVladimir Serbinenko 	0x0444, 0x0445, 0x0446, 0x0447,
13171ca97daSVladimir Serbinenko 	0x0448, 0x0449, 0x044a, 0x044b,
13271ca97daSVladimir Serbinenko 	0x044c, 0x044d, 0x044e, 0x20ac,
13371ca97daSVladimir Serbinenko };
13471ca97daSVladimir Serbinenko 
13571ca97daSVladimir Serbinenko static const unsigned char page00[256] = {
13671ca97daSVladimir Serbinenko 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 0x00-0x07 */
13771ca97daSVladimir Serbinenko 	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 0x08-0x0f */
13871ca97daSVladimir Serbinenko 	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* 0x10-0x17 */
13971ca97daSVladimir Serbinenko 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* 0x18-0x1f */
14071ca97daSVladimir Serbinenko 	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, /* 0x20-0x27 */
14171ca97daSVladimir Serbinenko 	0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, /* 0x28-0x2f */
14271ca97daSVladimir Serbinenko 	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 0x30-0x37 */
14371ca97daSVladimir Serbinenko 	0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, /* 0x38-0x3f */
14471ca97daSVladimir Serbinenko 	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* 0x40-0x47 */
14571ca97daSVladimir Serbinenko 	0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, /* 0x48-0x4f */
14671ca97daSVladimir Serbinenko 	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, /* 0x50-0x57 */
14771ca97daSVladimir Serbinenko 	0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, /* 0x58-0x5f */
14871ca97daSVladimir Serbinenko 	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 0x60-0x67 */
14971ca97daSVladimir Serbinenko 	0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, /* 0x68-0x6f */
15071ca97daSVladimir Serbinenko 	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, /* 0x70-0x77 */
15171ca97daSVladimir Serbinenko 	0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, /* 0x78-0x7f */
15271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
15371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
15471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
15571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
15671ca97daSVladimir Serbinenko 	0xca, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa4, /* 0xa0-0xa7 */
15771ca97daSVladimir Serbinenko 	0x00, 0xa9, 0x00, 0xc7, 0xc2, 0x00, 0xa8, 0x00, /* 0xa8-0xaf */
15871ca97daSVladimir Serbinenko 	0xa1, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xa6, 0x00, /* 0xb0-0xb7 */
15971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
16071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
16171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
16271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
16371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
16471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
16571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
16671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, /* 0xf0-0xf7 */
16771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
16871ca97daSVladimir Serbinenko };
16971ca97daSVladimir Serbinenko 
17071ca97daSVladimir Serbinenko static const unsigned char page01[256] = {
17171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
17271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
17371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
17471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
17571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
17671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
17771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
17871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
17971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
18071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
18171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
18271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
18371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
18471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
18571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
18671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
18771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
18871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
18971ca97daSVladimir Serbinenko 	0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
19071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
19171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
19271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
19371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
19471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
19571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
19671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
19771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
19871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
19971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
20071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
20171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
20271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
20371ca97daSVladimir Serbinenko };
20471ca97daSVladimir Serbinenko 
20571ca97daSVladimir Serbinenko static const unsigned char page04[256] = {
20671ca97daSVladimir Serbinenko 	0x00, 0xdd, 0xab, 0xae, 0xb8, 0xc1, 0xa7, 0xba, /* 0x00-0x07 */
20771ca97daSVladimir Serbinenko 	0xb7, 0xbc, 0xbe, 0xcb, 0xcd, 0x00, 0xd8, 0xda, /* 0x08-0x0f */
20871ca97daSVladimir Serbinenko 	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 0x10-0x17 */
20971ca97daSVladimir Serbinenko 	0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, /* 0x18-0x1f */
21071ca97daSVladimir Serbinenko 	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, /* 0x20-0x27 */
21171ca97daSVladimir Serbinenko 	0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, /* 0x28-0x2f */
21271ca97daSVladimir Serbinenko 	0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */
21371ca97daSVladimir Serbinenko 	0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */
21471ca97daSVladimir Serbinenko 	0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */
21571ca97daSVladimir Serbinenko 	0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, /* 0x48-0x4f */
21671ca97daSVladimir Serbinenko 	0x00, 0xde, 0xac, 0xaf, 0xb9, 0xcf, 0xb4, 0xbb, /* 0x50-0x57 */
21771ca97daSVladimir Serbinenko 	0xc0, 0xbd, 0xbf, 0xcc, 0xce, 0x00, 0xd9, 0xdb, /* 0x58-0x5f */
21871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
21971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
22071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
22171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
22271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
22371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
22471ca97daSVladimir Serbinenko 	0xa2, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
22571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
22671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
22771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
22871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
22971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
23071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
23171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
23271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
23371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
23471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
23571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
23671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
23771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
23871ca97daSVladimir Serbinenko };
23971ca97daSVladimir Serbinenko 
24071ca97daSVladimir Serbinenko static const unsigned char page20[256] = {
24171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
24271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
24371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0xd0, 0xd1, 0x00, 0x00, 0x00, /* 0x10-0x17 */
24471ca97daSVladimir Serbinenko 	0xd4, 0xd5, 0x00, 0x00, 0xd2, 0xd3, 0xd7, 0x00, /* 0x18-0x1f */
24571ca97daSVladimir Serbinenko 	0xa0, 0x00, 0xa5, 0x00, 0x00, 0x00, 0xc9, 0x00, /* 0x20-0x27 */
24671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
24771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
24871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
24971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
25071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
25171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
25271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
25371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
25471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
25571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
25671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
25771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
25871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
25971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
26071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
26171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
26271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
26371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
26471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
26571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
26671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
26771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
26871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
26971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
27071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
27171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
27271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
27371ca97daSVladimir Serbinenko };
27471ca97daSVladimir Serbinenko 
27571ca97daSVladimir Serbinenko static const unsigned char page21[256] = {
27671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
27771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
27871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x00, /* 0x10-0x17 */
27971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
28071ca97daSVladimir Serbinenko 	0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
28171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
28271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
28371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
28471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
28571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
28671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
28771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
28871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
28971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
29071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
29171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
29271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
29371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
29471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
29571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
29671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
29771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
29871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
29971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
30071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
30171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
30271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
30371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
30471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
30571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
30671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
30771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
30871ca97daSVladimir Serbinenko };
30971ca97daSVladimir Serbinenko 
31071ca97daSVladimir Serbinenko static const unsigned char page22[256] = {
31171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, /* 0x00-0x07 */
31271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
31371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
31471ca97daSVladimir Serbinenko 	0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0xb0, 0x00, /* 0x18-0x1f */
31571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
31671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
31771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
31871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
31971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
32071ca97daSVladimir Serbinenko 	0xc5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
32171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
32271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
32371ca97daSVladimir Serbinenko 	0xad, 0x00, 0x00, 0x00, 0xb2, 0xb3, 0x00, 0x00, /* 0x60-0x67 */
32471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
32571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
32671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
32771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
32871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
32971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
33071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
33171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
33271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
33371ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
33471ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
33571ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
33671ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
33771ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
33871ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
33971ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
34071ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
34171ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
34271ca97daSVladimir Serbinenko 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
34371ca97daSVladimir Serbinenko };
34471ca97daSVladimir Serbinenko 
34571ca97daSVladimir Serbinenko static const unsigned char *const page_uni2charset[256] = {
34671ca97daSVladimir Serbinenko 	page00, page01, NULL,   NULL,   page04, NULL,   NULL,   NULL,
34771ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
34871ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
34971ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35071ca97daSVladimir Serbinenko 	page20, page21, page22, NULL,   NULL,   NULL,   NULL,   NULL,
35171ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35271ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35371ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35471ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35571ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35671ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35771ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35871ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
35971ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36071ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36171ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36271ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36371ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36471ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36571ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36671ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36771ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36871ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
36971ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37071ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37171ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37271ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37371ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37471ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37571ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37671ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37771ca97daSVladimir Serbinenko 	NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,   NULL,
37871ca97daSVladimir Serbinenko };
37971ca97daSVladimir Serbinenko 
38071ca97daSVladimir Serbinenko static const unsigned char charset2lower[256] = {
38171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */
38271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */
38371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */
38471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */
38571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */
38671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */
38771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */
38871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */
38971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */
39071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */
39171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */
39271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */
39371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */
39471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */
39571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */
39671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */
39771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */
39871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */
39971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */
40071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */
40171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */
40271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */
40371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */
40471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */
40571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */
40671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */
40771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */
40871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */
40971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */
41071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */
41171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */
41271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */
41371ca97daSVladimir Serbinenko };
41471ca97daSVladimir Serbinenko 
41571ca97daSVladimir Serbinenko static const unsigned char charset2upper[256] = {
41671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x00-0x07 */
41771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x08-0x0f */
41871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x10-0x17 */
41971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x18-0x1f */
42071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x20-0x27 */
42171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x28-0x2f */
42271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x30-0x37 */
42371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x38-0x3f */
42471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x40-0x47 */
42571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x48-0x4f */
42671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x50-0x57 */
42771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x58-0x5f */
42871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x60-0x67 */
42971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x68-0x6f */
43071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x70-0x77 */
43171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x78-0x7f */
43271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x80-0x87 */
43371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x88-0x8f */
43471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x90-0x97 */
43571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0x98-0x9f */
43671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa0-0xa7 */
43771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xa8-0xaf */
43871ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb0-0xb7 */
43971ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xb8-0xbf */
44071ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc0-0xc7 */
44171ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xc8-0xcf */
44271ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd0-0xd7 */
44371ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xd8-0xdf */
44471ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe0-0xe7 */
44571ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xe8-0xef */
44671ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf0-0xf7 */
44771ca97daSVladimir Serbinenko 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0xf8-0xff */
44871ca97daSVladimir Serbinenko };
44971ca97daSVladimir Serbinenko 
45071ca97daSVladimir Serbinenko static int uni2char(wchar_t uni, unsigned char *out, int boundlen)
45171ca97daSVladimir Serbinenko {
45271ca97daSVladimir Serbinenko 	const unsigned char *uni2charset;
45371ca97daSVladimir Serbinenko 	unsigned char cl = uni & 0x00ff;
45471ca97daSVladimir Serbinenko 	unsigned char ch = (uni & 0xff00) >> 8;
45571ca97daSVladimir Serbinenko 
45671ca97daSVladimir Serbinenko 	if (boundlen <= 0)
45771ca97daSVladimir Serbinenko 		return -ENAMETOOLONG;
45871ca97daSVladimir Serbinenko 
45971ca97daSVladimir Serbinenko 	uni2charset = page_uni2charset[ch];
46071ca97daSVladimir Serbinenko 	if (uni2charset && uni2charset[cl])
46171ca97daSVladimir Serbinenko 		out[0] = uni2charset[cl];
46271ca97daSVladimir Serbinenko 	else
46371ca97daSVladimir Serbinenko 		return -EINVAL;
46471ca97daSVladimir Serbinenko 	return 1;
46571ca97daSVladimir Serbinenko }
46671ca97daSVladimir Serbinenko 
46771ca97daSVladimir Serbinenko static int char2uni(const unsigned char *rawstring, int boundlen, wchar_t *uni)
46871ca97daSVladimir Serbinenko {
46971ca97daSVladimir Serbinenko 	*uni = charset2uni[*rawstring];
47071ca97daSVladimir Serbinenko 	if (*uni == 0x0000)
47171ca97daSVladimir Serbinenko 		return -EINVAL;
47271ca97daSVladimir Serbinenko 	return 1;
47371ca97daSVladimir Serbinenko }
47471ca97daSVladimir Serbinenko 
47571ca97daSVladimir Serbinenko static struct nls_table table = {
47671ca97daSVladimir Serbinenko 	.charset	= "maccyrillic",
47771ca97daSVladimir Serbinenko 	.uni2char	= uni2char,
47871ca97daSVladimir Serbinenko 	.char2uni	= char2uni,
47971ca97daSVladimir Serbinenko 	.charset2lower	= charset2lower,
48071ca97daSVladimir Serbinenko 	.charset2upper	= charset2upper,
48171ca97daSVladimir Serbinenko };
48271ca97daSVladimir Serbinenko 
48371ca97daSVladimir Serbinenko static int __init init_nls_maccyrillic(void)
48471ca97daSVladimir Serbinenko {
48571ca97daSVladimir Serbinenko 	return register_nls(&table);
48671ca97daSVladimir Serbinenko }
48771ca97daSVladimir Serbinenko 
48871ca97daSVladimir Serbinenko static void __exit exit_nls_maccyrillic(void)
48971ca97daSVladimir Serbinenko {
49071ca97daSVladimir Serbinenko 	unregister_nls(&table);
49171ca97daSVladimir Serbinenko }
49271ca97daSVladimir Serbinenko 
49371ca97daSVladimir Serbinenko module_init(init_nls_maccyrillic)
49471ca97daSVladimir Serbinenko module_exit(exit_nls_maccyrillic)
49571ca97daSVladimir Serbinenko 
49671ca97daSVladimir Serbinenko MODULE_LICENSE("Dual BSD/GPL");
497