Drizzled Public API Documentation

ctype-utf8.cc
1 /* Copyright (C) 2000 MySQL AB
2 
3  This library is free software; you can redistribute it and/or
4  modify it under the terms of the GNU Library General Public
5  License as published by the Free Software Foundation; version 2
6  of the License.
7 
8  This library is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  Library General Public License for more details.
12 
13  You should have received a copy of the GNU Library General Public
14  License along with this library; if not, write to the Free
15  Software Foundation, Inc., 51 Franklin Place - Suite 330, Boston,
16  MA 02110-1301, USA */
17 
18 /* UTF8 according RFC 2279 */
19 /* Written by Alexander Barkov <bar@udm.net> */
20 
21 #include <config.h>
22 
23 #include <drizzled/internal/m_string.h>
24 #include <drizzled/charset.h>
25 #include <errno.h>
26 
27 #include <algorithm>
28 
29 #ifndef EILSEQ
30 #define EILSEQ ENOENT
31 #endif
32 
33 
34 #define MY_UTF8MB3_GENERAL_CI MY_UTF8MB3 "_general_ci"
35 #define MY_UTF8MB3_BIN MY_UTF8MB3 "_bin"
36 #define MY_UTF8MB4_GENERAL_CI MY_UTF8MB4 "_general_ci"
37 #define MY_UTF8MB4_BIN MY_UTF8MB4 "_bin"
38 
39 
40 using namespace std;
41 
42 namespace drizzled
43 {
44 
45 void my_hash_sort_utf8mb4(const charset_info_st* cs,
46  const unsigned char *s, size_t slen,
47  uint32_t *n1, uint32_t *n2);
48 
49 static MY_UNICASE_INFO plane00[]={
50  {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001},
51  {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003},
52  {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005},
53  {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007},
54  {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009},
55  {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B},
56  {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D},
57  {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F},
58  {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011},
59  {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013},
60  {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015},
61  {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017},
62  {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019},
63  {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B},
64  {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D},
65  {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F},
66  {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021},
67  {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023},
68  {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025},
69  {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027},
70  {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029},
71  {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B},
72  {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D},
73  {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F},
74  {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031},
75  {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033},
76  {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035},
77  {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037},
78  {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039},
79  {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B},
80  {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D},
81  {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F},
82  {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041},
83  {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043},
84  {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045},
85  {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047},
86  {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049},
87  {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B},
88  {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D},
89  {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F},
90  {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051},
91  {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053},
92  {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055},
93  {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057},
94  {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059},
95  {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B},
96  {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D},
97  {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F},
98  {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041},
99  {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043},
100  {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045},
101  {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047},
102  {0x0048,0x0068,0x0048}, {0x0049,0x0069,0x0049},
103  {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B},
104  {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D},
105  {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F},
106  {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051},
107  {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053},
108  {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055},
109  {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057},
110  {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059},
111  {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B},
112  {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D},
113  {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F},
114  {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081},
115  {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083},
116  {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085},
117  {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087},
118  {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089},
119  {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B},
120  {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D},
121  {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F},
122  {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091},
123  {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093},
124  {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095},
125  {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097},
126  {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099},
127  {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B},
128  {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D},
129  {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F},
130  {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1},
131  {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3},
132  {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5},
133  {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7},
134  {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9},
135  {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB},
136  {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD},
137  {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF},
138  {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1},
139  {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3},
140  {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C},
141  {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7},
142  {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9},
143  {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB},
144  {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD},
145  {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF},
146  {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041},
147  {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041},
148  {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041},
149  {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043},
150  {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045},
151  {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045},
152  {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049},
153  {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049},
154  {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E},
155  {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F},
156  {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F},
157  {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7},
158  {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055},
159  {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055},
160  {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059},
161  {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x0053},
162  {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041},
163  {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041},
164  {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041},
165  {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043},
166  {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045},
167  {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045},
168  {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049},
169  {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049},
170  {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E},
171  {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F},
172  {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F},
173  {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7},
174  {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055},
175  {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055},
176  {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059},
177  {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059}
178 };
179 
180 
181 
182 static MY_UNICASE_INFO plane01[]={
183  {0x0100,0x0101,0x0041}, {0x0100,0x0101,0x0041},
184  {0x0102,0x0103,0x0041}, {0x0102,0x0103,0x0041},
185  {0x0104,0x0105,0x0041}, {0x0104,0x0105,0x0041},
186  {0x0106,0x0107,0x0043}, {0x0106,0x0107,0x0043},
187  {0x0108,0x0109,0x0043}, {0x0108,0x0109,0x0043},
188  {0x010A,0x010B,0x0043}, {0x010A,0x010B,0x0043},
189  {0x010C,0x010D,0x0043}, {0x010C,0x010D,0x0043},
190  {0x010E,0x010F,0x0044}, {0x010E,0x010F,0x0044},
191  {0x0110,0x0111,0x0110}, {0x0110,0x0111,0x0110},
192  {0x0112,0x0113,0x0045}, {0x0112,0x0113,0x0045},
193  {0x0114,0x0115,0x0045}, {0x0114,0x0115,0x0045},
194  {0x0116,0x0117,0x0045}, {0x0116,0x0117,0x0045},
195  {0x0118,0x0119,0x0045}, {0x0118,0x0119,0x0045},
196  {0x011A,0x011B,0x0045}, {0x011A,0x011B,0x0045},
197  {0x011C,0x011D,0x0047}, {0x011C,0x011D,0x0047},
198  {0x011E,0x011F,0x0047}, {0x011E,0x011F,0x0047},
199  {0x0120,0x0121,0x0047}, {0x0120,0x0121,0x0047},
200  {0x0122,0x0123,0x0047}, {0x0122,0x0123,0x0047},
201  {0x0124,0x0125,0x0048}, {0x0124,0x0125,0x0048},
202  {0x0126,0x0127,0x0126}, {0x0126,0x0127,0x0126},
203  {0x0128,0x0129,0x0049}, {0x0128,0x0129,0x0049},
204  {0x012A,0x012B,0x0049}, {0x012A,0x012B,0x0049},
205  {0x012C,0x012D,0x0049}, {0x012C,0x012D,0x0049},
206  {0x012E,0x012F,0x0049}, {0x012E,0x012F,0x0049},
207  {0x0130,0x0069,0x0049}, {0x0049,0x0131,0x0049},
208  {0x0132,0x0133,0x0132}, {0x0132,0x0133,0x0132},
209  {0x0134,0x0135,0x004A}, {0x0134,0x0135,0x004A},
210  {0x0136,0x0137,0x004B}, {0x0136,0x0137,0x004B},
211  {0x0138,0x0138,0x0138}, {0x0139,0x013A,0x004C},
212  {0x0139,0x013A,0x004C}, {0x013B,0x013C,0x004C},
213  {0x013B,0x013C,0x004C}, {0x013D,0x013E,0x004C},
214  {0x013D,0x013E,0x004C}, {0x013F,0x0140,0x013F},
215  {0x013F,0x0140,0x013F}, {0x0141,0x0142,0x0141},
216  {0x0141,0x0142,0x0141}, {0x0143,0x0144,0x004E},
217  {0x0143,0x0144,0x004E}, {0x0145,0x0146,0x004E},
218  {0x0145,0x0146,0x004E}, {0x0147,0x0148,0x004E},
219  {0x0147,0x0148,0x004E}, {0x0149,0x0149,0x0149},
220  {0x014A,0x014B,0x014A}, {0x014A,0x014B,0x014A},
221  {0x014C,0x014D,0x004F}, {0x014C,0x014D,0x004F},
222  {0x014E,0x014F,0x004F}, {0x014E,0x014F,0x004F},
223  {0x0150,0x0151,0x004F}, {0x0150,0x0151,0x004F},
224  {0x0152,0x0153,0x0152}, {0x0152,0x0153,0x0152},
225  {0x0154,0x0155,0x0052}, {0x0154,0x0155,0x0052},
226  {0x0156,0x0157,0x0052}, {0x0156,0x0157,0x0052},
227  {0x0158,0x0159,0x0052}, {0x0158,0x0159,0x0052},
228  {0x015A,0x015B,0x0053}, {0x015A,0x015B,0x0053},
229  {0x015C,0x015D,0x0053}, {0x015C,0x015D,0x0053},
230  {0x015E,0x015F,0x0053}, {0x015E,0x015F,0x0053},
231  {0x0160,0x0161,0x0053}, {0x0160,0x0161,0x0053},
232  {0x0162,0x0163,0x0054}, {0x0162,0x0163,0x0054},
233  {0x0164,0x0165,0x0054}, {0x0164,0x0165,0x0054},
234  {0x0166,0x0167,0x0166}, {0x0166,0x0167,0x0166},
235  {0x0168,0x0169,0x0055}, {0x0168,0x0169,0x0055},
236  {0x016A,0x016B,0x0055}, {0x016A,0x016B,0x0055},
237  {0x016C,0x016D,0x0055}, {0x016C,0x016D,0x0055},
238  {0x016E,0x016F,0x0055}, {0x016E,0x016F,0x0055},
239  {0x0170,0x0171,0x0055}, {0x0170,0x0171,0x0055},
240  {0x0172,0x0173,0x0055}, {0x0172,0x0173,0x0055},
241  {0x0174,0x0175,0x0057}, {0x0174,0x0175,0x0057},
242  {0x0176,0x0177,0x0059}, {0x0176,0x0177,0x0059},
243  {0x0178,0x00FF,0x0059}, {0x0179,0x017A,0x005A},
244  {0x0179,0x017A,0x005A}, {0x017B,0x017C,0x005A},
245  {0x017B,0x017C,0x005A}, {0x017D,0x017E,0x005A},
246  {0x017D,0x017E,0x005A}, {0x0053,0x017F,0x0053},
247  {0x0180,0x0180,0x0180}, {0x0181,0x0253,0x0181},
248  {0x0182,0x0183,0x0182}, {0x0182,0x0183,0x0182},
249  {0x0184,0x0185,0x0184}, {0x0184,0x0185,0x0184},
250  {0x0186,0x0254,0x0186}, {0x0187,0x0188,0x0187},
251  {0x0187,0x0188,0x0187}, {0x0189,0x0256,0x0189},
252  {0x018A,0x0257,0x018A}, {0x018B,0x018C,0x018B},
253  {0x018B,0x018C,0x018B}, {0x018D,0x018D,0x018D},
254  {0x018E,0x01DD,0x018E}, {0x018F,0x0259,0x018F},
255  {0x0190,0x025B,0x0190}, {0x0191,0x0192,0x0191},
256  {0x0191,0x0192,0x0191}, {0x0193,0x0260,0x0193},
257  {0x0194,0x0263,0x0194}, {0x01F6,0x0195,0x01F6},
258  {0x0196,0x0269,0x0196}, {0x0197,0x0268,0x0197},
259  {0x0198,0x0199,0x0198}, {0x0198,0x0199,0x0198},
260  {0x019A,0x019A,0x019A}, {0x019B,0x019B,0x019B},
261  {0x019C,0x026F,0x019C}, {0x019D,0x0272,0x019D},
262  {0x019E,0x019E,0x019E}, {0x019F,0x0275,0x019F},
263  {0x01A0,0x01A1,0x004F}, {0x01A0,0x01A1,0x004F},
264  {0x01A2,0x01A3,0x01A2}, {0x01A2,0x01A3,0x01A2},
265  {0x01A4,0x01A5,0x01A4}, {0x01A4,0x01A5,0x01A4},
266  {0x01A6,0x0280,0x01A6}, {0x01A7,0x01A8,0x01A7},
267  {0x01A7,0x01A8,0x01A7}, {0x01A9,0x0283,0x01A9},
268  {0x01AA,0x01AA,0x01AA}, {0x01AB,0x01AB,0x01AB},
269  {0x01AC,0x01AD,0x01AC}, {0x01AC,0x01AD,0x01AC},
270  {0x01AE,0x0288,0x01AE}, {0x01AF,0x01B0,0x0055},
271  {0x01AF,0x01B0,0x0055}, {0x01B1,0x028A,0x01B1},
272  {0x01B2,0x028B,0x01B2}, {0x01B3,0x01B4,0x01B3},
273  {0x01B3,0x01B4,0x01B3}, {0x01B5,0x01B6,0x01B5},
274  {0x01B5,0x01B6,0x01B5}, {0x01B7,0x0292,0x01B7},
275  {0x01B8,0x01B9,0x01B8}, {0x01B8,0x01B9,0x01B8},
276  {0x01BA,0x01BA,0x01BA}, {0x01BB,0x01BB,0x01BB},
277  {0x01BC,0x01BD,0x01BC}, {0x01BC,0x01BD,0x01BC},
278  {0x01BE,0x01BE,0x01BE}, {0x01F7,0x01BF,0x01F7},
279  {0x01C0,0x01C0,0x01C0}, {0x01C1,0x01C1,0x01C1},
280  {0x01C2,0x01C2,0x01C2}, {0x01C3,0x01C3,0x01C3},
281  {0x01C4,0x01C6,0x01C4}, {0x01C4,0x01C6,0x01C4},
282  {0x01C4,0x01C6,0x01C4}, {0x01C7,0x01C9,0x01C7},
283  {0x01C7,0x01C9,0x01C7}, {0x01C7,0x01C9,0x01C7},
284  {0x01CA,0x01CC,0x01CA}, {0x01CA,0x01CC,0x01CA},
285  {0x01CA,0x01CC,0x01CA}, {0x01CD,0x01CE,0x0041},
286  {0x01CD,0x01CE,0x0041}, {0x01CF,0x01D0,0x0049},
287  {0x01CF,0x01D0,0x0049}, {0x01D1,0x01D2,0x004F},
288  {0x01D1,0x01D2,0x004F}, {0x01D3,0x01D4,0x0055},
289  {0x01D3,0x01D4,0x0055}, {0x01D5,0x01D6,0x0055},
290  {0x01D5,0x01D6,0x0055}, {0x01D7,0x01D8,0x0055},
291  {0x01D7,0x01D8,0x0055}, {0x01D9,0x01DA,0x0055},
292  {0x01D9,0x01DA,0x0055}, {0x01DB,0x01DC,0x0055},
293  {0x01DB,0x01DC,0x0055}, {0x018E,0x01DD,0x018E},
294  {0x01DE,0x01DF,0x0041}, {0x01DE,0x01DF,0x0041},
295  {0x01E0,0x01E1,0x0041}, {0x01E0,0x01E1,0x0041},
296  {0x01E2,0x01E3,0x00C6}, {0x01E2,0x01E3,0x00C6},
297  {0x01E4,0x01E5,0x01E4}, {0x01E4,0x01E5,0x01E4},
298  {0x01E6,0x01E7,0x0047}, {0x01E6,0x01E7,0x0047},
299  {0x01E8,0x01E9,0x004B}, {0x01E8,0x01E9,0x004B},
300  {0x01EA,0x01EB,0x004F}, {0x01EA,0x01EB,0x004F},
301  {0x01EC,0x01ED,0x004F}, {0x01EC,0x01ED,0x004F},
302  {0x01EE,0x01EF,0x01B7}, {0x01EE,0x01EF,0x01B7},
303  {0x01F0,0x01F0,0x004A}, {0x01F1,0x01F3,0x01F1},
304  {0x01F1,0x01F3,0x01F1}, {0x01F1,0x01F3,0x01F1},
305  {0x01F4,0x01F5,0x0047}, {0x01F4,0x01F5,0x0047},
306  {0x01F6,0x0195,0x01F6}, {0x01F7,0x01BF,0x01F7},
307  {0x01F8,0x01F9,0x004E}, {0x01F8,0x01F9,0x004E},
308  {0x01FA,0x01FB,0x0041}, {0x01FA,0x01FB,0x0041},
309  {0x01FC,0x01FD,0x00C6}, {0x01FC,0x01FD,0x00C6},
310  {0x01FE,0x01FF,0x00D8}, {0x01FE,0x01FF,0x00D8}
311 };
312 
313 static MY_UNICASE_INFO plane02[]={
314  {0x0200,0x0201,0x0041}, {0x0200,0x0201,0x0041},
315  {0x0202,0x0203,0x0041}, {0x0202,0x0203,0x0041},
316  {0x0204,0x0205,0x0045}, {0x0204,0x0205,0x0045},
317  {0x0206,0x0207,0x0045}, {0x0206,0x0207,0x0045},
318  {0x0208,0x0209,0x0049}, {0x0208,0x0209,0x0049},
319  {0x020A,0x020B,0x0049}, {0x020A,0x020B,0x0049},
320  {0x020C,0x020D,0x004F}, {0x020C,0x020D,0x004F},
321  {0x020E,0x020F,0x004F}, {0x020E,0x020F,0x004F},
322  {0x0210,0x0211,0x0052}, {0x0210,0x0211,0x0052},
323  {0x0212,0x0213,0x0052}, {0x0212,0x0213,0x0052},
324  {0x0214,0x0215,0x0055}, {0x0214,0x0215,0x0055},
325  {0x0216,0x0217,0x0055}, {0x0216,0x0217,0x0055},
326  {0x0218,0x0219,0x0053}, {0x0218,0x0219,0x0053},
327  {0x021A,0x021B,0x0054}, {0x021A,0x021B,0x0054},
328  {0x021C,0x021D,0x021C}, {0x021C,0x021D,0x021C},
329  {0x021E,0x021F,0x0048}, {0x021E,0x021F,0x0048},
330  {0x0220,0x0220,0x0220}, {0x0221,0x0221,0x0221},
331  {0x0222,0x0223,0x0222}, {0x0222,0x0223,0x0222},
332  {0x0224,0x0225,0x0224}, {0x0224,0x0225,0x0224},
333  {0x0226,0x0227,0x0041}, {0x0226,0x0227,0x0041},
334  {0x0228,0x0229,0x0045}, {0x0228,0x0229,0x0045},
335  {0x022A,0x022B,0x004F}, {0x022A,0x022B,0x004F},
336  {0x022C,0x022D,0x004F}, {0x022C,0x022D,0x004F},
337  {0x022E,0x022F,0x004F}, {0x022E,0x022F,0x004F},
338  {0x0230,0x0231,0x004F}, {0x0230,0x0231,0x004F},
339  {0x0232,0x0233,0x0059}, {0x0232,0x0233,0x0059},
340  {0x0234,0x0234,0x0234}, {0x0235,0x0235,0x0235},
341  {0x0236,0x0236,0x0236}, {0x0237,0x0237,0x0237},
342  {0x0238,0x0238,0x0238}, {0x0239,0x0239,0x0239},
343  {0x023A,0x023A,0x023A}, {0x023B,0x023B,0x023B},
344  {0x023C,0x023C,0x023C}, {0x023D,0x023D,0x023D},
345  {0x023E,0x023E,0x023E}, {0x023F,0x023F,0x023F},
346  {0x0240,0x0240,0x0240}, {0x0241,0x0241,0x0241},
347  {0x0242,0x0242,0x0242}, {0x0243,0x0243,0x0243},
348  {0x0244,0x0244,0x0244}, {0x0245,0x0245,0x0245},
349  {0x0246,0x0246,0x0246}, {0x0247,0x0247,0x0247},
350  {0x0248,0x0248,0x0248}, {0x0249,0x0249,0x0249},
351  {0x024A,0x024A,0x024A}, {0x024B,0x024B,0x024B},
352  {0x024C,0x024C,0x024C}, {0x024D,0x024D,0x024D},
353  {0x024E,0x024E,0x024E}, {0x024F,0x024F,0x024F},
354  {0x0250,0x0250,0x0250}, {0x0251,0x0251,0x0251},
355  {0x0252,0x0252,0x0252}, {0x0181,0x0253,0x0181},
356  {0x0186,0x0254,0x0186}, {0x0255,0x0255,0x0255},
357  {0x0189,0x0256,0x0189}, {0x018A,0x0257,0x018A},
358  {0x0258,0x0258,0x0258}, {0x018F,0x0259,0x018F},
359  {0x025A,0x025A,0x025A}, {0x0190,0x025B,0x0190},
360  {0x025C,0x025C,0x025C}, {0x025D,0x025D,0x025D},
361  {0x025E,0x025E,0x025E}, {0x025F,0x025F,0x025F},
362  {0x0193,0x0260,0x0193}, {0x0261,0x0261,0x0261},
363  {0x0262,0x0262,0x0262}, {0x0194,0x0263,0x0194},
364  {0x0264,0x0264,0x0264}, {0x0265,0x0265,0x0265},
365  {0x0266,0x0266,0x0266}, {0x0267,0x0267,0x0267},
366  {0x0197,0x0268,0x0197}, {0x0196,0x0269,0x0196},
367  {0x026A,0x026A,0x026A}, {0x026B,0x026B,0x026B},
368  {0x026C,0x026C,0x026C}, {0x026D,0x026D,0x026D},
369  {0x026E,0x026E,0x026E}, {0x019C,0x026F,0x019C},
370  {0x0270,0x0270,0x0270}, {0x0271,0x0271,0x0271},
371  {0x019D,0x0272,0x019D}, {0x0273,0x0273,0x0273},
372  {0x0274,0x0274,0x0274}, {0x019F,0x0275,0x019F},
373  {0x0276,0x0276,0x0276}, {0x0277,0x0277,0x0277},
374  {0x0278,0x0278,0x0278}, {0x0279,0x0279,0x0279},
375  {0x027A,0x027A,0x027A}, {0x027B,0x027B,0x027B},
376  {0x027C,0x027C,0x027C}, {0x027D,0x027D,0x027D},
377  {0x027E,0x027E,0x027E}, {0x027F,0x027F,0x027F},
378  {0x01A6,0x0280,0x01A6}, {0x0281,0x0281,0x0281},
379  {0x0282,0x0282,0x0282}, {0x01A9,0x0283,0x01A9},
380  {0x0284,0x0284,0x0284}, {0x0285,0x0285,0x0285},
381  {0x0286,0x0286,0x0286}, {0x0287,0x0287,0x0287},
382  {0x01AE,0x0288,0x01AE}, {0x0289,0x0289,0x0289},
383  {0x01B1,0x028A,0x01B1}, {0x01B2,0x028B,0x01B2},
384  {0x028C,0x028C,0x028C}, {0x028D,0x028D,0x028D},
385  {0x028E,0x028E,0x028E}, {0x028F,0x028F,0x028F},
386  {0x0290,0x0290,0x0290}, {0x0291,0x0291,0x0291},
387  {0x01B7,0x0292,0x01B7}, {0x0293,0x0293,0x0293},
388  {0x0294,0x0294,0x0294}, {0x0295,0x0295,0x0295},
389  {0x0296,0x0296,0x0296}, {0x0297,0x0297,0x0297},
390  {0x0298,0x0298,0x0298}, {0x0299,0x0299,0x0299},
391  {0x029A,0x029A,0x029A}, {0x029B,0x029B,0x029B},
392  {0x029C,0x029C,0x029C}, {0x029D,0x029D,0x029D},
393  {0x029E,0x029E,0x029E}, {0x029F,0x029F,0x029F},
394  {0x02A0,0x02A0,0x02A0}, {0x02A1,0x02A1,0x02A1},
395  {0x02A2,0x02A2,0x02A2}, {0x02A3,0x02A3,0x02A3},
396  {0x02A4,0x02A4,0x02A4}, {0x02A5,0x02A5,0x02A5},
397  {0x02A6,0x02A6,0x02A6}, {0x02A7,0x02A7,0x02A7},
398  {0x02A8,0x02A8,0x02A8}, {0x02A9,0x02A9,0x02A9},
399  {0x02AA,0x02AA,0x02AA}, {0x02AB,0x02AB,0x02AB},
400  {0x02AC,0x02AC,0x02AC}, {0x02AD,0x02AD,0x02AD},
401  {0x02AE,0x02AE,0x02AE}, {0x02AF,0x02AF,0x02AF},
402  {0x02B0,0x02B0,0x02B0}, {0x02B1,0x02B1,0x02B1},
403  {0x02B2,0x02B2,0x02B2}, {0x02B3,0x02B3,0x02B3},
404  {0x02B4,0x02B4,0x02B4}, {0x02B5,0x02B5,0x02B5},
405  {0x02B6,0x02B6,0x02B6}, {0x02B7,0x02B7,0x02B7},
406  {0x02B8,0x02B8,0x02B8}, {0x02B9,0x02B9,0x02B9},
407  {0x02BA,0x02BA,0x02BA}, {0x02BB,0x02BB,0x02BB},
408  {0x02BC,0x02BC,0x02BC}, {0x02BD,0x02BD,0x02BD},
409  {0x02BE,0x02BE,0x02BE}, {0x02BF,0x02BF,0x02BF},
410  {0x02C0,0x02C0,0x02C0}, {0x02C1,0x02C1,0x02C1},
411  {0x02C2,0x02C2,0x02C2}, {0x02C3,0x02C3,0x02C3},
412  {0x02C4,0x02C4,0x02C4}, {0x02C5,0x02C5,0x02C5},
413  {0x02C6,0x02C6,0x02C6}, {0x02C7,0x02C7,0x02C7},
414  {0x02C8,0x02C8,0x02C8}, {0x02C9,0x02C9,0x02C9},
415  {0x02CA,0x02CA,0x02CA}, {0x02CB,0x02CB,0x02CB},
416  {0x02CC,0x02CC,0x02CC}, {0x02CD,0x02CD,0x02CD},
417  {0x02CE,0x02CE,0x02CE}, {0x02CF,0x02CF,0x02CF},
418  {0x02D0,0x02D0,0x02D0}, {0x02D1,0x02D1,0x02D1},
419  {0x02D2,0x02D2,0x02D2}, {0x02D3,0x02D3,0x02D3},
420  {0x02D4,0x02D4,0x02D4}, {0x02D5,0x02D5,0x02D5},
421  {0x02D6,0x02D6,0x02D6}, {0x02D7,0x02D7,0x02D7},
422  {0x02D8,0x02D8,0x02D8}, {0x02D9,0x02D9,0x02D9},
423  {0x02DA,0x02DA,0x02DA}, {0x02DB,0x02DB,0x02DB},
424  {0x02DC,0x02DC,0x02DC}, {0x02DD,0x02DD,0x02DD},
425  {0x02DE,0x02DE,0x02DE}, {0x02DF,0x02DF,0x02DF},
426  {0x02E0,0x02E0,0x02E0}, {0x02E1,0x02E1,0x02E1},
427  {0x02E2,0x02E2,0x02E2}, {0x02E3,0x02E3,0x02E3},
428  {0x02E4,0x02E4,0x02E4}, {0x02E5,0x02E5,0x02E5},
429  {0x02E6,0x02E6,0x02E6}, {0x02E7,0x02E7,0x02E7},
430  {0x02E8,0x02E8,0x02E8}, {0x02E9,0x02E9,0x02E9},
431  {0x02EA,0x02EA,0x02EA}, {0x02EB,0x02EB,0x02EB},
432  {0x02EC,0x02EC,0x02EC}, {0x02ED,0x02ED,0x02ED},
433  {0x02EE,0x02EE,0x02EE}, {0x02EF,0x02EF,0x02EF},
434  {0x02F0,0x02F0,0x02F0}, {0x02F1,0x02F1,0x02F1},
435  {0x02F2,0x02F2,0x02F2}, {0x02F3,0x02F3,0x02F3},
436  {0x02F4,0x02F4,0x02F4}, {0x02F5,0x02F5,0x02F5},
437  {0x02F6,0x02F6,0x02F6}, {0x02F7,0x02F7,0x02F7},
438  {0x02F8,0x02F8,0x02F8}, {0x02F9,0x02F9,0x02F9},
439  {0x02FA,0x02FA,0x02FA}, {0x02FB,0x02FB,0x02FB},
440  {0x02FC,0x02FC,0x02FC}, {0x02FD,0x02FD,0x02FD},
441  {0x02FE,0x02FE,0x02FE}, {0x02FF,0x02FF,0x02FF}
442 };
443 
444 static MY_UNICASE_INFO plane03[]={
445  {0x0300,0x0300,0x0300}, {0x0301,0x0301,0x0301},
446  {0x0302,0x0302,0x0302}, {0x0303,0x0303,0x0303},
447  {0x0304,0x0304,0x0304}, {0x0305,0x0305,0x0305},
448  {0x0306,0x0306,0x0306}, {0x0307,0x0307,0x0307},
449  {0x0308,0x0308,0x0308}, {0x0309,0x0309,0x0309},
450  {0x030A,0x030A,0x030A}, {0x030B,0x030B,0x030B},
451  {0x030C,0x030C,0x030C}, {0x030D,0x030D,0x030D},
452  {0x030E,0x030E,0x030E}, {0x030F,0x030F,0x030F},
453  {0x0310,0x0310,0x0310}, {0x0311,0x0311,0x0311},
454  {0x0312,0x0312,0x0312}, {0x0313,0x0313,0x0313},
455  {0x0314,0x0314,0x0314}, {0x0315,0x0315,0x0315},
456  {0x0316,0x0316,0x0316}, {0x0317,0x0317,0x0317},
457  {0x0318,0x0318,0x0318}, {0x0319,0x0319,0x0319},
458  {0x031A,0x031A,0x031A}, {0x031B,0x031B,0x031B},
459  {0x031C,0x031C,0x031C}, {0x031D,0x031D,0x031D},
460  {0x031E,0x031E,0x031E}, {0x031F,0x031F,0x031F},
461  {0x0320,0x0320,0x0320}, {0x0321,0x0321,0x0321},
462  {0x0322,0x0322,0x0322}, {0x0323,0x0323,0x0323},
463  {0x0324,0x0324,0x0324}, {0x0325,0x0325,0x0325},
464  {0x0326,0x0326,0x0326}, {0x0327,0x0327,0x0327},
465  {0x0328,0x0328,0x0328}, {0x0329,0x0329,0x0329},
466  {0x032A,0x032A,0x032A}, {0x032B,0x032B,0x032B},
467  {0x032C,0x032C,0x032C}, {0x032D,0x032D,0x032D},
468  {0x032E,0x032E,0x032E}, {0x032F,0x032F,0x032F},
469  {0x0330,0x0330,0x0330}, {0x0331,0x0331,0x0331},
470  {0x0332,0x0332,0x0332}, {0x0333,0x0333,0x0333},
471  {0x0334,0x0334,0x0334}, {0x0335,0x0335,0x0335},
472  {0x0336,0x0336,0x0336}, {0x0337,0x0337,0x0337},
473  {0x0338,0x0338,0x0338}, {0x0339,0x0339,0x0339},
474  {0x033A,0x033A,0x033A}, {0x033B,0x033B,0x033B},
475  {0x033C,0x033C,0x033C}, {0x033D,0x033D,0x033D},
476  {0x033E,0x033E,0x033E}, {0x033F,0x033F,0x033F},
477  {0x0340,0x0340,0x0340}, {0x0341,0x0341,0x0341},
478  {0x0342,0x0342,0x0342}, {0x0343,0x0343,0x0343},
479  {0x0344,0x0344,0x0344}, {0x0399,0x0345,0x0399},
480  {0x0346,0x0346,0x0346}, {0x0347,0x0347,0x0347},
481  {0x0348,0x0348,0x0348}, {0x0349,0x0349,0x0349},
482  {0x034A,0x034A,0x034A}, {0x034B,0x034B,0x034B},
483  {0x034C,0x034C,0x034C}, {0x034D,0x034D,0x034D},
484  {0x034E,0x034E,0x034E}, {0x034F,0x034F,0x034F},
485  {0x0350,0x0350,0x0350}, {0x0351,0x0351,0x0351},
486  {0x0352,0x0352,0x0352}, {0x0353,0x0353,0x0353},
487  {0x0354,0x0354,0x0354}, {0x0355,0x0355,0x0355},
488  {0x0356,0x0356,0x0356}, {0x0357,0x0357,0x0357},
489  {0x0358,0x0358,0x0358}, {0x0359,0x0359,0x0359},
490  {0x035A,0x035A,0x035A}, {0x035B,0x035B,0x035B},
491  {0x035C,0x035C,0x035C}, {0x035D,0x035D,0x035D},
492  {0x035E,0x035E,0x035E}, {0x035F,0x035F,0x035F},
493  {0x0360,0x0360,0x0360}, {0x0361,0x0361,0x0361},
494  {0x0362,0x0362,0x0362}, {0x0363,0x0363,0x0363},
495  {0x0364,0x0364,0x0364}, {0x0365,0x0365,0x0365},
496  {0x0366,0x0366,0x0366}, {0x0367,0x0367,0x0367},
497  {0x0368,0x0368,0x0368}, {0x0369,0x0369,0x0369},
498  {0x036A,0x036A,0x036A}, {0x036B,0x036B,0x036B},
499  {0x036C,0x036C,0x036C}, {0x036D,0x036D,0x036D},
500  {0x036E,0x036E,0x036E}, {0x036F,0x036F,0x036F},
501  {0x0370,0x0370,0x0370}, {0x0371,0x0371,0x0371},
502  {0x0372,0x0372,0x0372}, {0x0373,0x0373,0x0373},
503  {0x0374,0x0374,0x0374}, {0x0375,0x0375,0x0375},
504  {0x0376,0x0376,0x0376}, {0x0377,0x0377,0x0377},
505  {0x0378,0x0378,0x0378}, {0x0379,0x0379,0x0379},
506  {0x037A,0x037A,0x037A}, {0x037B,0x037B,0x037B},
507  {0x037C,0x037C,0x037C}, {0x037D,0x037D,0x037D},
508  {0x037E,0x037E,0x037E}, {0x037F,0x037F,0x037F},
509  {0x0380,0x0380,0x0380}, {0x0381,0x0381,0x0381},
510  {0x0382,0x0382,0x0382}, {0x0383,0x0383,0x0383},
511  {0x0384,0x0384,0x0384}, {0x0385,0x0385,0x0385},
512  {0x0386,0x03AC,0x0391}, {0x0387,0x0387,0x0387},
513  {0x0388,0x03AD,0x0395}, {0x0389,0x03AE,0x0397},
514  {0x038A,0x03AF,0x0399}, {0x038B,0x038B,0x038B},
515  {0x038C,0x03CC,0x039F}, {0x038D,0x038D,0x038D},
516  {0x038E,0x03CD,0x03A5}, {0x038F,0x03CE,0x03A9},
517  {0x0390,0x0390,0x0399}, {0x0391,0x03B1,0x0391},
518  {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393},
519  {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395},
520  {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397},
521  {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399},
522  {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B},
523  {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D},
524  {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F},
525  {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1},
526  {0x03A2,0x03A2,0x03A2}, {0x03A3,0x03C3,0x03A3},
527  {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5},
528  {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7},
529  {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9},
530  {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5},
531  {0x0386,0x03AC,0x0391}, {0x0388,0x03AD,0x0395},
532  {0x0389,0x03AE,0x0397}, {0x038A,0x03AF,0x0399},
533  {0x03B0,0x03B0,0x03A5}, {0x0391,0x03B1,0x0391},
534  {0x0392,0x03B2,0x0392}, {0x0393,0x03B3,0x0393},
535  {0x0394,0x03B4,0x0394}, {0x0395,0x03B5,0x0395},
536  {0x0396,0x03B6,0x0396}, {0x0397,0x03B7,0x0397},
537  {0x0398,0x03B8,0x0398}, {0x0399,0x03B9,0x0399},
538  {0x039A,0x03BA,0x039A}, {0x039B,0x03BB,0x039B},
539  {0x039C,0x03BC,0x039C}, {0x039D,0x03BD,0x039D},
540  {0x039E,0x03BE,0x039E}, {0x039F,0x03BF,0x039F},
541  {0x03A0,0x03C0,0x03A0}, {0x03A1,0x03C1,0x03A1},
542  {0x03A3,0x03C2,0x03A3}, {0x03A3,0x03C3,0x03A3},
543  {0x03A4,0x03C4,0x03A4}, {0x03A5,0x03C5,0x03A5},
544  {0x03A6,0x03C6,0x03A6}, {0x03A7,0x03C7,0x03A7},
545  {0x03A8,0x03C8,0x03A8}, {0x03A9,0x03C9,0x03A9},
546  {0x03AA,0x03CA,0x0399}, {0x03AB,0x03CB,0x03A5},
547  {0x038C,0x03CC,0x039F}, {0x038E,0x03CD,0x03A5},
548  {0x038F,0x03CE,0x03A9}, {0x03CF,0x03CF,0x03CF},
549  {0x0392,0x03D0,0x0392}, {0x0398,0x03D1,0x0398},
550  {0x03D2,0x03D2,0x03D2}, {0x03D3,0x03D3,0x03D2},
551  {0x03D4,0x03D4,0x03D2}, {0x03A6,0x03D5,0x03A6},
552  {0x03A0,0x03D6,0x03A0}, {0x03D7,0x03D7,0x03D7},
553  {0x03D8,0x03D8,0x03D8}, {0x03D9,0x03D9,0x03D9},
554  {0x03DA,0x03DB,0x03DA}, {0x03DA,0x03DB,0x03DA},
555  {0x03DC,0x03DD,0x03DC}, {0x03DC,0x03DD,0x03DC},
556  {0x03DE,0x03DF,0x03DE}, {0x03DE,0x03DF,0x03DE},
557  {0x03E0,0x03E1,0x03E0}, {0x03E0,0x03E1,0x03E0},
558  {0x03E2,0x03E3,0x03E2}, {0x03E2,0x03E3,0x03E2},
559  {0x03E4,0x03E5,0x03E4}, {0x03E4,0x03E5,0x03E4},
560  {0x03E6,0x03E7,0x03E6}, {0x03E6,0x03E7,0x03E6},
561  {0x03E8,0x03E9,0x03E8}, {0x03E8,0x03E9,0x03E8},
562  {0x03EA,0x03EB,0x03EA}, {0x03EA,0x03EB,0x03EA},
563  {0x03EC,0x03ED,0x03EC}, {0x03EC,0x03ED,0x03EC},
564  {0x03EE,0x03EF,0x03EE}, {0x03EE,0x03EF,0x03EE},
565  {0x039A,0x03F0,0x039A}, {0x03A1,0x03F1,0x03A1},
566  {0x03A3,0x03F2,0x03A3}, {0x03F3,0x03F3,0x03F3},
567  {0x03F4,0x03F4,0x03F4}, {0x03F5,0x03F5,0x03F5},
568  {0x03F6,0x03F6,0x03F6}, {0x03F7,0x03F7,0x03F7},
569  {0x03F8,0x03F8,0x03F8}, {0x03F9,0x03F9,0x03F9},
570  {0x03FA,0x03FA,0x03FA}, {0x03FB,0x03FB,0x03FB},
571  {0x03FC,0x03FC,0x03FC}, {0x03FD,0x03FD,0x03FD},
572  {0x03FE,0x03FE,0x03FE}, {0x03FF,0x03FF,0x03FF}
573 };
574 
575 static MY_UNICASE_INFO plane04[]={
576  {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415},
577  {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413},
578  {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405},
579  {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406},
580  {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409},
581  {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B},
582  {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418},
583  {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F},
584  {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411},
585  {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413},
586  {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415},
587  {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417},
588  {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419},
589  {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B},
590  {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D},
591  {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F},
592  {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421},
593  {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423},
594  {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425},
595  {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427},
596  {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429},
597  {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B},
598  {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D},
599  {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F},
600  {0x0410,0x0430,0x0410}, {0x0411,0x0431,0x0411},
601  {0x0412,0x0432,0x0412}, {0x0413,0x0433,0x0413},
602  {0x0414,0x0434,0x0414}, {0x0415,0x0435,0x0415},
603  {0x0416,0x0436,0x0416}, {0x0417,0x0437,0x0417},
604  {0x0418,0x0438,0x0418}, {0x0419,0x0439,0x0419},
605  {0x041A,0x043A,0x041A}, {0x041B,0x043B,0x041B},
606  {0x041C,0x043C,0x041C}, {0x041D,0x043D,0x041D},
607  {0x041E,0x043E,0x041E}, {0x041F,0x043F,0x041F},
608  {0x0420,0x0440,0x0420}, {0x0421,0x0441,0x0421},
609  {0x0422,0x0442,0x0422}, {0x0423,0x0443,0x0423},
610  {0x0424,0x0444,0x0424}, {0x0425,0x0445,0x0425},
611  {0x0426,0x0446,0x0426}, {0x0427,0x0447,0x0427},
612  {0x0428,0x0448,0x0428}, {0x0429,0x0449,0x0429},
613  {0x042A,0x044A,0x042A}, {0x042B,0x044B,0x042B},
614  {0x042C,0x044C,0x042C}, {0x042D,0x044D,0x042D},
615  {0x042E,0x044E,0x042E}, {0x042F,0x044F,0x042F},
616  {0x0400,0x0450,0x0415}, {0x0401,0x0451,0x0415},
617  {0x0402,0x0452,0x0402}, {0x0403,0x0453,0x0413},
618  {0x0404,0x0454,0x0404}, {0x0405,0x0455,0x0405},
619  {0x0406,0x0456,0x0406}, {0x0407,0x0457,0x0406},
620  {0x0408,0x0458,0x0408}, {0x0409,0x0459,0x0409},
621  {0x040A,0x045A,0x040A}, {0x040B,0x045B,0x040B},
622  {0x040C,0x045C,0x041A}, {0x040D,0x045D,0x0418},
623  {0x040E,0x045E,0x0423}, {0x040F,0x045F,0x040F},
624  {0x0460,0x0461,0x0460}, {0x0460,0x0461,0x0460},
625  {0x0462,0x0463,0x0462}, {0x0462,0x0463,0x0462},
626  {0x0464,0x0465,0x0464}, {0x0464,0x0465,0x0464},
627  {0x0466,0x0467,0x0466}, {0x0466,0x0467,0x0466},
628  {0x0468,0x0469,0x0468}, {0x0468,0x0469,0x0468},
629  {0x046A,0x046B,0x046A}, {0x046A,0x046B,0x046A},
630  {0x046C,0x046D,0x046C}, {0x046C,0x046D,0x046C},
631  {0x046E,0x046F,0x046E}, {0x046E,0x046F,0x046E},
632  {0x0470,0x0471,0x0470}, {0x0470,0x0471,0x0470},
633  {0x0472,0x0473,0x0472}, {0x0472,0x0473,0x0472},
634  {0x0474,0x0475,0x0474}, {0x0474,0x0475,0x0474},
635  {0x0476,0x0477,0x0474}, {0x0476,0x0477,0x0474},
636  {0x0478,0x0479,0x0478}, {0x0478,0x0479,0x0478},
637  {0x047A,0x047B,0x047A}, {0x047A,0x047B,0x047A},
638  {0x047C,0x047D,0x047C}, {0x047C,0x047D,0x047C},
639  {0x047E,0x047F,0x047E}, {0x047E,0x047F,0x047E},
640  {0x0480,0x0481,0x0480}, {0x0480,0x0481,0x0480},
641  {0x0482,0x0482,0x0482}, {0x0483,0x0483,0x0483},
642  {0x0484,0x0484,0x0484}, {0x0485,0x0485,0x0485},
643  {0x0486,0x0486,0x0486}, {0x0487,0x0487,0x0487},
644  {0x0488,0x0488,0x0488}, {0x0489,0x0489,0x0489},
645  {0x048A,0x048A,0x048A}, {0x048B,0x048B,0x048B},
646  {0x048C,0x048D,0x048C}, {0x048C,0x048D,0x048C},
647  {0x048E,0x048F,0x048E}, {0x048E,0x048F,0x048E},
648  {0x0490,0x0491,0x0490}, {0x0490,0x0491,0x0490},
649  {0x0492,0x0493,0x0492}, {0x0492,0x0493,0x0492},
650  {0x0494,0x0495,0x0494}, {0x0494,0x0495,0x0494},
651  {0x0496,0x0497,0x0496}, {0x0496,0x0497,0x0496},
652  {0x0498,0x0499,0x0498}, {0x0498,0x0499,0x0498},
653  {0x049A,0x049B,0x049A}, {0x049A,0x049B,0x049A},
654  {0x049C,0x049D,0x049C}, {0x049C,0x049D,0x049C},
655  {0x049E,0x049F,0x049E}, {0x049E,0x049F,0x049E},
656  {0x04A0,0x04A1,0x04A0}, {0x04A0,0x04A1,0x04A0},
657  {0x04A2,0x04A3,0x04A2}, {0x04A2,0x04A3,0x04A2},
658  {0x04A4,0x04A5,0x04A4}, {0x04A4,0x04A5,0x04A4},
659  {0x04A6,0x04A7,0x04A6}, {0x04A6,0x04A7,0x04A6},
660  {0x04A8,0x04A9,0x04A8}, {0x04A8,0x04A9,0x04A8},
661  {0x04AA,0x04AB,0x04AA}, {0x04AA,0x04AB,0x04AA},
662  {0x04AC,0x04AD,0x04AC}, {0x04AC,0x04AD,0x04AC},
663  {0x04AE,0x04AF,0x04AE}, {0x04AE,0x04AF,0x04AE},
664  {0x04B0,0x04B1,0x04B0}, {0x04B0,0x04B1,0x04B0},
665  {0x04B2,0x04B3,0x04B2}, {0x04B2,0x04B3,0x04B2},
666  {0x04B4,0x04B5,0x04B4}, {0x04B4,0x04B5,0x04B4},
667  {0x04B6,0x04B7,0x04B6}, {0x04B6,0x04B7,0x04B6},
668  {0x04B8,0x04B9,0x04B8}, {0x04B8,0x04B9,0x04B8},
669  {0x04BA,0x04BB,0x04BA}, {0x04BA,0x04BB,0x04BA},
670  {0x04BC,0x04BD,0x04BC}, {0x04BC,0x04BD,0x04BC},
671  {0x04BE,0x04BF,0x04BE}, {0x04BE,0x04BF,0x04BE},
672  {0x04C0,0x04C0,0x04C0}, {0x04C1,0x04C2,0x0416},
673  {0x04C1,0x04C2,0x0416}, {0x04C3,0x04C4,0x04C3},
674  {0x04C3,0x04C4,0x04C3}, {0x04C5,0x04C5,0x04C5},
675  {0x04C6,0x04C6,0x04C6}, {0x04C7,0x04C8,0x04C7},
676  {0x04C7,0x04C8,0x04C7}, {0x04C9,0x04C9,0x04C9},
677  {0x04CA,0x04CA,0x04CA}, {0x04CB,0x04CC,0x04CB},
678  {0x04CB,0x04CC,0x04CB}, {0x04CD,0x04CD,0x04CD},
679  {0x04CE,0x04CE,0x04CE}, {0x04CF,0x04CF,0x04CF},
680  {0x04D0,0x04D1,0x0410}, {0x04D0,0x04D1,0x0410},
681  {0x04D2,0x04D3,0x0410}, {0x04D2,0x04D3,0x0410},
682  {0x04D4,0x04D5,0x04D4}, {0x04D4,0x04D5,0x04D4},
683  {0x04D6,0x04D7,0x0415}, {0x04D6,0x04D7,0x0415},
684  {0x04D8,0x04D9,0x04D8}, {0x04D8,0x04D9,0x04D8},
685  {0x04DA,0x04DB,0x04D8}, {0x04DA,0x04DB,0x04D8},
686  {0x04DC,0x04DD,0x0416}, {0x04DC,0x04DD,0x0416},
687  {0x04DE,0x04DF,0x0417}, {0x04DE,0x04DF,0x0417},
688  {0x04E0,0x04E1,0x04E0}, {0x04E0,0x04E1,0x04E0},
689  {0x04E2,0x04E3,0x0418}, {0x04E2,0x04E3,0x0418},
690  {0x04E4,0x04E5,0x0418}, {0x04E4,0x04E5,0x0418},
691  {0x04E6,0x04E7,0x041E}, {0x04E6,0x04E7,0x041E},
692  {0x04E8,0x04E9,0x04E8}, {0x04E8,0x04E9,0x04E8},
693  {0x04EA,0x04EB,0x04E8}, {0x04EA,0x04EB,0x04E8},
694  {0x04EC,0x04ED,0x042D}, {0x04EC,0x04ED,0x042D},
695  {0x04EE,0x04EF,0x0423}, {0x04EE,0x04EF,0x0423},
696  {0x04F0,0x04F1,0x0423}, {0x04F0,0x04F1,0x0423},
697  {0x04F2,0x04F3,0x0423}, {0x04F2,0x04F3,0x0423},
698  {0x04F4,0x04F5,0x0427}, {0x04F4,0x04F5,0x0427},
699  {0x04F6,0x04F6,0x04F6}, {0x04F7,0x04F7,0x04F7},
700  {0x04F8,0x04F9,0x042B}, {0x04F8,0x04F9,0x042B},
701  {0x04FA,0x04FA,0x04FA}, {0x04FB,0x04FB,0x04FB},
702  {0x04FC,0x04FC,0x04FC}, {0x04FD,0x04FD,0x04FD},
703  {0x04FE,0x04FE,0x04FE}, {0x04FF,0x04FF,0x04FF}
704 };
705 
706 static MY_UNICASE_INFO plane05[]={
707  {0x0500,0x0500,0x0500}, {0x0501,0x0501,0x0501},
708  {0x0502,0x0502,0x0502}, {0x0503,0x0503,0x0503},
709  {0x0504,0x0504,0x0504}, {0x0505,0x0505,0x0505},
710  {0x0506,0x0506,0x0506}, {0x0507,0x0507,0x0507},
711  {0x0508,0x0508,0x0508}, {0x0509,0x0509,0x0509},
712  {0x050A,0x050A,0x050A}, {0x050B,0x050B,0x050B},
713  {0x050C,0x050C,0x050C}, {0x050D,0x050D,0x050D},
714  {0x050E,0x050E,0x050E}, {0x050F,0x050F,0x050F},
715  {0x0510,0x0510,0x0510}, {0x0511,0x0511,0x0511},
716  {0x0512,0x0512,0x0512}, {0x0513,0x0513,0x0513},
717  {0x0514,0x0514,0x0514}, {0x0515,0x0515,0x0515},
718  {0x0516,0x0516,0x0516}, {0x0517,0x0517,0x0517},
719  {0x0518,0x0518,0x0518}, {0x0519,0x0519,0x0519},
720  {0x051A,0x051A,0x051A}, {0x051B,0x051B,0x051B},
721  {0x051C,0x051C,0x051C}, {0x051D,0x051D,0x051D},
722  {0x051E,0x051E,0x051E}, {0x051F,0x051F,0x051F},
723  {0x0520,0x0520,0x0520}, {0x0521,0x0521,0x0521},
724  {0x0522,0x0522,0x0522}, {0x0523,0x0523,0x0523},
725  {0x0524,0x0524,0x0524}, {0x0525,0x0525,0x0525},
726  {0x0526,0x0526,0x0526}, {0x0527,0x0527,0x0527},
727  {0x0528,0x0528,0x0528}, {0x0529,0x0529,0x0529},
728  {0x052A,0x052A,0x052A}, {0x052B,0x052B,0x052B},
729  {0x052C,0x052C,0x052C}, {0x052D,0x052D,0x052D},
730  {0x052E,0x052E,0x052E}, {0x052F,0x052F,0x052F},
731  {0x0530,0x0530,0x0530}, {0x0531,0x0561,0x0531},
732  {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533},
733  {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535},
734  {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537},
735  {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539},
736  {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B},
737  {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D},
738  {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F},
739  {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541},
740  {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543},
741  {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545},
742  {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547},
743  {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549},
744  {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B},
745  {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D},
746  {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F},
747  {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551},
748  {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553},
749  {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555},
750  {0x0556,0x0586,0x0556}, {0x0557,0x0557,0x0557},
751  {0x0558,0x0558,0x0558}, {0x0559,0x0559,0x0559},
752  {0x055A,0x055A,0x055A}, {0x055B,0x055B,0x055B},
753  {0x055C,0x055C,0x055C}, {0x055D,0x055D,0x055D},
754  {0x055E,0x055E,0x055E}, {0x055F,0x055F,0x055F},
755  {0x0560,0x0560,0x0560}, {0x0531,0x0561,0x0531},
756  {0x0532,0x0562,0x0532}, {0x0533,0x0563,0x0533},
757  {0x0534,0x0564,0x0534}, {0x0535,0x0565,0x0535},
758  {0x0536,0x0566,0x0536}, {0x0537,0x0567,0x0537},
759  {0x0538,0x0568,0x0538}, {0x0539,0x0569,0x0539},
760  {0x053A,0x056A,0x053A}, {0x053B,0x056B,0x053B},
761  {0x053C,0x056C,0x053C}, {0x053D,0x056D,0x053D},
762  {0x053E,0x056E,0x053E}, {0x053F,0x056F,0x053F},
763  {0x0540,0x0570,0x0540}, {0x0541,0x0571,0x0541},
764  {0x0542,0x0572,0x0542}, {0x0543,0x0573,0x0543},
765  {0x0544,0x0574,0x0544}, {0x0545,0x0575,0x0545},
766  {0x0546,0x0576,0x0546}, {0x0547,0x0577,0x0547},
767  {0x0548,0x0578,0x0548}, {0x0549,0x0579,0x0549},
768  {0x054A,0x057A,0x054A}, {0x054B,0x057B,0x054B},
769  {0x054C,0x057C,0x054C}, {0x054D,0x057D,0x054D},
770  {0x054E,0x057E,0x054E}, {0x054F,0x057F,0x054F},
771  {0x0550,0x0580,0x0550}, {0x0551,0x0581,0x0551},
772  {0x0552,0x0582,0x0552}, {0x0553,0x0583,0x0553},
773  {0x0554,0x0584,0x0554}, {0x0555,0x0585,0x0555},
774  {0x0556,0x0586,0x0556}, {0x0587,0x0587,0x0587},
775  {0x0588,0x0588,0x0588}, {0x0589,0x0589,0x0589},
776  {0x058A,0x058A,0x058A}, {0x058B,0x058B,0x058B},
777  {0x058C,0x058C,0x058C}, {0x058D,0x058D,0x058D},
778  {0x058E,0x058E,0x058E}, {0x058F,0x058F,0x058F},
779  {0x0590,0x0590,0x0590}, {0x0591,0x0591,0x0591},
780  {0x0592,0x0592,0x0592}, {0x0593,0x0593,0x0593},
781  {0x0594,0x0594,0x0594}, {0x0595,0x0595,0x0595},
782  {0x0596,0x0596,0x0596}, {0x0597,0x0597,0x0597},
783  {0x0598,0x0598,0x0598}, {0x0599,0x0599,0x0599},
784  {0x059A,0x059A,0x059A}, {0x059B,0x059B,0x059B},
785  {0x059C,0x059C,0x059C}, {0x059D,0x059D,0x059D},
786  {0x059E,0x059E,0x059E}, {0x059F,0x059F,0x059F},
787  {0x05A0,0x05A0,0x05A0}, {0x05A1,0x05A1,0x05A1},
788  {0x05A2,0x05A2,0x05A2}, {0x05A3,0x05A3,0x05A3},
789  {0x05A4,0x05A4,0x05A4}, {0x05A5,0x05A5,0x05A5},
790  {0x05A6,0x05A6,0x05A6}, {0x05A7,0x05A7,0x05A7},
791  {0x05A8,0x05A8,0x05A8}, {0x05A9,0x05A9,0x05A9},
792  {0x05AA,0x05AA,0x05AA}, {0x05AB,0x05AB,0x05AB},
793  {0x05AC,0x05AC,0x05AC}, {0x05AD,0x05AD,0x05AD},
794  {0x05AE,0x05AE,0x05AE}, {0x05AF,0x05AF,0x05AF},
795  {0x05B0,0x05B0,0x05B0}, {0x05B1,0x05B1,0x05B1},
796  {0x05B2,0x05B2,0x05B2}, {0x05B3,0x05B3,0x05B3},
797  {0x05B4,0x05B4,0x05B4}, {0x05B5,0x05B5,0x05B5},
798  {0x05B6,0x05B6,0x05B6}, {0x05B7,0x05B7,0x05B7},
799  {0x05B8,0x05B8,0x05B8}, {0x05B9,0x05B9,0x05B9},
800  {0x05BA,0x05BA,0x05BA}, {0x05BB,0x05BB,0x05BB},
801  {0x05BC,0x05BC,0x05BC}, {0x05BD,0x05BD,0x05BD},
802  {0x05BE,0x05BE,0x05BE}, {0x05BF,0x05BF,0x05BF},
803  {0x05C0,0x05C0,0x05C0}, {0x05C1,0x05C1,0x05C1},
804  {0x05C2,0x05C2,0x05C2}, {0x05C3,0x05C3,0x05C3},
805  {0x05C4,0x05C4,0x05C4}, {0x05C5,0x05C5,0x05C5},
806  {0x05C6,0x05C6,0x05C6}, {0x05C7,0x05C7,0x05C7},
807  {0x05C8,0x05C8,0x05C8}, {0x05C9,0x05C9,0x05C9},
808  {0x05CA,0x05CA,0x05CA}, {0x05CB,0x05CB,0x05CB},
809  {0x05CC,0x05CC,0x05CC}, {0x05CD,0x05CD,0x05CD},
810  {0x05CE,0x05CE,0x05CE}, {0x05CF,0x05CF,0x05CF},
811  {0x05D0,0x05D0,0x05D0}, {0x05D1,0x05D1,0x05D1},
812  {0x05D2,0x05D2,0x05D2}, {0x05D3,0x05D3,0x05D3},
813  {0x05D4,0x05D4,0x05D4}, {0x05D5,0x05D5,0x05D5},
814  {0x05D6,0x05D6,0x05D6}, {0x05D7,0x05D7,0x05D7},
815  {0x05D8,0x05D8,0x05D8}, {0x05D9,0x05D9,0x05D9},
816  {0x05DA,0x05DA,0x05DA}, {0x05DB,0x05DB,0x05DB},
817  {0x05DC,0x05DC,0x05DC}, {0x05DD,0x05DD,0x05DD},
818  {0x05DE,0x05DE,0x05DE}, {0x05DF,0x05DF,0x05DF},
819  {0x05E0,0x05E0,0x05E0}, {0x05E1,0x05E1,0x05E1},
820  {0x05E2,0x05E2,0x05E2}, {0x05E3,0x05E3,0x05E3},
821  {0x05E4,0x05E4,0x05E4}, {0x05E5,0x05E5,0x05E5},
822  {0x05E6,0x05E6,0x05E6}, {0x05E7,0x05E7,0x05E7},
823  {0x05E8,0x05E8,0x05E8}, {0x05E9,0x05E9,0x05E9},
824  {0x05EA,0x05EA,0x05EA}, {0x05EB,0x05EB,0x05EB},
825  {0x05EC,0x05EC,0x05EC}, {0x05ED,0x05ED,0x05ED},
826  {0x05EE,0x05EE,0x05EE}, {0x05EF,0x05EF,0x05EF},
827  {0x05F0,0x05F0,0x05F0}, {0x05F1,0x05F1,0x05F1},
828  {0x05F2,0x05F2,0x05F2}, {0x05F3,0x05F3,0x05F3},
829  {0x05F4,0x05F4,0x05F4}, {0x05F5,0x05F5,0x05F5},
830  {0x05F6,0x05F6,0x05F6}, {0x05F7,0x05F7,0x05F7},
831  {0x05F8,0x05F8,0x05F8}, {0x05F9,0x05F9,0x05F9},
832  {0x05FA,0x05FA,0x05FA}, {0x05FB,0x05FB,0x05FB},
833  {0x05FC,0x05FC,0x05FC}, {0x05FD,0x05FD,0x05FD},
834  {0x05FE,0x05FE,0x05FE}, {0x05FF,0x05FF,0x05FF}
835 };
836 
837 static MY_UNICASE_INFO plane1E[]={
838  {0x1E00,0x1E01,0x0041}, {0x1E00,0x1E01,0x0041},
839  {0x1E02,0x1E03,0x0042}, {0x1E02,0x1E03,0x0042},
840  {0x1E04,0x1E05,0x0042}, {0x1E04,0x1E05,0x0042},
841  {0x1E06,0x1E07,0x0042}, {0x1E06,0x1E07,0x0042},
842  {0x1E08,0x1E09,0x0043}, {0x1E08,0x1E09,0x0043},
843  {0x1E0A,0x1E0B,0x0044}, {0x1E0A,0x1E0B,0x0044},
844  {0x1E0C,0x1E0D,0x0044}, {0x1E0C,0x1E0D,0x0044},
845  {0x1E0E,0x1E0F,0x0044}, {0x1E0E,0x1E0F,0x0044},
846  {0x1E10,0x1E11,0x0044}, {0x1E10,0x1E11,0x0044},
847  {0x1E12,0x1E13,0x0044}, {0x1E12,0x1E13,0x0044},
848  {0x1E14,0x1E15,0x0045}, {0x1E14,0x1E15,0x0045},
849  {0x1E16,0x1E17,0x0045}, {0x1E16,0x1E17,0x0045},
850  {0x1E18,0x1E19,0x0045}, {0x1E18,0x1E19,0x0045},
851  {0x1E1A,0x1E1B,0x0045}, {0x1E1A,0x1E1B,0x0045},
852  {0x1E1C,0x1E1D,0x0045}, {0x1E1C,0x1E1D,0x0045},
853  {0x1E1E,0x1E1F,0x0046}, {0x1E1E,0x1E1F,0x0046},
854  {0x1E20,0x1E21,0x0047}, {0x1E20,0x1E21,0x0047},
855  {0x1E22,0x1E23,0x0048}, {0x1E22,0x1E23,0x0048},
856  {0x1E24,0x1E25,0x0048}, {0x1E24,0x1E25,0x0048},
857  {0x1E26,0x1E27,0x0048}, {0x1E26,0x1E27,0x0048},
858  {0x1E28,0x1E29,0x0048}, {0x1E28,0x1E29,0x0048},
859  {0x1E2A,0x1E2B,0x0048}, {0x1E2A,0x1E2B,0x0048},
860  {0x1E2C,0x1E2D,0x0049}, {0x1E2C,0x1E2D,0x0049},
861  {0x1E2E,0x1E2F,0x0049}, {0x1E2E,0x1E2F,0x0049},
862  {0x1E30,0x1E31,0x004B}, {0x1E30,0x1E31,0x004B},
863  {0x1E32,0x1E33,0x004B}, {0x1E32,0x1E33,0x004B},
864  {0x1E34,0x1E35,0x004B}, {0x1E34,0x1E35,0x004B},
865  {0x1E36,0x1E37,0x004C}, {0x1E36,0x1E37,0x004C},
866  {0x1E38,0x1E39,0x004C}, {0x1E38,0x1E39,0x004C},
867  {0x1E3A,0x1E3B,0x004C}, {0x1E3A,0x1E3B,0x004C},
868  {0x1E3C,0x1E3D,0x004C}, {0x1E3C,0x1E3D,0x004C},
869  {0x1E3E,0x1E3F,0x004D}, {0x1E3E,0x1E3F,0x004D},
870  {0x1E40,0x1E41,0x004D}, {0x1E40,0x1E41,0x004D},
871  {0x1E42,0x1E43,0x004D}, {0x1E42,0x1E43,0x004D},
872  {0x1E44,0x1E45,0x004E}, {0x1E44,0x1E45,0x004E},
873  {0x1E46,0x1E47,0x004E}, {0x1E46,0x1E47,0x004E},
874  {0x1E48,0x1E49,0x004E}, {0x1E48,0x1E49,0x004E},
875  {0x1E4A,0x1E4B,0x004E}, {0x1E4A,0x1E4B,0x004E},
876  {0x1E4C,0x1E4D,0x004F}, {0x1E4C,0x1E4D,0x004F},
877  {0x1E4E,0x1E4F,0x004F}, {0x1E4E,0x1E4F,0x004F},
878  {0x1E50,0x1E51,0x004F}, {0x1E50,0x1E51,0x004F},
879  {0x1E52,0x1E53,0x004F}, {0x1E52,0x1E53,0x004F},
880  {0x1E54,0x1E55,0x0050}, {0x1E54,0x1E55,0x0050},
881  {0x1E56,0x1E57,0x0050}, {0x1E56,0x1E57,0x0050},
882  {0x1E58,0x1E59,0x0052}, {0x1E58,0x1E59,0x0052},
883  {0x1E5A,0x1E5B,0x0052}, {0x1E5A,0x1E5B,0x0052},
884  {0x1E5C,0x1E5D,0x0052}, {0x1E5C,0x1E5D,0x0052},
885  {0x1E5E,0x1E5F,0x0052}, {0x1E5E,0x1E5F,0x0052},
886  {0x1E60,0x1E61,0x0053}, {0x1E60,0x1E61,0x0053},
887  {0x1E62,0x1E63,0x0053}, {0x1E62,0x1E63,0x0053},
888  {0x1E64,0x1E65,0x0053}, {0x1E64,0x1E65,0x0053},
889  {0x1E66,0x1E67,0x0053}, {0x1E66,0x1E67,0x0053},
890  {0x1E68,0x1E69,0x0053}, {0x1E68,0x1E69,0x0053},
891  {0x1E6A,0x1E6B,0x0054}, {0x1E6A,0x1E6B,0x0054},
892  {0x1E6C,0x1E6D,0x0054}, {0x1E6C,0x1E6D,0x0054},
893  {0x1E6E,0x1E6F,0x0054}, {0x1E6E,0x1E6F,0x0054},
894  {0x1E70,0x1E71,0x0054}, {0x1E70,0x1E71,0x0054},
895  {0x1E72,0x1E73,0x0055}, {0x1E72,0x1E73,0x0055},
896  {0x1E74,0x1E75,0x0055}, {0x1E74,0x1E75,0x0055},
897  {0x1E76,0x1E77,0x0055}, {0x1E76,0x1E77,0x0055},
898  {0x1E78,0x1E79,0x0055}, {0x1E78,0x1E79,0x0055},
899  {0x1E7A,0x1E7B,0x0055}, {0x1E7A,0x1E7B,0x0055},
900  {0x1E7C,0x1E7D,0x0056}, {0x1E7C,0x1E7D,0x0056},
901  {0x1E7E,0x1E7F,0x0056}, {0x1E7E,0x1E7F,0x0056},
902  {0x1E80,0x1E81,0x0057}, {0x1E80,0x1E81,0x0057},
903  {0x1E82,0x1E83,0x0057}, {0x1E82,0x1E83,0x0057},
904  {0x1E84,0x1E85,0x0057}, {0x1E84,0x1E85,0x0057},
905  {0x1E86,0x1E87,0x0057}, {0x1E86,0x1E87,0x0057},
906  {0x1E88,0x1E89,0x0057}, {0x1E88,0x1E89,0x0057},
907  {0x1E8A,0x1E8B,0x0058}, {0x1E8A,0x1E8B,0x0058},
908  {0x1E8C,0x1E8D,0x0058}, {0x1E8C,0x1E8D,0x0058},
909  {0x1E8E,0x1E8F,0x0059}, {0x1E8E,0x1E8F,0x0059},
910  {0x1E90,0x1E91,0x005A}, {0x1E90,0x1E91,0x005A},
911  {0x1E92,0x1E93,0x005A}, {0x1E92,0x1E93,0x005A},
912  {0x1E94,0x1E95,0x005A}, {0x1E94,0x1E95,0x005A},
913  {0x1E96,0x1E96,0x0048}, {0x1E97,0x1E97,0x0054},
914  {0x1E98,0x1E98,0x0057}, {0x1E99,0x1E99,0x0059},
915  {0x1E9A,0x1E9A,0x1E9A}, {0x1E60,0x1E9B,0x0053},
916  {0x1E9C,0x1E9C,0x1E9C}, {0x1E9D,0x1E9D,0x1E9D},
917  {0x1E9E,0x1E9E,0x1E9E}, {0x1E9F,0x1E9F,0x1E9F},
918  {0x1EA0,0x1EA1,0x0041}, {0x1EA0,0x1EA1,0x0041},
919  {0x1EA2,0x1EA3,0x0041}, {0x1EA2,0x1EA3,0x0041},
920  {0x1EA4,0x1EA5,0x0041}, {0x1EA4,0x1EA5,0x0041},
921  {0x1EA6,0x1EA7,0x0041}, {0x1EA6,0x1EA7,0x0041},
922  {0x1EA8,0x1EA9,0x0041}, {0x1EA8,0x1EA9,0x0041},
923  {0x1EAA,0x1EAB,0x0041}, {0x1EAA,0x1EAB,0x0041},
924  {0x1EAC,0x1EAD,0x0041}, {0x1EAC,0x1EAD,0x0041},
925  {0x1EAE,0x1EAF,0x0041}, {0x1EAE,0x1EAF,0x0041},
926  {0x1EB0,0x1EB1,0x0041}, {0x1EB0,0x1EB1,0x0041},
927  {0x1EB2,0x1EB3,0x0041}, {0x1EB2,0x1EB3,0x0041},
928  {0x1EB4,0x1EB5,0x0041}, {0x1EB4,0x1EB5,0x0041},
929  {0x1EB6,0x1EB7,0x0041}, {0x1EB6,0x1EB7,0x0041},
930  {0x1EB8,0x1EB9,0x0045}, {0x1EB8,0x1EB9,0x0045},
931  {0x1EBA,0x1EBB,0x0045}, {0x1EBA,0x1EBB,0x0045},
932  {0x1EBC,0x1EBD,0x0045}, {0x1EBC,0x1EBD,0x0045},
933  {0x1EBE,0x1EBF,0x0045}, {0x1EBE,0x1EBF,0x0045},
934  {0x1EC0,0x1EC1,0x0045}, {0x1EC0,0x1EC1,0x0045},
935  {0x1EC2,0x1EC3,0x0045}, {0x1EC2,0x1EC3,0x0045},
936  {0x1EC4,0x1EC5,0x0045}, {0x1EC4,0x1EC5,0x0045},
937  {0x1EC6,0x1EC7,0x0045}, {0x1EC6,0x1EC7,0x0045},
938  {0x1EC8,0x1EC9,0x0049}, {0x1EC8,0x1EC9,0x0049},
939  {0x1ECA,0x1ECB,0x0049}, {0x1ECA,0x1ECB,0x0049},
940  {0x1ECC,0x1ECD,0x004F}, {0x1ECC,0x1ECD,0x004F},
941  {0x1ECE,0x1ECF,0x004F}, {0x1ECE,0x1ECF,0x004F},
942  {0x1ED0,0x1ED1,0x004F}, {0x1ED0,0x1ED1,0x004F},
943  {0x1ED2,0x1ED3,0x004F}, {0x1ED2,0x1ED3,0x004F},
944  {0x1ED4,0x1ED5,0x004F}, {0x1ED4,0x1ED5,0x004F},
945  {0x1ED6,0x1ED7,0x004F}, {0x1ED6,0x1ED7,0x004F},
946  {0x1ED8,0x1ED9,0x004F}, {0x1ED8,0x1ED9,0x004F},
947  {0x1EDA,0x1EDB,0x004F}, {0x1EDA,0x1EDB,0x004F},
948  {0x1EDC,0x1EDD,0x004F}, {0x1EDC,0x1EDD,0x004F},
949  {0x1EDE,0x1EDF,0x004F}, {0x1EDE,0x1EDF,0x004F},
950  {0x1EE0,0x1EE1,0x004F}, {0x1EE0,0x1EE1,0x004F},
951  {0x1EE2,0x1EE3,0x004F}, {0x1EE2,0x1EE3,0x004F},
952  {0x1EE4,0x1EE5,0x0055}, {0x1EE4,0x1EE5,0x0055},
953  {0x1EE6,0x1EE7,0x0055}, {0x1EE6,0x1EE7,0x0055},
954  {0x1EE8,0x1EE9,0x0055}, {0x1EE8,0x1EE9,0x0055},
955  {0x1EEA,0x1EEB,0x0055}, {0x1EEA,0x1EEB,0x0055},
956  {0x1EEC,0x1EED,0x0055}, {0x1EEC,0x1EED,0x0055},
957  {0x1EEE,0x1EEF,0x0055}, {0x1EEE,0x1EEF,0x0055},
958  {0x1EF0,0x1EF1,0x0055}, {0x1EF0,0x1EF1,0x0055},
959  {0x1EF2,0x1EF3,0x0059}, {0x1EF2,0x1EF3,0x0059},
960  {0x1EF4,0x1EF5,0x0059}, {0x1EF4,0x1EF5,0x0059},
961  {0x1EF6,0x1EF7,0x0059}, {0x1EF6,0x1EF7,0x0059},
962  {0x1EF8,0x1EF9,0x0059}, {0x1EF8,0x1EF9,0x0059},
963  {0x1EFA,0x1EFA,0x1EFA}, {0x1EFB,0x1EFB,0x1EFB},
964  {0x1EFC,0x1EFC,0x1EFC}, {0x1EFD,0x1EFD,0x1EFD},
965  {0x1EFE,0x1EFE,0x1EFE}, {0x1EFF,0x1EFF,0x1EFF}
966 };
967 
968 static MY_UNICASE_INFO plane1F[]={
969  {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391},
970  {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391},
971  {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391},
972  {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391},
973  {0x1F08,0x1F00,0x0391}, {0x1F09,0x1F01,0x0391},
974  {0x1F0A,0x1F02,0x0391}, {0x1F0B,0x1F03,0x0391},
975  {0x1F0C,0x1F04,0x0391}, {0x1F0D,0x1F05,0x0391},
976  {0x1F0E,0x1F06,0x0391}, {0x1F0F,0x1F07,0x0391},
977  {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395},
978  {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395},
979  {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395},
980  {0x1F16,0x1F16,0x1F16}, {0x1F17,0x1F17,0x1F17},
981  {0x1F18,0x1F10,0x0395}, {0x1F19,0x1F11,0x0395},
982  {0x1F1A,0x1F12,0x0395}, {0x1F1B,0x1F13,0x0395},
983  {0x1F1C,0x1F14,0x0395}, {0x1F1D,0x1F15,0x0395},
984  {0x1F1E,0x1F1E,0x1F1E}, {0x1F1F,0x1F1F,0x1F1F},
985  {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397},
986  {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397},
987  {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397},
988  {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397},
989  {0x1F28,0x1F20,0x0397}, {0x1F29,0x1F21,0x0397},
990  {0x1F2A,0x1F22,0x0397}, {0x1F2B,0x1F23,0x0397},
991  {0x1F2C,0x1F24,0x0397}, {0x1F2D,0x1F25,0x0397},
992  {0x1F2E,0x1F26,0x0397}, {0x1F2F,0x1F27,0x0397},
993  {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399},
994  {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399},
995  {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399},
996  {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399},
997  {0x1F38,0x1F30,0x0399}, {0x1F39,0x1F31,0x0399},
998  {0x1F3A,0x1F32,0x0399}, {0x1F3B,0x1F33,0x0399},
999  {0x1F3C,0x1F34,0x0399}, {0x1F3D,0x1F35,0x0399},
1000  {0x1F3E,0x1F36,0x0399}, {0x1F3F,0x1F37,0x0399},
1001  {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F},
1002  {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F},
1003  {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F},
1004  {0x1F46,0x1F46,0x1F46}, {0x1F47,0x1F47,0x1F47},
1005  {0x1F48,0x1F40,0x039F}, {0x1F49,0x1F41,0x039F},
1006  {0x1F4A,0x1F42,0x039F}, {0x1F4B,0x1F43,0x039F},
1007  {0x1F4C,0x1F44,0x039F}, {0x1F4D,0x1F45,0x039F},
1008  {0x1F4E,0x1F4E,0x1F4E}, {0x1F4F,0x1F4F,0x1F4F},
1009  {0x1F50,0x1F50,0x03A5}, {0x1F59,0x1F51,0x03A5},
1010  {0x1F52,0x1F52,0x03A5}, {0x1F5B,0x1F53,0x03A5},
1011  {0x1F54,0x1F54,0x03A5}, {0x1F5D,0x1F55,0x03A5},
1012  {0x1F56,0x1F56,0x03A5}, {0x1F5F,0x1F57,0x03A5},
1013  {0x1F58,0x1F58,0x1F58}, {0x1F59,0x1F51,0x03A5},
1014  {0x1F5A,0x1F5A,0x1F5A}, {0x1F5B,0x1F53,0x03A5},
1015  {0x1F5C,0x1F5C,0x1F5C}, {0x1F5D,0x1F55,0x03A5},
1016  {0x1F5E,0x1F5E,0x1F5E}, {0x1F5F,0x1F57,0x03A5},
1017  {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9},
1018  {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9},
1019  {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9},
1020  {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9},
1021  {0x1F68,0x1F60,0x03A9}, {0x1F69,0x1F61,0x03A9},
1022  {0x1F6A,0x1F62,0x03A9}, {0x1F6B,0x1F63,0x03A9},
1023  {0x1F6C,0x1F64,0x03A9}, {0x1F6D,0x1F65,0x03A9},
1024  {0x1F6E,0x1F66,0x03A9}, {0x1F6F,0x1F67,0x03A9},
1025  {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB},
1026  {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9},
1027  {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB},
1028  {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB},
1029  {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9},
1030  {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB},
1031  {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB},
1032  {0x1F7E,0x1F7E,0x1F7E}, {0x1F7F,0x1F7F,0x1F7F},
1033  {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391},
1034  {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391},
1035  {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391},
1036  {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391},
1037  {0x1F88,0x1F80,0x0391}, {0x1F89,0x1F81,0x0391},
1038  {0x1F8A,0x1F82,0x0391}, {0x1F8B,0x1F83,0x0391},
1039  {0x1F8C,0x1F84,0x0391}, {0x1F8D,0x1F85,0x0391},
1040  {0x1F8E,0x1F86,0x0391}, {0x1F8F,0x1F87,0x0391},
1041  {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397},
1042  {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397},
1043  {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397},
1044  {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397},
1045  {0x1F98,0x1F90,0x0397}, {0x1F99,0x1F91,0x0397},
1046  {0x1F9A,0x1F92,0x0397}, {0x1F9B,0x1F93,0x0397},
1047  {0x1F9C,0x1F94,0x0397}, {0x1F9D,0x1F95,0x0397},
1048  {0x1F9E,0x1F96,0x0397}, {0x1F9F,0x1F97,0x0397},
1049  {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9},
1050  {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9},
1051  {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9},
1052  {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9},
1053  {0x1FA8,0x1FA0,0x03A9}, {0x1FA9,0x1FA1,0x03A9},
1054  {0x1FAA,0x1FA2,0x03A9}, {0x1FAB,0x1FA3,0x03A9},
1055  {0x1FAC,0x1FA4,0x03A9}, {0x1FAD,0x1FA5,0x03A9},
1056  {0x1FAE,0x1FA6,0x03A9}, {0x1FAF,0x1FA7,0x03A9},
1057  {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391},
1058  {0x1FB2,0x1FB2,0x0391}, {0x1FBC,0x1FB3,0x0391},
1059  {0x1FB4,0x1FB4,0x0391}, {0x1FB5,0x1FB5,0x1FB5},
1060  {0x1FB6,0x1FB6,0x0391}, {0x1FB7,0x1FB7,0x0391},
1061  {0x1FB8,0x1FB0,0x0391}, {0x1FB9,0x1FB1,0x0391},
1062  {0x1FBA,0x1F70,0x0391}, {0x1FBB,0x1F71,0x1FBB},
1063  {0x1FBC,0x1FB3,0x0391}, {0x1FBD,0x1FBD,0x1FBD},
1064  {0x0399,0x1FBE,0x0399}, {0x1FBF,0x1FBF,0x1FBF},
1065  {0x1FC0,0x1FC0,0x1FC0}, {0x1FC1,0x1FC1,0x1FC1},
1066  {0x1FC2,0x1FC2,0x0397}, {0x1FCC,0x1FC3,0x0397},
1067  {0x1FC4,0x1FC4,0x0397}, {0x1FC5,0x1FC5,0x1FC5},
1068  {0x1FC6,0x1FC6,0x0397}, {0x1FC7,0x1FC7,0x0397},
1069  {0x1FC8,0x1F72,0x0395}, {0x1FC9,0x1F73,0x1FC9},
1070  {0x1FCA,0x1F74,0x0397}, {0x1FCB,0x1F75,0x1FCB},
1071  {0x1FCC,0x1FC3,0x0397}, {0x1FCD,0x1FCD,0x1FCD},
1072  {0x1FCE,0x1FCE,0x1FCE}, {0x1FCF,0x1FCF,0x1FCF},
1073  {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399},
1074  {0x1FD2,0x1FD2,0x0399}, {0x1FD3,0x1FD3,0x1FD3},
1075  {0x1FD4,0x1FD4,0x1FD4}, {0x1FD5,0x1FD5,0x1FD5},
1076  {0x1FD6,0x1FD6,0x0399}, {0x1FD7,0x1FD7,0x0399},
1077  {0x1FD8,0x1FD0,0x0399}, {0x1FD9,0x1FD1,0x0399},
1078  {0x1FDA,0x1F76,0x0399}, {0x1FDB,0x1F77,0x1FDB},
1079  {0x1FDC,0x1FDC,0x1FDC}, {0x1FDD,0x1FDD,0x1FDD},
1080  {0x1FDE,0x1FDE,0x1FDE}, {0x1FDF,0x1FDF,0x1FDF},
1081  {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5},
1082  {0x1FE2,0x1FE2,0x03A5}, {0x1FE3,0x1FE3,0x1FE3},
1083  {0x1FE4,0x1FE4,0x03A1}, {0x1FEC,0x1FE5,0x03A1},
1084  {0x1FE6,0x1FE6,0x03A5}, {0x1FE7,0x1FE7,0x03A5},
1085  {0x1FE8,0x1FE0,0x03A5}, {0x1FE9,0x1FE1,0x03A5},
1086  {0x1FEA,0x1F7A,0x03A5}, {0x1FEB,0x1F7B,0x1FEB},
1087  {0x1FEC,0x1FE5,0x03A1}, {0x1FED,0x1FED,0x1FED},
1088  {0x1FEE,0x1FEE,0x1FEE}, {0x1FEF,0x1FEF,0x1FEF},
1089  {0x1FF0,0x1FF0,0x1FF0}, {0x1FF1,0x1FF1,0x1FF1},
1090  {0x1FF2,0x1FF2,0x03A9}, {0x1FFC,0x1FF3,0x03A9},
1091  {0x1FF4,0x1FF4,0x03A9}, {0x1FF5,0x1FF5,0x1FF5},
1092  {0x1FF6,0x1FF6,0x03A9}, {0x1FF7,0x1FF7,0x03A9},
1093  {0x1FF8,0x1F78,0x039F}, {0x1FF9,0x1F79,0x1FF9},
1094  {0x1FFA,0x1F7C,0x03A9}, {0x1FFB,0x1F7D,0x1FFB},
1095  {0x1FFC,0x1FF3,0x03A9}, {0x1FFD,0x1FFD,0x1FFD},
1096  {0x1FFE,0x1FFE,0x1FFE}, {0x1FFF,0x1FFF,0x1FFF}
1097 };
1098 
1099 static MY_UNICASE_INFO plane21[]={
1100  {0x2100,0x2100,0x2100}, {0x2101,0x2101,0x2101},
1101  {0x2102,0x2102,0x2102}, {0x2103,0x2103,0x2103},
1102  {0x2104,0x2104,0x2104}, {0x2105,0x2105,0x2105},
1103  {0x2106,0x2106,0x2106}, {0x2107,0x2107,0x2107},
1104  {0x2108,0x2108,0x2108}, {0x2109,0x2109,0x2109},
1105  {0x210A,0x210A,0x210A}, {0x210B,0x210B,0x210B},
1106  {0x210C,0x210C,0x210C}, {0x210D,0x210D,0x210D},
1107  {0x210E,0x210E,0x210E}, {0x210F,0x210F,0x210F},
1108  {0x2110,0x2110,0x2110}, {0x2111,0x2111,0x2111},
1109  {0x2112,0x2112,0x2112}, {0x2113,0x2113,0x2113},
1110  {0x2114,0x2114,0x2114}, {0x2115,0x2115,0x2115},
1111  {0x2116,0x2116,0x2116}, {0x2117,0x2117,0x2117},
1112  {0x2118,0x2118,0x2118}, {0x2119,0x2119,0x2119},
1113  {0x211A,0x211A,0x211A}, {0x211B,0x211B,0x211B},
1114  {0x211C,0x211C,0x211C}, {0x211D,0x211D,0x211D},
1115  {0x211E,0x211E,0x211E}, {0x211F,0x211F,0x211F},
1116  {0x2120,0x2120,0x2120}, {0x2121,0x2121,0x2121},
1117  {0x2122,0x2122,0x2122}, {0x2123,0x2123,0x2123},
1118  {0x2124,0x2124,0x2124}, {0x2125,0x2125,0x2125},
1119  {0x2126,0x03C9,0x2126}, {0x2127,0x2127,0x2127},
1120  {0x2128,0x2128,0x2128}, {0x2129,0x2129,0x2129},
1121  {0x212A,0x006B,0x212A}, {0x212B,0x00E5,0x212B},
1122  {0x212C,0x212C,0x212C}, {0x212D,0x212D,0x212D},
1123  {0x212E,0x212E,0x212E}, {0x212F,0x212F,0x212F},
1124  {0x2130,0x2130,0x2130}, {0x2131,0x2131,0x2131},
1125  {0x2132,0x2132,0x2132}, {0x2133,0x2133,0x2133},
1126  {0x2134,0x2134,0x2134}, {0x2135,0x2135,0x2135},
1127  {0x2136,0x2136,0x2136}, {0x2137,0x2137,0x2137},
1128  {0x2138,0x2138,0x2138}, {0x2139,0x2139,0x2139},
1129  {0x213A,0x213A,0x213A}, {0x213B,0x213B,0x213B},
1130  {0x213C,0x213C,0x213C}, {0x213D,0x213D,0x213D},
1131  {0x213E,0x213E,0x213E}, {0x213F,0x213F,0x213F},
1132  {0x2140,0x2140,0x2140}, {0x2141,0x2141,0x2141},
1133  {0x2142,0x2142,0x2142}, {0x2143,0x2143,0x2143},
1134  {0x2144,0x2144,0x2144}, {0x2145,0x2145,0x2145},
1135  {0x2146,0x2146,0x2146}, {0x2147,0x2147,0x2147},
1136  {0x2148,0x2148,0x2148}, {0x2149,0x2149,0x2149},
1137  {0x214A,0x214A,0x214A}, {0x214B,0x214B,0x214B},
1138  {0x214C,0x214C,0x214C}, {0x214D,0x214D,0x214D},
1139  {0x214E,0x214E,0x214E}, {0x214F,0x214F,0x214F},
1140  {0x2150,0x2150,0x2150}, {0x2151,0x2151,0x2151},
1141  {0x2152,0x2152,0x2152}, {0x2153,0x2153,0x2153},
1142  {0x2154,0x2154,0x2154}, {0x2155,0x2155,0x2155},
1143  {0x2156,0x2156,0x2156}, {0x2157,0x2157,0x2157},
1144  {0x2158,0x2158,0x2158}, {0x2159,0x2159,0x2159},
1145  {0x215A,0x215A,0x215A}, {0x215B,0x215B,0x215B},
1146  {0x215C,0x215C,0x215C}, {0x215D,0x215D,0x215D},
1147  {0x215E,0x215E,0x215E}, {0x215F,0x215F,0x215F},
1148  {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161},
1149  {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163},
1150  {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165},
1151  {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167},
1152  {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169},
1153  {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B},
1154  {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D},
1155  {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F},
1156  {0x2160,0x2170,0x2160}, {0x2161,0x2171,0x2161},
1157  {0x2162,0x2172,0x2162}, {0x2163,0x2173,0x2163},
1158  {0x2164,0x2174,0x2164}, {0x2165,0x2175,0x2165},
1159  {0x2166,0x2176,0x2166}, {0x2167,0x2177,0x2167},
1160  {0x2168,0x2178,0x2168}, {0x2169,0x2179,0x2169},
1161  {0x216A,0x217A,0x216A}, {0x216B,0x217B,0x216B},
1162  {0x216C,0x217C,0x216C}, {0x216D,0x217D,0x216D},
1163  {0x216E,0x217E,0x216E}, {0x216F,0x217F,0x216F},
1164  {0x2180,0x2180,0x2180}, {0x2181,0x2181,0x2181},
1165  {0x2182,0x2182,0x2182}, {0x2183,0x2183,0x2183},
1166  {0x2184,0x2184,0x2184}, {0x2185,0x2185,0x2185},
1167  {0x2186,0x2186,0x2186}, {0x2187,0x2187,0x2187},
1168  {0x2188,0x2188,0x2188}, {0x2189,0x2189,0x2189},
1169  {0x218A,0x218A,0x218A}, {0x218B,0x218B,0x218B},
1170  {0x218C,0x218C,0x218C}, {0x218D,0x218D,0x218D},
1171  {0x218E,0x218E,0x218E}, {0x218F,0x218F,0x218F},
1172  {0x2190,0x2190,0x2190}, {0x2191,0x2191,0x2191},
1173  {0x2192,0x2192,0x2192}, {0x2193,0x2193,0x2193},
1174  {0x2194,0x2194,0x2194}, {0x2195,0x2195,0x2195},
1175  {0x2196,0x2196,0x2196}, {0x2197,0x2197,0x2197},
1176  {0x2198,0x2198,0x2198}, {0x2199,0x2199,0x2199},
1177  {0x219A,0x219A,0x219A}, {0x219B,0x219B,0x219B},
1178  {0x219C,0x219C,0x219C}, {0x219D,0x219D,0x219D},
1179  {0x219E,0x219E,0x219E}, {0x219F,0x219F,0x219F},
1180  {0x21A0,0x21A0,0x21A0}, {0x21A1,0x21A1,0x21A1},
1181  {0x21A2,0x21A2,0x21A2}, {0x21A3,0x21A3,0x21A3},
1182  {0x21A4,0x21A4,0x21A4}, {0x21A5,0x21A5,0x21A5},
1183  {0x21A6,0x21A6,0x21A6}, {0x21A7,0x21A7,0x21A7},
1184  {0x21A8,0x21A8,0x21A8}, {0x21A9,0x21A9,0x21A9},
1185  {0x21AA,0x21AA,0x21AA}, {0x21AB,0x21AB,0x21AB},
1186  {0x21AC,0x21AC,0x21AC}, {0x21AD,0x21AD,0x21AD},
1187  {0x21AE,0x21AE,0x21AE}, {0x21AF,0x21AF,0x21AF},
1188  {0x21B0,0x21B0,0x21B0}, {0x21B1,0x21B1,0x21B1},
1189  {0x21B2,0x21B2,0x21B2}, {0x21B3,0x21B3,0x21B3},
1190  {0x21B4,0x21B4,0x21B4}, {0x21B5,0x21B5,0x21B5},
1191  {0x21B6,0x21B6,0x21B6}, {0x21B7,0x21B7,0x21B7},
1192  {0x21B8,0x21B8,0x21B8}, {0x21B9,0x21B9,0x21B9},
1193  {0x21BA,0x21BA,0x21BA}, {0x21BB,0x21BB,0x21BB},
1194  {0x21BC,0x21BC,0x21BC}, {0x21BD,0x21BD,0x21BD},
1195  {0x21BE,0x21BE,0x21BE}, {0x21BF,0x21BF,0x21BF},
1196  {0x21C0,0x21C0,0x21C0}, {0x21C1,0x21C1,0x21C1},
1197  {0x21C2,0x21C2,0x21C2}, {0x21C3,0x21C3,0x21C3},
1198  {0x21C4,0x21C4,0x21C4}, {0x21C5,0x21C5,0x21C5},
1199  {0x21C6,0x21C6,0x21C6}, {0x21C7,0x21C7,0x21C7},
1200  {0x21C8,0x21C8,0x21C8}, {0x21C9,0x21C9,0x21C9},
1201  {0x21CA,0x21CA,0x21CA}, {0x21CB,0x21CB,0x21CB},
1202  {0x21CC,0x21CC,0x21CC}, {0x21CD,0x21CD,0x21CD},
1203  {0x21CE,0x21CE,0x21CE}, {0x21CF,0x21CF,0x21CF},
1204  {0x21D0,0x21D0,0x21D0}, {0x21D1,0x21D1,0x21D1},
1205  {0x21D2,0x21D2,0x21D2}, {0x21D3,0x21D3,0x21D3},
1206  {0x21D4,0x21D4,0x21D4}, {0x21D5,0x21D5,0x21D5},
1207  {0x21D6,0x21D6,0x21D6}, {0x21D7,0x21D7,0x21D7},
1208  {0x21D8,0x21D8,0x21D8}, {0x21D9,0x21D9,0x21D9},
1209  {0x21DA,0x21DA,0x21DA}, {0x21DB,0x21DB,0x21DB},
1210  {0x21DC,0x21DC,0x21DC}, {0x21DD,0x21DD,0x21DD},
1211  {0x21DE,0x21DE,0x21DE}, {0x21DF,0x21DF,0x21DF},
1212  {0x21E0,0x21E0,0x21E0}, {0x21E1,0x21E1,0x21E1},
1213  {0x21E2,0x21E2,0x21E2}, {0x21E3,0x21E3,0x21E3},
1214  {0x21E4,0x21E4,0x21E4}, {0x21E5,0x21E5,0x21E5},
1215  {0x21E6,0x21E6,0x21E6}, {0x21E7,0x21E7,0x21E7},
1216  {0x21E8,0x21E8,0x21E8}, {0x21E9,0x21E9,0x21E9},
1217  {0x21EA,0x21EA,0x21EA}, {0x21EB,0x21EB,0x21EB},
1218  {0x21EC,0x21EC,0x21EC}, {0x21ED,0x21ED,0x21ED},
1219  {0x21EE,0x21EE,0x21EE}, {0x21EF,0x21EF,0x21EF},
1220  {0x21F0,0x21F0,0x21F0}, {0x21F1,0x21F1,0x21F1},
1221  {0x21F2,0x21F2,0x21F2}, {0x21F3,0x21F3,0x21F3},
1222  {0x21F4,0x21F4,0x21F4}, {0x21F5,0x21F5,0x21F5},
1223  {0x21F6,0x21F6,0x21F6}, {0x21F7,0x21F7,0x21F7},
1224  {0x21F8,0x21F8,0x21F8}, {0x21F9,0x21F9,0x21F9},
1225  {0x21FA,0x21FA,0x21FA}, {0x21FB,0x21FB,0x21FB},
1226  {0x21FC,0x21FC,0x21FC}, {0x21FD,0x21FD,0x21FD},
1227  {0x21FE,0x21FE,0x21FE}, {0x21FF,0x21FF,0x21FF}
1228 };
1229 
1230 static MY_UNICASE_INFO plane24[]={
1231  {0x2400,0x2400,0x2400}, {0x2401,0x2401,0x2401},
1232  {0x2402,0x2402,0x2402}, {0x2403,0x2403,0x2403},
1233  {0x2404,0x2404,0x2404}, {0x2405,0x2405,0x2405},
1234  {0x2406,0x2406,0x2406}, {0x2407,0x2407,0x2407},
1235  {0x2408,0x2408,0x2408}, {0x2409,0x2409,0x2409},
1236  {0x240A,0x240A,0x240A}, {0x240B,0x240B,0x240B},
1237  {0x240C,0x240C,0x240C}, {0x240D,0x240D,0x240D},
1238  {0x240E,0x240E,0x240E}, {0x240F,0x240F,0x240F},
1239  {0x2410,0x2410,0x2410}, {0x2411,0x2411,0x2411},
1240  {0x2412,0x2412,0x2412}, {0x2413,0x2413,0x2413},
1241  {0x2414,0x2414,0x2414}, {0x2415,0x2415,0x2415},
1242  {0x2416,0x2416,0x2416}, {0x2417,0x2417,0x2417},
1243  {0x2418,0x2418,0x2418}, {0x2419,0x2419,0x2419},
1244  {0x241A,0x241A,0x241A}, {0x241B,0x241B,0x241B},
1245  {0x241C,0x241C,0x241C}, {0x241D,0x241D,0x241D},
1246  {0x241E,0x241E,0x241E}, {0x241F,0x241F,0x241F},
1247  {0x2420,0x2420,0x2420}, {0x2421,0x2421,0x2421},
1248  {0x2422,0x2422,0x2422}, {0x2423,0x2423,0x2423},
1249  {0x2424,0x2424,0x2424}, {0x2425,0x2425,0x2425},
1250  {0x2426,0x2426,0x2426}, {0x2427,0x2427,0x2427},
1251  {0x2428,0x2428,0x2428}, {0x2429,0x2429,0x2429},
1252  {0x242A,0x242A,0x242A}, {0x242B,0x242B,0x242B},
1253  {0x242C,0x242C,0x242C}, {0x242D,0x242D,0x242D},
1254  {0x242E,0x242E,0x242E}, {0x242F,0x242F,0x242F},
1255  {0x2430,0x2430,0x2430}, {0x2431,0x2431,0x2431},
1256  {0x2432,0x2432,0x2432}, {0x2433,0x2433,0x2433},
1257  {0x2434,0x2434,0x2434}, {0x2435,0x2435,0x2435},
1258  {0x2436,0x2436,0x2436}, {0x2437,0x2437,0x2437},
1259  {0x2438,0x2438,0x2438}, {0x2439,0x2439,0x2439},
1260  {0x243A,0x243A,0x243A}, {0x243B,0x243B,0x243B},
1261  {0x243C,0x243C,0x243C}, {0x243D,0x243D,0x243D},
1262  {0x243E,0x243E,0x243E}, {0x243F,0x243F,0x243F},
1263  {0x2440,0x2440,0x2440}, {0x2441,0x2441,0x2441},
1264  {0x2442,0x2442,0x2442}, {0x2443,0x2443,0x2443},
1265  {0x2444,0x2444,0x2444}, {0x2445,0x2445,0x2445},
1266  {0x2446,0x2446,0x2446}, {0x2447,0x2447,0x2447},
1267  {0x2448,0x2448,0x2448}, {0x2449,0x2449,0x2449},
1268  {0x244A,0x244A,0x244A}, {0x244B,0x244B,0x244B},
1269  {0x244C,0x244C,0x244C}, {0x244D,0x244D,0x244D},
1270  {0x244E,0x244E,0x244E}, {0x244F,0x244F,0x244F},
1271  {0x2450,0x2450,0x2450}, {0x2451,0x2451,0x2451},
1272  {0x2452,0x2452,0x2452}, {0x2453,0x2453,0x2453},
1273  {0x2454,0x2454,0x2454}, {0x2455,0x2455,0x2455},
1274  {0x2456,0x2456,0x2456}, {0x2457,0x2457,0x2457},
1275  {0x2458,0x2458,0x2458}, {0x2459,0x2459,0x2459},
1276  {0x245A,0x245A,0x245A}, {0x245B,0x245B,0x245B},
1277  {0x245C,0x245C,0x245C}, {0x245D,0x245D,0x245D},
1278  {0x245E,0x245E,0x245E}, {0x245F,0x245F,0x245F},
1279  {0x2460,0x2460,0x2460}, {0x2461,0x2461,0x2461},
1280  {0x2462,0x2462,0x2462}, {0x2463,0x2463,0x2463},
1281  {0x2464,0x2464,0x2464}, {0x2465,0x2465,0x2465},
1282  {0x2466,0x2466,0x2466}, {0x2467,0x2467,0x2467},
1283  {0x2468,0x2468,0x2468}, {0x2469,0x2469,0x2469},
1284  {0x246A,0x246A,0x246A}, {0x246B,0x246B,0x246B},
1285  {0x246C,0x246C,0x246C}, {0x246D,0x246D,0x246D},
1286  {0x246E,0x246E,0x246E}, {0x246F,0x246F,0x246F},
1287  {0x2470,0x2470,0x2470}, {0x2471,0x2471,0x2471},
1288  {0x2472,0x2472,0x2472}, {0x2473,0x2473,0x2473},
1289  {0x2474,0x2474,0x2474}, {0x2475,0x2475,0x2475},
1290  {0x2476,0x2476,0x2476}, {0x2477,0x2477,0x2477},
1291  {0x2478,0x2478,0x2478}, {0x2479,0x2479,0x2479},
1292  {0x247A,0x247A,0x247A}, {0x247B,0x247B,0x247B},
1293  {0x247C,0x247C,0x247C}, {0x247D,0x247D,0x247D},
1294  {0x247E,0x247E,0x247E}, {0x247F,0x247F,0x247F},
1295  {0x2480,0x2480,0x2480}, {0x2481,0x2481,0x2481},
1296  {0x2482,0x2482,0x2482}, {0x2483,0x2483,0x2483},
1297  {0x2484,0x2484,0x2484}, {0x2485,0x2485,0x2485},
1298  {0x2486,0x2486,0x2486}, {0x2487,0x2487,0x2487},
1299  {0x2488,0x2488,0x2488}, {0x2489,0x2489,0x2489},
1300  {0x248A,0x248A,0x248A}, {0x248B,0x248B,0x248B},
1301  {0x248C,0x248C,0x248C}, {0x248D,0x248D,0x248D},
1302  {0x248E,0x248E,0x248E}, {0x248F,0x248F,0x248F},
1303  {0x2490,0x2490,0x2490}, {0x2491,0x2491,0x2491},
1304  {0x2492,0x2492,0x2492}, {0x2493,0x2493,0x2493},
1305  {0x2494,0x2494,0x2494}, {0x2495,0x2495,0x2495},
1306  {0x2496,0x2496,0x2496}, {0x2497,0x2497,0x2497},
1307  {0x2498,0x2498,0x2498}, {0x2499,0x2499,0x2499},
1308  {0x249A,0x249A,0x249A}, {0x249B,0x249B,0x249B},
1309  {0x249C,0x249C,0x249C}, {0x249D,0x249D,0x249D},
1310  {0x249E,0x249E,0x249E}, {0x249F,0x249F,0x249F},
1311  {0x24A0,0x24A0,0x24A0}, {0x24A1,0x24A1,0x24A1},
1312  {0x24A2,0x24A2,0x24A2}, {0x24A3,0x24A3,0x24A3},
1313  {0x24A4,0x24A4,0x24A4}, {0x24A5,0x24A5,0x24A5},
1314  {0x24A6,0x24A6,0x24A6}, {0x24A7,0x24A7,0x24A7},
1315  {0x24A8,0x24A8,0x24A8}, {0x24A9,0x24A9,0x24A9},
1316  {0x24AA,0x24AA,0x24AA}, {0x24AB,0x24AB,0x24AB},
1317  {0x24AC,0x24AC,0x24AC}, {0x24AD,0x24AD,0x24AD},
1318  {0x24AE,0x24AE,0x24AE}, {0x24AF,0x24AF,0x24AF},
1319  {0x24B0,0x24B0,0x24B0}, {0x24B1,0x24B1,0x24B1},
1320  {0x24B2,0x24B2,0x24B2}, {0x24B3,0x24B3,0x24B3},
1321  {0x24B4,0x24B4,0x24B4}, {0x24B5,0x24B5,0x24B5},
1322  {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7},
1323  {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9},
1324  {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB},
1325  {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD},
1326  {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF},
1327  {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1},
1328  {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3},
1329  {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5},
1330  {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7},
1331  {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9},
1332  {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB},
1333  {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD},
1334  {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF},
1335  {0x24B6,0x24D0,0x24B6}, {0x24B7,0x24D1,0x24B7},
1336  {0x24B8,0x24D2,0x24B8}, {0x24B9,0x24D3,0x24B9},
1337  {0x24BA,0x24D4,0x24BA}, {0x24BB,0x24D5,0x24BB},
1338  {0x24BC,0x24D6,0x24BC}, {0x24BD,0x24D7,0x24BD},
1339  {0x24BE,0x24D8,0x24BE}, {0x24BF,0x24D9,0x24BF},
1340  {0x24C0,0x24DA,0x24C0}, {0x24C1,0x24DB,0x24C1},
1341  {0x24C2,0x24DC,0x24C2}, {0x24C3,0x24DD,0x24C3},
1342  {0x24C4,0x24DE,0x24C4}, {0x24C5,0x24DF,0x24C5},
1343  {0x24C6,0x24E0,0x24C6}, {0x24C7,0x24E1,0x24C7},
1344  {0x24C8,0x24E2,0x24C8}, {0x24C9,0x24E3,0x24C9},
1345  {0x24CA,0x24E4,0x24CA}, {0x24CB,0x24E5,0x24CB},
1346  {0x24CC,0x24E6,0x24CC}, {0x24CD,0x24E7,0x24CD},
1347  {0x24CE,0x24E8,0x24CE}, {0x24CF,0x24E9,0x24CF},
1348  {0x24EA,0x24EA,0x24EA}, {0x24EB,0x24EB,0x24EB},
1349  {0x24EC,0x24EC,0x24EC}, {0x24ED,0x24ED,0x24ED},
1350  {0x24EE,0x24EE,0x24EE}, {0x24EF,0x24EF,0x24EF},
1351  {0x24F0,0x24F0,0x24F0}, {0x24F1,0x24F1,0x24F1},
1352  {0x24F2,0x24F2,0x24F2}, {0x24F3,0x24F3,0x24F3},
1353  {0x24F4,0x24F4,0x24F4}, {0x24F5,0x24F5,0x24F5},
1354  {0x24F6,0x24F6,0x24F6}, {0x24F7,0x24F7,0x24F7},
1355  {0x24F8,0x24F8,0x24F8}, {0x24F9,0x24F9,0x24F9},
1356  {0x24FA,0x24FA,0x24FA}, {0x24FB,0x24FB,0x24FB},
1357  {0x24FC,0x24FC,0x24FC}, {0x24FD,0x24FD,0x24FD},
1358  {0x24FE,0x24FE,0x24FE}, {0x24FF,0x24FF,0x24FF}
1359 };
1360 
1361 static MY_UNICASE_INFO planeFF[]={
1362  {0xFF00,0xFF00,0xFF00}, {0xFF01,0xFF01,0xFF01},
1363  {0xFF02,0xFF02,0xFF02}, {0xFF03,0xFF03,0xFF03},
1364  {0xFF04,0xFF04,0xFF04}, {0xFF05,0xFF05,0xFF05},
1365  {0xFF06,0xFF06,0xFF06}, {0xFF07,0xFF07,0xFF07},
1366  {0xFF08,0xFF08,0xFF08}, {0xFF09,0xFF09,0xFF09},
1367  {0xFF0A,0xFF0A,0xFF0A}, {0xFF0B,0xFF0B,0xFF0B},
1368  {0xFF0C,0xFF0C,0xFF0C}, {0xFF0D,0xFF0D,0xFF0D},
1369  {0xFF0E,0xFF0E,0xFF0E}, {0xFF0F,0xFF0F,0xFF0F},
1370  {0xFF10,0xFF10,0xFF10}, {0xFF11,0xFF11,0xFF11},
1371  {0xFF12,0xFF12,0xFF12}, {0xFF13,0xFF13,0xFF13},
1372  {0xFF14,0xFF14,0xFF14}, {0xFF15,0xFF15,0xFF15},
1373  {0xFF16,0xFF16,0xFF16}, {0xFF17,0xFF17,0xFF17},
1374  {0xFF18,0xFF18,0xFF18}, {0xFF19,0xFF19,0xFF19},
1375  {0xFF1A,0xFF1A,0xFF1A}, {0xFF1B,0xFF1B,0xFF1B},
1376  {0xFF1C,0xFF1C,0xFF1C}, {0xFF1D,0xFF1D,0xFF1D},
1377  {0xFF1E,0xFF1E,0xFF1E}, {0xFF1F,0xFF1F,0xFF1F},
1378  {0xFF20,0xFF20,0xFF20}, {0xFF21,0xFF41,0xFF21},
1379  {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23},
1380  {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25},
1381  {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27},
1382  {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29},
1383  {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B},
1384  {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D},
1385  {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F},
1386  {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31},
1387  {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33},
1388  {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35},
1389  {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37},
1390  {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39},
1391  {0xFF3A,0xFF5A,0xFF3A}, {0xFF3B,0xFF3B,0xFF3B},
1392  {0xFF3C,0xFF3C,0xFF3C}, {0xFF3D,0xFF3D,0xFF3D},
1393  {0xFF3E,0xFF3E,0xFF3E}, {0xFF3F,0xFF3F,0xFF3F},
1394  {0xFF40,0xFF40,0xFF40}, {0xFF21,0xFF41,0xFF21},
1395  {0xFF22,0xFF42,0xFF22}, {0xFF23,0xFF43,0xFF23},
1396  {0xFF24,0xFF44,0xFF24}, {0xFF25,0xFF45,0xFF25},
1397  {0xFF26,0xFF46,0xFF26}, {0xFF27,0xFF47,0xFF27},
1398  {0xFF28,0xFF48,0xFF28}, {0xFF29,0xFF49,0xFF29},
1399  {0xFF2A,0xFF4A,0xFF2A}, {0xFF2B,0xFF4B,0xFF2B},
1400  {0xFF2C,0xFF4C,0xFF2C}, {0xFF2D,0xFF4D,0xFF2D},
1401  {0xFF2E,0xFF4E,0xFF2E}, {0xFF2F,0xFF4F,0xFF2F},
1402  {0xFF30,0xFF50,0xFF30}, {0xFF31,0xFF51,0xFF31},
1403  {0xFF32,0xFF52,0xFF32}, {0xFF33,0xFF53,0xFF33},
1404  {0xFF34,0xFF54,0xFF34}, {0xFF35,0xFF55,0xFF35},
1405  {0xFF36,0xFF56,0xFF36}, {0xFF37,0xFF57,0xFF37},
1406  {0xFF38,0xFF58,0xFF38}, {0xFF39,0xFF59,0xFF39},
1407  {0xFF3A,0xFF5A,0xFF3A}, {0xFF5B,0xFF5B,0xFF5B},
1408  {0xFF5C,0xFF5C,0xFF5C}, {0xFF5D,0xFF5D,0xFF5D},
1409  {0xFF5E,0xFF5E,0xFF5E}, {0xFF5F,0xFF5F,0xFF5F},
1410  {0xFF60,0xFF60,0xFF60}, {0xFF61,0xFF61,0xFF61},
1411  {0xFF62,0xFF62,0xFF62}, {0xFF63,0xFF63,0xFF63},
1412  {0xFF64,0xFF64,0xFF64}, {0xFF65,0xFF65,0xFF65},
1413  {0xFF66,0xFF66,0xFF66}, {0xFF67,0xFF67,0xFF67},
1414  {0xFF68,0xFF68,0xFF68}, {0xFF69,0xFF69,0xFF69},
1415  {0xFF6A,0xFF6A,0xFF6A}, {0xFF6B,0xFF6B,0xFF6B},
1416  {0xFF6C,0xFF6C,0xFF6C}, {0xFF6D,0xFF6D,0xFF6D},
1417  {0xFF6E,0xFF6E,0xFF6E}, {0xFF6F,0xFF6F,0xFF6F},
1418  {0xFF70,0xFF70,0xFF70}, {0xFF71,0xFF71,0xFF71},
1419  {0xFF72,0xFF72,0xFF72}, {0xFF73,0xFF73,0xFF73},
1420  {0xFF74,0xFF74,0xFF74}, {0xFF75,0xFF75,0xFF75},
1421  {0xFF76,0xFF76,0xFF76}, {0xFF77,0xFF77,0xFF77},
1422  {0xFF78,0xFF78,0xFF78}, {0xFF79,0xFF79,0xFF79},
1423  {0xFF7A,0xFF7A,0xFF7A}, {0xFF7B,0xFF7B,0xFF7B},
1424  {0xFF7C,0xFF7C,0xFF7C}, {0xFF7D,0xFF7D,0xFF7D},
1425  {0xFF7E,0xFF7E,0xFF7E}, {0xFF7F,0xFF7F,0xFF7F},
1426  {0xFF80,0xFF80,0xFF80}, {0xFF81,0xFF81,0xFF81},
1427  {0xFF82,0xFF82,0xFF82}, {0xFF83,0xFF83,0xFF83},
1428  {0xFF84,0xFF84,0xFF84}, {0xFF85,0xFF85,0xFF85},
1429  {0xFF86,0xFF86,0xFF86}, {0xFF87,0xFF87,0xFF87},
1430  {0xFF88,0xFF88,0xFF88}, {0xFF89,0xFF89,0xFF89},
1431  {0xFF8A,0xFF8A,0xFF8A}, {0xFF8B,0xFF8B,0xFF8B},
1432  {0xFF8C,0xFF8C,0xFF8C}, {0xFF8D,0xFF8D,0xFF8D},
1433  {0xFF8E,0xFF8E,0xFF8E}, {0xFF8F,0xFF8F,0xFF8F},
1434  {0xFF90,0xFF90,0xFF90}, {0xFF91,0xFF91,0xFF91},
1435  {0xFF92,0xFF92,0xFF92}, {0xFF93,0xFF93,0xFF93},
1436  {0xFF94,0xFF94,0xFF94}, {0xFF95,0xFF95,0xFF95},
1437  {0xFF96,0xFF96,0xFF96}, {0xFF97,0xFF97,0xFF97},
1438  {0xFF98,0xFF98,0xFF98}, {0xFF99,0xFF99,0xFF99},
1439  {0xFF9A,0xFF9A,0xFF9A}, {0xFF9B,0xFF9B,0xFF9B},
1440  {0xFF9C,0xFF9C,0xFF9C}, {0xFF9D,0xFF9D,0xFF9D},
1441  {0xFF9E,0xFF9E,0xFF9E}, {0xFF9F,0xFF9F,0xFF9F},
1442  {0xFFA0,0xFFA0,0xFFA0}, {0xFFA1,0xFFA1,0xFFA1},
1443  {0xFFA2,0xFFA2,0xFFA2}, {0xFFA3,0xFFA3,0xFFA3},
1444  {0xFFA4,0xFFA4,0xFFA4}, {0xFFA5,0xFFA5,0xFFA5},
1445  {0xFFA6,0xFFA6,0xFFA6}, {0xFFA7,0xFFA7,0xFFA7},
1446  {0xFFA8,0xFFA8,0xFFA8}, {0xFFA9,0xFFA9,0xFFA9},
1447  {0xFFAA,0xFFAA,0xFFAA}, {0xFFAB,0xFFAB,0xFFAB},
1448  {0xFFAC,0xFFAC,0xFFAC}, {0xFFAD,0xFFAD,0xFFAD},
1449  {0xFFAE,0xFFAE,0xFFAE}, {0xFFAF,0xFFAF,0xFFAF},
1450  {0xFFB0,0xFFB0,0xFFB0}, {0xFFB1,0xFFB1,0xFFB1},
1451  {0xFFB2,0xFFB2,0xFFB2}, {0xFFB3,0xFFB3,0xFFB3},
1452  {0xFFB4,0xFFB4,0xFFB4}, {0xFFB5,0xFFB5,0xFFB5},
1453  {0xFFB6,0xFFB6,0xFFB6}, {0xFFB7,0xFFB7,0xFFB7},
1454  {0xFFB8,0xFFB8,0xFFB8}, {0xFFB9,0xFFB9,0xFFB9},
1455  {0xFFBA,0xFFBA,0xFFBA}, {0xFFBB,0xFFBB,0xFFBB},
1456  {0xFFBC,0xFFBC,0xFFBC}, {0xFFBD,0xFFBD,0xFFBD},
1457  {0xFFBE,0xFFBE,0xFFBE}, {0xFFBF,0xFFBF,0xFFBF},
1458  {0xFFC0,0xFFC0,0xFFC0}, {0xFFC1,0xFFC1,0xFFC1},
1459  {0xFFC2,0xFFC2,0xFFC2}, {0xFFC3,0xFFC3,0xFFC3},
1460  {0xFFC4,0xFFC4,0xFFC4}, {0xFFC5,0xFFC5,0xFFC5},
1461  {0xFFC6,0xFFC6,0xFFC6}, {0xFFC7,0xFFC7,0xFFC7},
1462  {0xFFC8,0xFFC8,0xFFC8}, {0xFFC9,0xFFC9,0xFFC9},
1463  {0xFFCA,0xFFCA,0xFFCA}, {0xFFCB,0xFFCB,0xFFCB},
1464  {0xFFCC,0xFFCC,0xFFCC}, {0xFFCD,0xFFCD,0xFFCD},
1465  {0xFFCE,0xFFCE,0xFFCE}, {0xFFCF,0xFFCF,0xFFCF},
1466  {0xFFD0,0xFFD0,0xFFD0}, {0xFFD1,0xFFD1,0xFFD1},
1467  {0xFFD2,0xFFD2,0xFFD2}, {0xFFD3,0xFFD3,0xFFD3},
1468  {0xFFD4,0xFFD4,0xFFD4}, {0xFFD5,0xFFD5,0xFFD5},
1469  {0xFFD6,0xFFD6,0xFFD6}, {0xFFD7,0xFFD7,0xFFD7},
1470  {0xFFD8,0xFFD8,0xFFD8}, {0xFFD9,0xFFD9,0xFFD9},
1471  {0xFFDA,0xFFDA,0xFFDA}, {0xFFDB,0xFFDB,0xFFDB},
1472  {0xFFDC,0xFFDC,0xFFDC}, {0xFFDD,0xFFDD,0xFFDD},
1473  {0xFFDE,0xFFDE,0xFFDE}, {0xFFDF,0xFFDF,0xFFDF},
1474  {0xFFE0,0xFFE0,0xFFE0}, {0xFFE1,0xFFE1,0xFFE1},
1475  {0xFFE2,0xFFE2,0xFFE2}, {0xFFE3,0xFFE3,0xFFE3},
1476  {0xFFE4,0xFFE4,0xFFE4}, {0xFFE5,0xFFE5,0xFFE5},
1477  {0xFFE6,0xFFE6,0xFFE6}, {0xFFE7,0xFFE7,0xFFE7},
1478  {0xFFE8,0xFFE8,0xFFE8}, {0xFFE9,0xFFE9,0xFFE9},
1479  {0xFFEA,0xFFEA,0xFFEA}, {0xFFEB,0xFFEB,0xFFEB},
1480  {0xFFEC,0xFFEC,0xFFEC}, {0xFFED,0xFFED,0xFFED},
1481  {0xFFEE,0xFFEE,0xFFEE}, {0xFFEF,0xFFEF,0xFFEF},
1482  {0xFFF0,0xFFF0,0xFFF0}, {0xFFF1,0xFFF1,0xFFF1},
1483  {0xFFF2,0xFFF2,0xFFF2}, {0xFFF3,0xFFF3,0xFFF3},
1484  {0xFFF4,0xFFF4,0xFFF4}, {0xFFF5,0xFFF5,0xFFF5},
1485  {0xFFF6,0xFFF6,0xFFF6}, {0xFFF7,0xFFF7,0xFFF7},
1486  {0xFFF8,0xFFF8,0xFFF8}, {0xFFF9,0xFFF9,0xFFF9},
1487  {0xFFFA,0xFFFA,0xFFFA}, {0xFFFB,0xFFFB,0xFFFB},
1488  {0xFFFC,0xFFFC,0xFFFC}, {0xFFFD,0xFFFD,0xFFFD},
1489  {0xFFFE,0xFFFE,0xFFFE}, {0xFFFF,0xFFFF,0xFFFF}
1490 };
1491 
1492 MY_UNICASE_INFO *my_unicase_default[256]={
1493  plane00, plane01, plane02, plane03, plane04, plane05, NULL, NULL,
1494  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1495  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1496  NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F,
1497  NULL, plane21, NULL, NULL, plane24, NULL, NULL, NULL,
1498  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1499  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1500  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1501  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1502  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1503  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1504  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1505  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1506  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1507  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1508  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1509  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1510  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1511  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1512  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1513  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1514  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1515  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1516  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1517  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1518  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1519  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1520  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1521  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1522  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1523  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1524  NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF
1525 
1526 };
1527 
1528 
1529 /*
1530  Turkish lower/upper mapping:
1531  1. LOWER(0x0049 LATIN CAPITAL LETTER I) ->
1532  0x0131 LATIN SMALL LETTER DOTLESS I
1533  2. UPPER(0x0069 LATIN SMALL LETTER I) ->
1534  0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
1535 */
1536 
1537 static MY_UNICASE_INFO turk00[]=
1538 {
1539  {0x0000,0x0000,0x0000}, {0x0001,0x0001,0x0001},
1540  {0x0002,0x0002,0x0002}, {0x0003,0x0003,0x0003},
1541  {0x0004,0x0004,0x0004}, {0x0005,0x0005,0x0005},
1542  {0x0006,0x0006,0x0006}, {0x0007,0x0007,0x0007},
1543  {0x0008,0x0008,0x0008}, {0x0009,0x0009,0x0009},
1544  {0x000A,0x000A,0x000A}, {0x000B,0x000B,0x000B},
1545  {0x000C,0x000C,0x000C}, {0x000D,0x000D,0x000D},
1546  {0x000E,0x000E,0x000E}, {0x000F,0x000F,0x000F},
1547  {0x0010,0x0010,0x0010}, {0x0011,0x0011,0x0011},
1548  {0x0012,0x0012,0x0012}, {0x0013,0x0013,0x0013},
1549  {0x0014,0x0014,0x0014}, {0x0015,0x0015,0x0015},
1550  {0x0016,0x0016,0x0016}, {0x0017,0x0017,0x0017},
1551  {0x0018,0x0018,0x0018}, {0x0019,0x0019,0x0019},
1552  {0x001A,0x001A,0x001A}, {0x001B,0x001B,0x001B},
1553  {0x001C,0x001C,0x001C}, {0x001D,0x001D,0x001D},
1554  {0x001E,0x001E,0x001E}, {0x001F,0x001F,0x001F},
1555  {0x0020,0x0020,0x0020}, {0x0021,0x0021,0x0021},
1556  {0x0022,0x0022,0x0022}, {0x0023,0x0023,0x0023},
1557  {0x0024,0x0024,0x0024}, {0x0025,0x0025,0x0025},
1558  {0x0026,0x0026,0x0026}, {0x0027,0x0027,0x0027},
1559  {0x0028,0x0028,0x0028}, {0x0029,0x0029,0x0029},
1560  {0x002A,0x002A,0x002A}, {0x002B,0x002B,0x002B},
1561  {0x002C,0x002C,0x002C}, {0x002D,0x002D,0x002D},
1562  {0x002E,0x002E,0x002E}, {0x002F,0x002F,0x002F},
1563  {0x0030,0x0030,0x0030}, {0x0031,0x0031,0x0031},
1564  {0x0032,0x0032,0x0032}, {0x0033,0x0033,0x0033},
1565  {0x0034,0x0034,0x0034}, {0x0035,0x0035,0x0035},
1566  {0x0036,0x0036,0x0036}, {0x0037,0x0037,0x0037},
1567  {0x0038,0x0038,0x0038}, {0x0039,0x0039,0x0039},
1568  {0x003A,0x003A,0x003A}, {0x003B,0x003B,0x003B},
1569  {0x003C,0x003C,0x003C}, {0x003D,0x003D,0x003D},
1570  {0x003E,0x003E,0x003E}, {0x003F,0x003F,0x003F},
1571  {0x0040,0x0040,0x0040}, {0x0041,0x0061,0x0041},
1572  {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043},
1573  {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045},
1574  {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047},
1575  {0x0048,0x0068,0x0048}, {0x0049,0x0131,0x0049},
1576  {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B},
1577  {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D},
1578  {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F},
1579  {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051},
1580  {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053},
1581  {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055},
1582  {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057},
1583  {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059},
1584  {0x005A,0x007A,0x005A}, {0x005B,0x005B,0x005B},
1585  {0x005C,0x005C,0x005C}, {0x005D,0x005D,0x005D},
1586  {0x005E,0x005E,0x005E}, {0x005F,0x005F,0x005F},
1587  {0x0060,0x0060,0x0060}, {0x0041,0x0061,0x0041},
1588  {0x0042,0x0062,0x0042}, {0x0043,0x0063,0x0043},
1589  {0x0044,0x0064,0x0044}, {0x0045,0x0065,0x0045},
1590  {0x0046,0x0066,0x0046}, {0x0047,0x0067,0x0047},
1591  {0x0048,0x0068,0x0048}, {0x0130,0x0069,0x0049},
1592  {0x004A,0x006A,0x004A}, {0x004B,0x006B,0x004B},
1593  {0x004C,0x006C,0x004C}, {0x004D,0x006D,0x004D},
1594  {0x004E,0x006E,0x004E}, {0x004F,0x006F,0x004F},
1595  {0x0050,0x0070,0x0050}, {0x0051,0x0071,0x0051},
1596  {0x0052,0x0072,0x0052}, {0x0053,0x0073,0x0053},
1597  {0x0054,0x0074,0x0054}, {0x0055,0x0075,0x0055},
1598  {0x0056,0x0076,0x0056}, {0x0057,0x0077,0x0057},
1599  {0x0058,0x0078,0x0058}, {0x0059,0x0079,0x0059},
1600  {0x005A,0x007A,0x005A}, {0x007B,0x007B,0x007B},
1601  {0x007C,0x007C,0x007C}, {0x007D,0x007D,0x007D},
1602  {0x007E,0x007E,0x007E}, {0x007F,0x007F,0x007F},
1603  {0x0080,0x0080,0x0080}, {0x0081,0x0081,0x0081},
1604  {0x0082,0x0082,0x0082}, {0x0083,0x0083,0x0083},
1605  {0x0084,0x0084,0x0084}, {0x0085,0x0085,0x0085},
1606  {0x0086,0x0086,0x0086}, {0x0087,0x0087,0x0087},
1607  {0x0088,0x0088,0x0088}, {0x0089,0x0089,0x0089},
1608  {0x008A,0x008A,0x008A}, {0x008B,0x008B,0x008B},
1609  {0x008C,0x008C,0x008C}, {0x008D,0x008D,0x008D},
1610  {0x008E,0x008E,0x008E}, {0x008F,0x008F,0x008F},
1611  {0x0090,0x0090,0x0090}, {0x0091,0x0091,0x0091},
1612  {0x0092,0x0092,0x0092}, {0x0093,0x0093,0x0093},
1613  {0x0094,0x0094,0x0094}, {0x0095,0x0095,0x0095},
1614  {0x0096,0x0096,0x0096}, {0x0097,0x0097,0x0097},
1615  {0x0098,0x0098,0x0098}, {0x0099,0x0099,0x0099},
1616  {0x009A,0x009A,0x009A}, {0x009B,0x009B,0x009B},
1617  {0x009C,0x009C,0x009C}, {0x009D,0x009D,0x009D},
1618  {0x009E,0x009E,0x009E}, {0x009F,0x009F,0x009F},
1619  {0x00A0,0x00A0,0x00A0}, {0x00A1,0x00A1,0x00A1},
1620  {0x00A2,0x00A2,0x00A2}, {0x00A3,0x00A3,0x00A3},
1621  {0x00A4,0x00A4,0x00A4}, {0x00A5,0x00A5,0x00A5},
1622  {0x00A6,0x00A6,0x00A6}, {0x00A7,0x00A7,0x00A7},
1623  {0x00A8,0x00A8,0x00A8}, {0x00A9,0x00A9,0x00A9},
1624  {0x00AA,0x00AA,0x00AA}, {0x00AB,0x00AB,0x00AB},
1625  {0x00AC,0x00AC,0x00AC}, {0x00AD,0x00AD,0x00AD},
1626  {0x00AE,0x00AE,0x00AE}, {0x00AF,0x00AF,0x00AF},
1627  {0x00B0,0x00B0,0x00B0}, {0x00B1,0x00B1,0x00B1},
1628  {0x00B2,0x00B2,0x00B2}, {0x00B3,0x00B3,0x00B3},
1629  {0x00B4,0x00B4,0x00B4}, {0x039C,0x00B5,0x039C},
1630  {0x00B6,0x00B6,0x00B6}, {0x00B7,0x00B7,0x00B7},
1631  {0x00B8,0x00B8,0x00B8}, {0x00B9,0x00B9,0x00B9},
1632  {0x00BA,0x00BA,0x00BA}, {0x00BB,0x00BB,0x00BB},
1633  {0x00BC,0x00BC,0x00BC}, {0x00BD,0x00BD,0x00BD},
1634  {0x00BE,0x00BE,0x00BE}, {0x00BF,0x00BF,0x00BF},
1635  {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041},
1636  {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041},
1637  {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041},
1638  {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043},
1639  {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045},
1640  {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045},
1641  {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049},
1642  {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049},
1643  {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E},
1644  {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F},
1645  {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F},
1646  {0x00D6,0x00F6,0x004F}, {0x00D7,0x00D7,0x00D7},
1647  {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055},
1648  {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055},
1649  {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059},
1650  {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x00DF},
1651  {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041},
1652  {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041},
1653  {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041},
1654  {0x00C6,0x00E6,0x00C6}, {0x00C7,0x00E7,0x0043},
1655  {0x00C8,0x00E8,0x0045}, {0x00C9,0x00E9,0x0045},
1656  {0x00CA,0x00EA,0x0045}, {0x00CB,0x00EB,0x0045},
1657  {0x00CC,0x00EC,0x0049}, {0x00CD,0x00ED,0x0049},
1658  {0x00CE,0x00EE,0x0049}, {0x00CF,0x00EF,0x0049},
1659  {0x00D0,0x00F0,0x00D0}, {0x00D1,0x00F1,0x004E},
1660  {0x00D2,0x00F2,0x004F}, {0x00D3,0x00F3,0x004F},
1661  {0x00D4,0x00F4,0x004F}, {0x00D5,0x00F5,0x004F},
1662  {0x00D6,0x00F6,0x004F}, {0x00F7,0x00F7,0x00F7},
1663  {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055},
1664  {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055},
1665  {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059},
1666  {0x00DE,0x00FE,0x00DE}, {0x0178,0x00FF,0x0059}
1667 };
1668 
1669 
1670 
1671 MY_UNICASE_INFO *my_unicase_turkish[256]=
1672 {
1673  turk00, plane01, plane02, plane03, plane04, plane05, NULL, NULL,
1674  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1675  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1676  NULL, NULL, NULL, NULL, NULL, NULL, plane1E, plane1F,
1677  NULL, plane21, NULL, NULL, plane24, NULL, NULL, NULL,
1678  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1679  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1680  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1681  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1682  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1683  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1684  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1685  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1686  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1687  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1688  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1689  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1690  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1691  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1692  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1693  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1694  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1695  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1696  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1697  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1698  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1699  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1700  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1701  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1702  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1703  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
1704  NULL, NULL, NULL, NULL, NULL, NULL, NULL, planeFF
1705 };
1706 
1707 
1708 
1729  const char *str,const char *str_end,
1730  const char *wildstr,const char *wildend,
1731  int escape, int w_one, int w_many,
1732  MY_UNICASE_INFO **weights)
1733 {
1734  int result= -1; /* Not found, using wildcards */
1735  my_wc_t s_wc=0, w_wc=0;
1736  int scan, plane;
1737  my_charset_conv_mb_wc mb_wc;
1738  mb_wc= cs->cset->mb_wc;
1739 
1740  while (wildstr != wildend)
1741  {
1742  while (1)
1743  {
1744  bool escaped= 0;
1745  if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1746  (const unsigned char*)wildend)) <= 0)
1747  return 1;
1748 
1749  if (w_wc == (my_wc_t)w_many)
1750  {
1751  result= 1; /* Found an anchor char */
1752  break;
1753  }
1754 
1755  wildstr+= scan;
1756  if (w_wc == (my_wc_t)escape && wildstr < wildend)
1757  {
1758  if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1759  (const unsigned char*)wildend)) <= 0)
1760  return 1;
1761  wildstr+= scan;
1762  escaped= 1;
1763  }
1764 
1765  if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1766  (const unsigned char*)str_end)) <= 0)
1767  return 1;
1768  str+= scan;
1769 
1770  if (!escaped && w_wc == (my_wc_t)w_one)
1771  {
1772  result= 1; /* Found an anchor char */
1773  }
1774  else
1775  {
1776  if (weights)
1777  {
1778  if (s_wc < 0x10000)
1779  {
1780  plane=(s_wc>>8) & 0xFF;
1781  s_wc = weights[plane] ? weights[plane][s_wc & 0xFF].sort : s_wc;
1782  }
1783  if (w_wc < 0x10000)
1784  {
1785  plane=(w_wc>>8) & 0xFF;
1786  w_wc = weights[plane] ? weights[plane][w_wc & 0xFF].sort : w_wc;
1787  }
1788  }
1789  if (s_wc != w_wc)
1790  return 1; /* No match */
1791  }
1792  if (wildstr == wildend)
1793  return (str != str_end); /* Match if both are at end */
1794  }
1795 
1796 
1797  if (w_wc == (my_wc_t)w_many)
1798  { /* Found w_many */
1799 
1800  /* Remove any '%' and '_' from the wild search string */
1801  for (; wildstr != wildend ;)
1802  {
1803  if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1804  (const unsigned char*)wildend)) <= 0)
1805  return 1;
1806 
1807  if (w_wc == (my_wc_t)w_many)
1808  {
1809  wildstr+= scan;
1810  continue;
1811  }
1812 
1813  if (w_wc == (my_wc_t)w_one)
1814  {
1815  wildstr+= scan;
1816  if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1817  (const unsigned char*)str_end)) <=0)
1818  return 1;
1819  str+= scan;
1820  continue;
1821  }
1822  break; /* Not a wild character */
1823  }
1824 
1825  if (wildstr == wildend)
1826  return 0; /* Ok if w_many is last */
1827 
1828  if (str == str_end)
1829  return -1;
1830 
1831  if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1832  (const unsigned char*)wildend)) <=0)
1833  return 1;
1834  wildstr+= scan;
1835 
1836  if (w_wc == (my_wc_t)escape)
1837  {
1838  if (wildstr < wildend)
1839  {
1840  if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1841  (const unsigned char*)wildend)) <=0)
1842  return 1;
1843  wildstr+= scan;
1844  }
1845  }
1846 
1847  while (1)
1848  {
1849  /* Skip until the first character from wildstr is found */
1850  while (str != str_end)
1851  {
1852  if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1853  (const unsigned char*)str_end)) <=0)
1854  return 1;
1855  if (weights)
1856  {
1857  plane=(s_wc>>8) & 0xFF;
1858  s_wc = weights[plane] ? weights[plane][s_wc & 0xFF].sort : s_wc;
1859  plane=(w_wc>>8) & 0xFF;
1860  w_wc = weights[plane] ? weights[plane][w_wc & 0xFF].sort : w_wc;
1861  }
1862 
1863  if (s_wc == w_wc)
1864  break;
1865  str+= scan;
1866  }
1867  if (str == str_end)
1868  return -1;
1869 
1870  str+= scan;
1871  result= my_wildcmp_unicode(cs, str, str_end, wildstr, wildend, escape, w_one, w_many, weights);
1872  if (result <= 0)
1873  return result;
1874  }
1875  }
1876  }
1877  return str != str_end;
1878 }
1879 
1880 
1881 int make_escape_code(const charset_info_st* cs, const char *escape)
1882 {
1883  my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
1884  my_wc_t escape_wc;
1885  int rc= mb_wc(cs, &escape_wc, (const unsigned char*) escape, (const unsigned char*) escape + strlen(escape));
1886  return rc > 0 ? escape_wc : '\\';
1887 }
1888 
1889 /*
1890  We consider bytes with code more than 127 as a letter.
1891  This garantees that word boundaries work fine with regular
1892  expressions. Note, there is no need to mark byte 255 as a
1893  letter, it is illegal byte in UTF8.
1894 */
1895 static unsigned char ctype_utf8mb4[]=
1896 {
1897  0,
1898  32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32,
1899  32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
1900  72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
1901  132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16,
1902  16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1903  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16,
1904  16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1905  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32,
1906  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1907  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1908  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1909  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1910  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1911  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1912  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1913  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0
1914 };
1915 
1916 
1917 static unsigned char to_lower_utf8mb4[]=
1918 {
1919  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
1920  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
1921  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
1922  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
1923  64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
1924  112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95,
1925  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
1926  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
1927  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
1928  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
1929  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
1930  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
1931  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
1932  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
1933  224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
1934  240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
1935 };
1936 
1937 
1938 static unsigned char to_upper_utf8mb4[]=
1939 {
1940  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
1941  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
1942  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
1943  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
1944  64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
1945  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
1946  96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
1947  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
1948  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
1949  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
1950  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
1951  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
1952  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
1953  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
1954  224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
1955  240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
1956 };
1957 
1958 
1959 static inline int
1960 bincmp_utf8mb4(const unsigned char *s, const unsigned char *se,
1961  const unsigned char *t, const unsigned char *te)
1962 {
1963  int slen= (int) (se - s), tlen= (int) (te - t);
1964  int len= min(slen, tlen);
1965  int cmp= memcmp(s, t, len);
1966  return cmp ? cmp : slen - tlen;
1967 }
1968 
1969 
1970 static int my_mb_wc_utf8mb4(const charset_info_st*, my_wc_t * pwc, const unsigned char *s, const unsigned char *e)
1971 {
1972  if (s >= e)
1973  return MY_CS_TOOSMALL;
1974 
1975  unsigned char c= s[0];
1976  if (c < 0x80)
1977  {
1978  *pwc= c;
1979  return 1;
1980  }
1981  else if (c < 0xc2)
1982  return MY_CS_ILSEQ;
1983  else if (c < 0xe0)
1984  {
1985  if (s + 2 > e) /* We need 2 characters */
1986  return MY_CS_TOOSMALL2;
1987 
1988  if (!((s[1] ^ 0x80) < 0x40))
1989  return MY_CS_ILSEQ;
1990 
1991  *pwc= ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
1992  return 2;
1993  }
1994  else if (c < 0xf0)
1995  {
1996  if (s + 3 > e) /* We need 3 characters */
1997  return MY_CS_TOOSMALL3;
1998 
1999  if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
2000  (c >= 0xe1 || s[1] >= 0xa0)))
2001  return MY_CS_ILSEQ;
2002 
2003  *pwc= ((my_wc_t) (c & 0x0f) << 12) |
2004  ((my_wc_t) (s[1] ^ 0x80) << 6) |
2005  (my_wc_t) (s[2] ^ 0x80);
2006  return 3;
2007  }
2008  else if (c < 0xf8)
2009  {
2010  if (s + 4 > e) /* We need 4 characters */
2011  return MY_CS_TOOSMALL4;
2012 
2013  if (!((s[1] ^ 0x80) < 0x40 &&
2014  (s[2] ^ 0x80) < 0x40 &&
2015  (s[3] ^ 0x80) < 0x40 &&
2016  (c >= 0xf1 || s[1] >= 0x90)))
2017  return MY_CS_ILSEQ;
2018  *pwc = ((my_wc_t) (c & 0x07) << 18) |
2019  ((my_wc_t) (s[1] ^ 0x80) << 12) |
2020  ((my_wc_t) (s[2] ^ 0x80) << 6) |
2021  (my_wc_t) (s[3] ^ 0x80);
2022  return 4;
2023  }
2024  return MY_CS_ILSEQ;
2025 }
2026 
2027 
2028 /*
2029  The same as above, but without range check
2030  for example, for a null-terminated string
2031 */
2032 static int
2033 my_mb_wc_utf8mb4_no_range(const charset_info_st*,
2034  my_wc_t *pwc, const unsigned char *s)
2035 {
2036  unsigned char c;
2037 
2038  c= s[0];
2039  if (c < 0x80)
2040  {
2041  *pwc = c;
2042  return 1;
2043  }
2044 
2045  if (c < 0xc2)
2046  return MY_CS_ILSEQ;
2047 
2048  if (c < 0xe0)
2049  {
2050  if (!((s[1] ^ 0x80) < 0x40))
2051  return MY_CS_ILSEQ;
2052 
2053  *pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
2054  return 2;
2055  }
2056 
2057  if (c < 0xf0)
2058  {
2059  if (!((s[1] ^ 0x80) < 0x40 &&
2060  (s[2] ^ 0x80) < 0x40 &&
2061  (c >= 0xe1 || s[1] >= 0xa0)))
2062  return MY_CS_ILSEQ;
2063  *pwc= ((my_wc_t) (c & 0x0f) << 12) |
2064  ((my_wc_t) (s[1] ^ 0x80) << 6) |
2065  (my_wc_t) (s[2] ^ 0x80);
2066 
2067  return 3;
2068  }
2069  else if (c < 0xf8)
2070  {
2071  if (!((s[1] ^ 0x80) < 0x40 &&
2072  (s[2] ^ 0x80) < 0x40 &&
2073  (s[3] ^ 0x80) < 0x40 &&
2074  (c >= 0xf1 || s[1] >= 0x90)))
2075  return MY_CS_ILSEQ;
2076  *pwc = ((my_wc_t) (c & 0x07) << 18) |
2077  ((my_wc_t) (s[1] ^ 0x80) << 12) |
2078  ((my_wc_t) (s[2] ^ 0x80) << 6) |
2079  (my_wc_t) (s[3] ^ 0x80);
2080  return 4;
2081  }
2082  return MY_CS_ILSEQ;
2083 }
2084 
2085 
2086 static int my_wc_mb_utf8mb4(const charset_info_st*, my_wc_t wc, unsigned char *r, unsigned char *e)
2087 {
2088  int count;
2089 
2090  if (r >= e)
2091  return MY_CS_TOOSMALL;
2092 
2093  if (wc < 0x80)
2094  count= 1;
2095  else if (wc < 0x800)
2096  count= 2;
2097  else if (wc < 0x10000)
2098  count= 3;
2099  else if (wc < 0x200000)
2100  count= 4;
2101  else return MY_CS_ILUNI;
2102 
2103  if (r + count > e)
2104  return -100 - count;
2105 
2106  switch (count)
2107  {
2108  /* Fall through all cases!!! */
2109  case 4: r[3] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x10000;
2110  case 3: r[2] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x800;
2111  case 2: r[1] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0xc0;
2112  case 1: r[0] = (unsigned char) wc;
2113  }
2114  return count;
2115 }
2116 
2117 
2118 /*
2119  The same as above, but without range check.
2120 */
2121 static int
2122 my_wc_mb_utf8mb4_no_range(const charset_info_st*,
2123  my_wc_t wc, unsigned char *r)
2124 {
2125  int count;
2126 
2127  if (wc < 0x80)
2128  count= 1;
2129  else if (wc < 0x800)
2130  count= 2;
2131  else if (wc < 0x10000)
2132  count= 3;
2133  else if (wc < 0x200000)
2134  count= 4;
2135  else
2136  return MY_CS_ILUNI;
2137 
2138  switch (count)
2139  {
2140  /* Fall through all cases!!! */
2141  case 4: r[3]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x10000;
2142  case 3: r[2]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x800;
2143  case 2: r[1]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0xc0;
2144  case 1: r[0]= (unsigned char) wc;
2145  }
2146  return count;
2147 }
2148 
2149 
2150 #define REPLACEMENT_CHAR 0xFFFD;
2151 
2152 
2153 static inline void
2154 my_tolower_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
2155 {
2156  int page= *wc >> 8;
2157  if (page < 256 && uni_plane[page])
2158  *wc= uni_plane[page][*wc & 0xFF].tolower;
2159 }
2160 
2161 
2162 static inline void
2163 my_toupper_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
2164 {
2165  int page= *wc >> 8;
2166  if (page < 256 && uni_plane[page])
2167  *wc= uni_plane[page][*wc & 0xFF].toupper;
2168 }
2169 
2170 
2171 static inline void
2172 my_tosort_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
2173 {
2174  int page= *wc >> 8;
2175  if (page < 256)
2176  {
2177  if (uni_plane[page])
2178  *wc= uni_plane[page][*wc & 0xFF].sort;
2179  }
2180  else
2181  {
2182  *wc= REPLACEMENT_CHAR;
2183  }
2184 }
2185 
2186 
2187 static size_t my_caseup_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
2188 {
2189  my_wc_t wc;
2190  int srcres, dstres;
2191  char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
2192  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2193  assert(src != dst || cs->caseup_multiply == 1);
2194 
2195  while ((src < srcend) &&
2196  (srcres= my_mb_wc_utf8mb4(cs, &wc,
2197  (unsigned char *) src, (unsigned char*) srcend)) > 0)
2198  {
2199  my_toupper_utf8mb4(uni_plane, &wc);
2200  if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
2201  break;
2202  src+= srcres;
2203  dst+= dstres;
2204  }
2205  return (size_t) (dst - dst0);
2206 }
2207 
2208 
2209 static inline void
2210 my_hash_add(uint32_t *n1, uint32_t *n2, uint32_t ch)
2211 {
2212  n1[0]^= (((n1[0] & 63) + n2[0]) * (ch)) + (n1[0] << 8);
2213  n2[0]+= 3;
2214 }
2215 
2216 
2217 void my_hash_sort_utf8mb4(const charset_info_st* cs,
2218  const unsigned char *s, size_t slen,
2219  uint32_t *n1, uint32_t *n2)
2220 {
2221  my_wc_t wc;
2222  int res;
2223  const unsigned char *e= s + slen;
2224  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2225 
2226  /*
2227  Remove end space. We do this to be able to compare
2228  'A ' and 'A' as identical
2229  */
2230  while (e > s && e[-1] == ' ')
2231  e--;
2232 
2233  while ((res= my_mb_wc_utf8mb4(cs, &wc, (const unsigned char*) s, (const unsigned char*) e)) > 0)
2234  {
2235  my_tosort_utf8mb4(uni_plane, &wc);
2236  my_hash_add(n1, n2, (uint32_t) (wc & 0xFF));
2237  my_hash_add(n1, n2, (uint32_t) (wc >> 8) & 0xFF);
2238  if (wc > 0xFFFF)
2239  {
2240  /*
2241  Put the highest byte only if it is non-zero,
2242  to make hash functions for utf8mb3 and utf8mb4
2243  compatible for BMP characters.
2244  This is useful to keep order of records in
2245  test results, e.g. for "SHOW GRANTS".
2246  */
2247  my_hash_add(n1, n2, (uint32_t) (wc >> 16) & 0xFF);
2248  }
2249  s+= res;
2250  }
2251 }
2252 
2253 
2254 static size_t my_caseup_str_utf8mb4(const charset_info_st* cs, char *src)
2255 {
2256  my_wc_t wc;
2257  int srcres, dstres;
2258  char *dst= src, *dst0= src;
2259  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2260  assert(cs->caseup_multiply == 1);
2261 
2262  while (*src &&
2263  (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
2264  {
2265  my_toupper_utf8mb4(uni_plane, &wc);
2266  if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
2267  break;
2268  src+= srcres;
2269  dst+= dstres;
2270  }
2271  *dst= '\0';
2272  return (size_t) (dst - dst0);
2273 }
2274 
2275 
2276 static size_t my_casedn_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
2277 {
2278  my_wc_t wc;
2279  int srcres, dstres;
2280  char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
2281  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2282  assert(src != dst || cs->casedn_multiply == 1);
2283 
2284  while ((src < srcend) &&
2285  (srcres= my_mb_wc_utf8mb4(cs, &wc,
2286  (unsigned char*) src, (unsigned char*) srcend)) > 0)
2287  {
2288  my_tolower_utf8mb4(uni_plane, &wc);
2289  if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
2290  break;
2291  src+= srcres;
2292  dst+= dstres;
2293  }
2294  return (size_t) (dst - dst0);
2295 }
2296 
2297 
2298 static size_t my_casedn_str_utf8mb4(const charset_info_st* cs, char *src)
2299 {
2300  my_wc_t wc;
2301  int srcres, dstres;
2302  char *dst= src, *dst0= src;
2303  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2304  assert(cs->casedn_multiply == 1);
2305 
2306  while (*src &&
2307  (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
2308  {
2309  my_tolower_utf8mb4(uni_plane, &wc);
2310  if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
2311  break;
2312  src+= srcres;
2313  dst+= dstres;
2314  }
2315 
2316  /*
2317  In rare cases lower string can be shorter than
2318  the original string, for example:
2319 
2320  "U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE"
2321  (which is 0xC4B0 in utf8, i.e. two bytes)
2322 
2323  is converted into
2324 
2325  "U+0069 LATIN SMALL LETTER I"
2326  (which is 0x69 in utf8, i.e. one byte)
2327 
2328  So, we need to put '\0' terminator after converting.
2329  */
2330 
2331  *dst= '\0';
2332  return (size_t) (dst - dst0);
2333 }
2334 
2335 
2336 static int my_strnncoll_utf8mb4(const charset_info_st* cs,
2337  const unsigned char *s, size_t slen,
2338  const unsigned char *t, size_t tlen,
2339  bool t_is_prefix)
2340 {
2341  my_wc_t s_wc=0;
2342  my_wc_t t_wc=0;
2343  const unsigned char *se= s + slen;
2344  const unsigned char *te= t + tlen;
2345  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2346 
2347  while ( s < se && t < te )
2348  {
2349  int s_res= my_mb_wc_utf8mb4(cs, &s_wc, s, se);
2350  int t_res= my_mb_wc_utf8mb4(cs, &t_wc, t, te);
2351 
2352  if ( s_res <= 0 || t_res <= 0 )
2353  {
2354  /* Incorrect string, compare bytewise */
2355  return bincmp_utf8mb4(s, se, t, te);
2356  }
2357 
2358  my_tosort_utf8mb4(uni_plane, &s_wc);
2359  my_tosort_utf8mb4(uni_plane, &t_wc);
2360 
2361  if ( s_wc != t_wc )
2362  {
2363  return s_wc > t_wc ? 1 : -1;
2364  }
2365 
2366  s+= s_res;
2367  t+= t_res;
2368  }
2369  return (int) (t_is_prefix ? (t - te) : ((se - s) - (te - t)));
2370 }
2371 
2372 
2401  const unsigned char *s, size_t slen,
2402  const unsigned char *t, size_t tlen,
2403  bool diff_if_only_endspace_difference)
2404 {
2405  int res;
2406  my_wc_t s_wc=0;
2407  my_wc_t t_wc=0;
2408  const unsigned char *se= s + slen, *te= t + tlen;
2409  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2410 
2411 #ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
2412  diff_if_only_endspace_difference= false;
2413 #endif
2414 
2415  while ( s < se && t < te )
2416  {
2417  int s_res= my_mb_wc_utf8mb4(cs, &s_wc, s, se);
2418  int t_res= my_mb_wc_utf8mb4(cs, &t_wc, t, te);
2419 
2420  if ( s_res <= 0 || t_res <= 0 )
2421  {
2422  /* Incorrect string, compare bytewise */
2423  return bincmp_utf8mb4(s, se, t, te);
2424  }
2425 
2426  my_tosort_utf8mb4(uni_plane, &s_wc);
2427  my_tosort_utf8mb4(uni_plane, &t_wc);
2428 
2429  if ( s_wc != t_wc )
2430  {
2431  return s_wc > t_wc ? 1 : -1;
2432  }
2433 
2434  s+=s_res;
2435  t+=t_res;
2436  }
2437 
2438  slen= (size_t) (se-s);
2439  tlen= (size_t) (te-t);
2440  res= 0;
2441 
2442  if (slen != tlen)
2443  {
2444  int swap= 1;
2445  if (diff_if_only_endspace_difference)
2446  res= 1; /* Assume 'a' is bigger */
2447  if (slen < tlen)
2448  {
2449  slen= tlen;
2450  s= t;
2451  se= te;
2452  swap= -1;
2453  res= -res;
2454  }
2455  /*
2456  This following loop uses the fact that in UTF-8
2457  all multibyte characters are greater than space,
2458  and all multibyte head characters are greater than
2459  space. It means if we meet a character greater
2460  than space, it always means that the longer string
2461  is greater. So we can reuse the same loop from the
2462  8bit version, without having to process full multibute
2463  sequences.
2464  */
2465  for ( ; s < se; s++)
2466  {
2467  if (*s != ' ')
2468  return (*s < ' ') ? -swap : swap;
2469  }
2470  }
2471  return res;
2472 }
2473 
2474 
2488 static int my_strcasecmp_utf8mb4(const charset_info_st* cs, const char *s, const char *t)
2489 {
2490  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2491  while (s[0] && t[0])
2492  {
2493  my_wc_t s_wc,t_wc;
2494 
2495  if ((unsigned char) s[0] < 128)
2496  {
2497  /*
2498  s[0] is between 0 and 127.
2499  It represents a single byte character.
2500  Convert it into weight according to collation.
2501  */
2502  s_wc= plane00[(unsigned char) s[0]].tolower;
2503  s++;
2504  }
2505  else
2506  {
2507  int res= my_mb_wc_utf8mb4_no_range(cs, &s_wc, (const unsigned char*) s);
2508 
2509  /*
2510  In the case of wrong multibyte sequence we will
2511  call strcmp() for byte-to-byte comparison.
2512  */
2513  if (res <= 0)
2514  return strcmp(s, t);
2515  s+= res;
2516 
2517  my_tolower_utf8mb4(uni_plane, &s_wc);
2518  }
2519 
2520 
2521  /* Do the same for the second string */
2522 
2523  if ((unsigned char) t[0] < 128)
2524  {
2525  /* Convert single byte character into weight */
2526  t_wc= plane00[(unsigned char) t[0]].tolower;
2527  t++;
2528  }
2529  else
2530  {
2531  int res= my_mb_wc_utf8mb4_no_range(cs, &t_wc, (const unsigned char*) t);
2532  if (res <= 0)
2533  return strcmp(s, t);
2534  t+= res;
2535 
2536  my_tolower_utf8mb4(uni_plane, &t_wc);
2537  }
2538 
2539  /* Now we have two weights, let's compare them */
2540  if ( s_wc != t_wc )
2541  return ((int) s_wc) - ((int) t_wc);
2542  }
2543  return ((int) (unsigned char) s[0]) - ((int) (unsigned char) t[0]);
2544 }
2545 
2546 
2547 static int my_wildcmp_utf8mb4(const charset_info_st* cs,
2548  const char *str, const char *strend,
2549  const char *wildstr, const char *wildend,
2550  int escape, int w_one, int w_many)
2551 {
2552  return my_wildcmp_unicode(cs, str, strend, wildstr, wildend, escape, w_one, w_many, cs->caseinfo);
2553 }
2554 
2555 
2556 static size_t my_strnxfrmlen_utf8mb4(const charset_info_st*, size_t len)
2557 {
2558  /* TODO: fix when working on WL "Unicode new version" */
2559  return (len * 2 + 2) / 4;
2560 }
2561 
2562 
2563 static size_t my_strnxfrm_utf8mb4(const charset_info_st* cs,
2564  unsigned char *dst, size_t dstlen, uint32_t nweights,
2565  const unsigned char *src, size_t srclen, uint32_t flags)
2566 {
2567  my_wc_t wc;
2568  int res;
2569  unsigned char *dst0= dst;
2570  unsigned char *de= dst + dstlen;
2571  unsigned char *de_beg= de - 1;
2572  const unsigned char *se = src + srclen;
2573  MY_UNICASE_INFO **uni_plane= (cs->state & MY_CS_BINSORT) ?
2574  NULL : cs->caseinfo;
2575 
2576  for (; dst < de_beg && nweights; nweights--)
2577  {
2578  if ((res= my_mb_wc_utf8mb4(cs,&wc, src, se)) <= 0)
2579  break;
2580  src+=res;
2581 
2582  if (uni_plane)
2583  my_tosort_utf8mb4(uni_plane, &wc);
2584 
2585  *dst++= (unsigned char)(wc >> 8);
2586  *dst++= (unsigned char)(wc & 0xFF);
2587 
2588  }
2589 
2590  if (dst < de && nweights && (flags & MY_STRXFRM_PAD_WITH_SPACE))
2591  {
2592  /* Fill the tail with keys for space character */
2593  for (; dst < de_beg && nweights; nweights--)
2594  {
2595  *dst++= 0x00;
2596  *dst++= 0x20;
2597  }
2598 
2599  if (dst < de) /* Clear the last byte, if "dstlen" was an odd number */
2600  *dst++= 0x00;
2601  }
2602  my_strxfrm_desc_and_reverse(dst0, dst, flags, 0);
2603  return dst - dst0;
2604 }
2605 
2606 
2607 static unsigned int my_ismbchar_utf8mb4(const charset_info_st* cs, const char *b, const char *e)
2608 {
2609  my_wc_t wc;
2610  int res= my_mb_wc_utf8mb4(cs,&wc, (const unsigned char*)b, (const unsigned char*)e);
2611  return (res > 1) ? res : 0;
2612 }
2613 
2614 
2615 static unsigned int my_mbcharlen_utf8mb4(const charset_info_st*, uint32_t c)
2616 {
2617  if (c < 0x80)
2618  return 1;
2619  if (c < 0xc2)
2620  return 0; /* Illegal mb head */
2621  if (c < 0xe0)
2622  return 2;
2623  if (c < 0xf0)
2624  return 3;
2625  if (c < 0xf8)
2626  return 4;
2627  return 0; /* Illegal mb head */;
2628 }
2629 
2630 
2631 static MY_COLLATION_HANDLER my_collation_utf8mb4_general_ci_handler=
2632 {
2633  NULL, /* init */
2634  my_strnncoll_utf8mb4,
2636  my_strnxfrm_utf8mb4,
2637  my_strnxfrmlen_utf8mb4,
2638  my_like_range_mb,
2639  my_wildcmp_utf8mb4,
2641  my_instr_mb,
2642  my_hash_sort_utf8mb4,
2643  my_propagate_complex
2644 };
2645 
2646 
2647 static MY_COLLATION_HANDLER my_collation_utf8mb4_bin_handler =
2648 {
2649  NULL, /* init */
2650  my_strnncoll_mb_bin,
2651  my_strnncollsp_mb_bin,
2652  my_strnxfrm_utf8mb4,
2653  my_strnxfrmlen_utf8mb4,
2654  my_like_range_mb,
2655  my_wildcmp_mb_bin,
2656  my_strcasecmp_mb_bin,
2657  my_instr_mb,
2658  my_hash_sort_mb_bin,
2659  my_propagate_simple
2660 };
2661 
2662 
2663 MY_CHARSET_HANDLER my_charset_utf8mb4_handler=
2664 {
2665  my_ismbchar_utf8mb4,
2666  my_mbcharlen_utf8mb4,
2667  my_numchars_mb,
2668  my_charpos_mb,
2669  my_well_formed_len_mb,
2670  my_lengthsp_8bit,
2671  my_numcells_mb,
2672  my_mb_wc_utf8mb4,
2673  my_wc_mb_utf8mb4,
2674  my_mb_ctype_mb,
2675  my_caseup_str_utf8mb4,
2676  my_casedn_str_utf8mb4,
2677  my_caseup_utf8mb4,
2678  my_casedn_utf8mb4,
2679  my_snprintf_8bit,
2680  my_long10_to_str_8bit,
2681  my_int64_t10_to_str_8bit,
2682  my_fill_8bit,
2683  my_strntol_8bit,
2684  my_strntoul_8bit,
2685  my_strntoll_8bit,
2686  my_strntoull_8bit,
2687  my_strntod_8bit,
2688  my_strtoll10_8bit,
2689  my_strntoull10rnd_8bit,
2690  my_scan_8bit
2691 };
2692 
2693 
2694 
2695 DRIZZLED_API charset_info_st my_charset_utf8mb4_general_ci=
2696 {
2697  45,0,0, /* number */
2698  MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */
2699  MY_UTF8MB4, /* cs name */
2700  MY_UTF8MB4_GENERAL_CI,/* name */
2701  "UTF-8 Unicode", /* comment */
2702  NULL, /* tailoring */
2703  ctype_utf8mb4, /* ctype */
2704  to_lower_utf8mb4, /* to_lower */
2705  to_upper_utf8mb4, /* to_upper */
2706  to_upper_utf8mb4, /* sort_order */
2707  NULL, /* contractions */
2708  NULL, /* sort_order_big*/
2709  NULL, /* tab_to_uni */
2710  NULL, /* tab_from_uni */
2711  my_unicase_default, /* caseinfo */
2712  NULL, /* state_map */
2713  NULL, /* ident_map */
2714  1, /* strxfrm_multiply */
2715  1, /* caseup_multiply */
2716  1, /* casedn_multiply */
2717  1, /* mbminlen */
2718  4, /* mbmaxlen */
2719  0, /* min_sort_char */
2720  0xFFFF, /* max_sort_char */
2721  ' ', /* pad char */
2722  1, /* levels_for_compare */
2723  1, /* levels_for_order */
2724  &my_charset_utf8mb4_handler,
2725  &my_collation_utf8mb4_general_ci_handler
2726 };
2727 
2728 
2729 DRIZZLED_API charset_info_st my_charset_utf8mb4_bin=
2730 {
2731  46,0,0, /* number */
2732  MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state */
2733  MY_UTF8MB4, /* cs name */
2734  MY_UTF8MB4_BIN, /* name */
2735  "UTF-8 Unicode", /* comment */
2736  NULL, /* tailoring */
2737  ctype_utf8mb4, /* ctype */
2738  to_lower_utf8mb4, /* to_lower */
2739  to_upper_utf8mb4, /* to_upper */
2740  NULL, /* sort_order */
2741  NULL, /* contractions */
2742  NULL, /* sort_order_big*/
2743  NULL, /* tab_to_uni */
2744  NULL, /* tab_from_uni */
2745  my_unicase_default, /* caseinfo */
2746  NULL, /* state_map */
2747  NULL, /* ident_map */
2748  1, /* strxfrm_multiply */
2749  1, /* caseup_multiply */
2750  1, /* casedn_multiply */
2751  1, /* mbminlen */
2752  4, /* mbmaxlen */
2753  0, /* min_sort_char */
2754  0xFFFF, /* max_sort_char */
2755  ' ', /* pad char */
2756  1, /* levels_for_compare */
2757  1, /* levels_for_order */
2758  &my_charset_utf8mb4_handler,
2759  &my_collation_utf8mb4_bin_handler
2760 };
2761 
2762 
2763 
2764 static inline int bincmp(const unsigned char *s, const unsigned char *se,
2765  const unsigned char *t, const unsigned char *te)
2766 {
2767  int slen= (int) (se-s), tlen= (int) (te-t);
2768  int len= min(slen,tlen);
2769  int cmp= memcmp(s,t,len);
2770  return cmp ? cmp : slen-tlen;
2771 }
2772 
2773 
2774 /*
2775  File system encoding components:
2776 
2777 Code range Pattern Number Used Unused Blocks
2778 -----------------------------------------------------------------------------
2779 00C0..017F [.][0..4][g..z] 5*20= 100 97 3 Latin1 Supplement + Ext A
2780 0370..03FF [.][5..9][g..z] 5*20= 100 88 12 Greek + Coptic
2781 0400..052F [.][g..z][0..6] 20*7= 140 140 137 Cyrillic
2782 0530..058F [.][g..z][7..8] 20*2= 40 38 2 Armenian
2783 2160..217F [.][g..z][9] 20*1= 20 16 4 Number Forms
2784 0180..02AF [.][g..z][a..k] 28*11=220 203 17 Latin Ext B + IPA
2785 1E00..0EFF [.][g..z][l..r] 20*7= 140 136 4 Latin Additional Extended
2786 1F00..1FFF [.][g..z][s..z] 20*8= 160 144 16 Greek Extended
2787 .... .... [.][a..f][g..z] 6*20= 120 0 120 RESERVED
2788 24B6..24E9 [.][@][a..z] 26 26 0 Enclosed Alphanumerics
2789 FF21..FF5A [.][a..z][@] 26 26 0 Full Width forms
2790 
2791 All other characters are encoded using five bytes:
2792 
2793 [.][0..9a..z][0..9a..z][0..9a..z][0..9a..z]
2794 
2795 */
2796 
2797 } /* namespace drizzled */
2798 
2799 #ifdef MY_TEST_UTF8
2800 #include <stdio.h>
2801 
2802 static void test_mb(charset_info_st *cs, unsigned char *s)
2803 {
2804  while(*s)
2805  {
2806  if (my_ismbhead_utf8(cs,*s))
2807  {
2808  uint32_t len=my_mbcharlen_utf8(cs,*s);
2809  while(len--)
2810  {
2811  printf("%c",*s);
2812  s++;
2813  }
2814  printf("\n");
2815  }
2816  else
2817  {
2818  printf("%c\n",*s);
2819  s++;
2820  }
2821  }
2822 }
2823 
2824 int main()
2825 {
2826  char str[1024]=" utf8 test проба ПЕРА по-РУССКИ";
2827  charset_info_st *cs;
2828 
2829  test_mb(cs,(unsigned char*)str);
2830 
2831  printf("orig :'%s'\n",str);
2832 
2833  my_caseup_utf8(cs,str,15);
2834  printf("caseup :'%s'\n",str);
2835 
2836  my_caseup_str_utf8(cs,str);
2837  printf("caseup_str:'%s'\n",str);
2838 
2839  my_casedn_utf8(cs,str,15);
2840  printf("casedn :'%s'\n",str);
2841 
2842  my_casedn_str_utf8(cs,str);
2843  printf("casedn_str:'%s'\n",str);
2844 
2845  return 0;
2846 }
2847 
2848 #endif