~drizzle-trunk/drizzle/development

1 by brian
clean slate
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
1802.10.2 by Monty Taylor
Update all of the copyright headers to include the correct address.
15
   Software Foundation, Inc., 51 Franklin Place - Suite 330, Boston,
16
   MA 02110-1301, USA */
1 by brian
clean slate
17
18
/* UTF8 according RFC 2279 */
19
/* Written by Alexander Barkov <bar@udm.net> */
20
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
21
#include <config.h>
1130.3.26 by Monty Taylor
Removed global.h from headers.
22
2173.2.1 by Monty Taylor
Fixes incorrect usage of include
23
#include <drizzled/internal/m_string.h>
2281.5.1 by Muhammad Umair
Merged charset declarations of global_charset_info.h and charset_info.h into charset.h header file.
24
#include <drizzled/charset.h>
1 by brian
clean slate
25
#include <errno.h>
26
1067.4.9 by Nathan Williams
Converted all usages of cmin/cmax in mystrings directory to use std::min/max
27
#include <algorithm>
28
1 by brian
clean slate
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
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
40
using namespace std;
41
42
namespace drizzled
43
{
44
2445.1.3 by Olaf van der Spek
Refactor
45
void my_hash_sort_utf8mb4(const charset_info_st* cs,
1085.1.2 by Monty Taylor
Fixed -Wmissing-declarations
46
                          const unsigned char *s, size_t slen,
47
                          uint32_t *n1, uint32_t *n2);
48
1 by brian
clean slate
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:
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1531
  1. LOWER(0x0049 LATIN CAPITAL LETTER I) ->
1 by brian
clean slate
1532
           0x0131 LATIN SMALL   LETTER DOTLESS I
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1533
  2. UPPER(0x0069 LATIN SMALL   LETTER I) ->
1 by brian
clean slate
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
1709
/**
1710
  Compare string against string with wildcard
1711
  This function is used for utf8mb3, utf8mb4, ucs2, utf16, utf32
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1712
1 by brian
clean slate
1713
  @param cs Character set.
1714
  @str      String.
1715
  @str_end  End of string.
1716
  @wildstr  Wildcard pattern.
1717
  @wildend  End of wildcard pattern.
1718
  @escape   Escape characters, typically \\.
1719
  @w_one    "One character", typically _.
1720
  @w_many   "Many characters", typically %.
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1721
1 by brian
clean slate
1722
  @return Comparison result.
1723
    @retval  0 if matched.
1724
    @retval -1 if not matched with wildcard.
1725
    @retval  1 if matched with wildcard.
1726
*/
1727
2445.1.3 by Olaf van der Spek
Refactor
1728
int my_wildcmp_unicode(const charset_info_st* cs,
1 by brian
clean slate
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 */
77.1.71 by Monty Taylor
Uninitialized use.
1735
  my_wc_t s_wc=0, w_wc=0;
1 by brian
clean slate
1736
  int scan, plane;
236.3.9 by Andrey Hristov
- Fix build of exotic, mostly non-western, charsets (--with-extra-charsets)
1737
  my_charset_conv_mb_wc mb_wc;
1 by brian
clean slate
1738
  mb_wc= cs->cset->mb_wc;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1739
1 by brian
clean slate
1740
  while (wildstr != wildend)
1741
  {
1742
    while (1)
1743
    {
276 by Brian Aker
Cleaned out my_bool from strings.
1744
      bool escaped= 0;
481 by Brian Aker
Remove all of uchar.
1745
      if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1746
                       (const unsigned char*)wildend)) <= 0)
1 by brian
clean slate
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
      {
481 by Brian Aker
Remove all of uchar.
1758
        if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1759
                         (const unsigned char*)wildend)) <= 0)
1 by brian
clean slate
1760
          return 1;
1761
        wildstr+= scan;
1762
        escaped= 1;
1763
      }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1764
481 by Brian Aker
Remove all of uchar.
1765
      if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1766
                       (const unsigned char*)str_end)) <= 0)
1 by brian
clean slate
1767
        return 1;
1768
      str+= scan;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1769
1 by brian
clean slate
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
    }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1795
1796
1 by brian
clean slate
1797
    if (w_wc == (my_wc_t)w_many)
1798
    {						/* Found w_many */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1799
1 by brian
clean slate
1800
      /* Remove any '%' and '_' from the wild search string */
1801
      for (; wildstr != wildend ;)
1802
      {
481 by Brian Aker
Remove all of uchar.
1803
        if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1804
                         (const unsigned char*)wildend)) <= 0)
1 by brian
clean slate
1805
          return 1;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1806
1 by brian
clean slate
1807
	if (w_wc == (my_wc_t)w_many)
1808
	{
1809
	  wildstr+= scan;
1810
	  continue;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1811
	}
1812
1 by brian
clean slate
1813
	if (w_wc == (my_wc_t)w_one)
1814
	{
1815
	  wildstr+= scan;
481 by Brian Aker
Remove all of uchar.
1816
          if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1817
                           (const unsigned char*)str_end)) <=0)
1 by brian
clean slate
1818
            return 1;
1819
          str+= scan;
1820
	  continue;
1821
	}
1822
	break;					/* Not a wild character */
1823
      }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1824
1 by brian
clean slate
1825
      if (wildstr == wildend)
1826
	return 0;				/* Ok if w_many is last */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1827
1 by brian
clean slate
1828
      if (str == str_end)
1829
	return -1;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1830
481 by Brian Aker
Remove all of uchar.
1831
      if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1832
                       (const unsigned char*)wildend)) <=0)
1 by brian
clean slate
1833
        return 1;
1834
      wildstr+= scan;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1835
1 by brian
clean slate
1836
      if (w_wc ==  (my_wc_t)escape)
1837
      {
1838
        if (wildstr < wildend)
1839
        {
481 by Brian Aker
Remove all of uchar.
1840
          if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
1841
                           (const unsigned char*)wildend)) <=0)
1 by brian
clean slate
1842
            return 1;
1843
          wildstr+= scan;
1844
        }
1845
      }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1846
1 by brian
clean slate
1847
      while (1)
1848
      {
1849
        /* Skip until the first character from wildstr is found */
1850
        while (str != str_end)
1851
        {
481 by Brian Aker
Remove all of uchar.
1852
          if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
1853
                           (const unsigned char*)str_end)) <=0)
1 by brian
clean slate
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
          }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1862
1 by brian
clean slate
1863
          if (s_wc == w_wc)
1864
            break;
1865
          str+= scan;
1866
        }
1867
        if (str == str_end)
1868
          return -1;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1869
1 by brian
clean slate
1870
        str+= scan;
2445.1.2 by Olaf van der Spek
Refactor
1871
        result= my_wildcmp_unicode(cs, str, str_end, wildstr, wildend, escape, w_one, w_many, weights);
1 by brian
clean slate
1872
        if (result <= 0)
1873
          return result;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
1874
      }
1 by brian
clean slate
1875
    }
1876
  }
2445.1.2 by Olaf van der Spek
Refactor
1877
  return str != str_end;
1 by brian
clean slate
1878
}
1879
1054.2.11 by Monty Taylor
Removed copy_and_convert.
1880
2445.1.2 by Olaf van der Spek
Refactor
1881
int make_escape_code(const charset_info_st* cs, const char *escape)
1054.2.11 by Monty Taylor
Removed copy_and_convert.
1882
{
1883
  my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
1884
  my_wc_t escape_wc;
2445.1.2 by Olaf van der Spek
Refactor
1885
  int rc= mb_wc(cs, &escape_wc, (const unsigned char*) escape, (const unsigned char*) escape + strlen(escape));
1886
  return rc > 0 ? escape_wc : '\\';
1054.2.11 by Monty Taylor
Removed copy_and_convert.
1887
}
1888
1 by brian
clean slate
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
*/
481 by Brian Aker
Remove all of uchar.
1895
static unsigned char ctype_utf8mb4[]=
1 by brian
clean slate
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
481 by Brian Aker
Remove all of uchar.
1917
static unsigned char to_lower_utf8mb4[]=
1 by brian
clean slate
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
481 by Brian Aker
Remove all of uchar.
1938
static unsigned char to_upper_utf8mb4[]=
1 by brian
clean slate
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
481 by Brian Aker
Remove all of uchar.
1960
bincmp_utf8mb4(const unsigned char *s, const unsigned char *se,
1961
               const unsigned char *t, const unsigned char *te)
1 by brian
clean slate
1962
{
1963
  int slen= (int) (se - s), tlen= (int) (te - t);
1067.4.9 by Nathan Williams
Converted all usages of cmin/cmax in mystrings directory to use std::min/max
1964
  int len= min(slen, tlen);
1 by brian
clean slate
1965
  int cmp= memcmp(s, t, len);
1966
  return cmp ? cmp : slen - tlen;
1967
}
1968
1969
2445.1.3 by Olaf van der Spek
Refactor
1970
static int my_mb_wc_utf8mb4(const charset_info_st*, my_wc_t * pwc, const unsigned char *s, const unsigned char *e)
1 by brian
clean slate
1971
{
1972
  if (s >= e)
1973
    return MY_CS_TOOSMALL;
1974
2445.1.3 by Olaf van der Spek
Refactor
1975
  unsigned char c= s[0];
1 by brian
clean slate
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
2445.1.3 by Olaf van der Spek
Refactor
2033
my_mb_wc_utf8mb4_no_range(const charset_info_st*,
481 by Brian Aker
Remove all of uchar.
2034
                          my_wc_t *pwc, const unsigned char *s)
1 by brian
clean slate
2035
{
481 by Brian Aker
Remove all of uchar.
2036
  unsigned char c;
1 by brian
clean slate
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
  }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2056
1 by brian
clean slate
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
2445.1.3 by Olaf van der Spek
Refactor
2086
static int my_wc_mb_utf8mb4(const charset_info_st*, my_wc_t wc, unsigned char *r, unsigned char *e)
1 by brian
clean slate
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)
2445.1.2 by Olaf van der Spek
Refactor
2104
    return -100 - count;
1 by brian
clean slate
2105
2445.1.2 by Olaf van der Spek
Refactor
2106
  switch (count) 
2107
  {
1 by brian
clean slate
2108
    /* Fall through all cases!!! */
481 by Brian Aker
Remove all of uchar.
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;
1 by brian
clean slate
2113
  }
2114
  return count;
2115
}
2116
2117
2118
/*
2119
  The same as above, but without range check.
2120
*/
2121
static int
2445.1.3 by Olaf van der Spek
Refactor
2122
my_wc_mb_utf8mb4_no_range(const charset_info_st*,
481 by Brian Aker
Remove all of uchar.
2123
                          my_wc_t wc, unsigned char *r)
1 by brian
clean slate
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!!! */
481 by Brian Aker
Remove all of uchar.
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;
1 by brian
clean slate
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
2445.1.3 by Olaf van der Spek
Refactor
2187
static size_t my_caseup_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
1 by brian
clean slate
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;
51.3.9 by Jay Pipes
Removal of DBUG from strings/ library
2193
  assert(src != dst || cs->caseup_multiply == 1);
1 by brian
clean slate
2194
2195
  while ((src < srcend) &&
2196
         (srcres= my_mb_wc_utf8mb4(cs, &wc,
481 by Brian Aker
Remove all of uchar.
2197
                                   (unsigned char *) src, (unsigned char*) srcend)) > 0)
1 by brian
clean slate
2198
  {
2199
    my_toupper_utf8mb4(uni_plane, &wc);
481 by Brian Aker
Remove all of uchar.
2200
    if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
1 by brian
clean slate
2201
      break;
2202
    src+= srcres;
2203
    dst+= dstres;
2204
  }
2205
  return (size_t) (dst - dst0);
2206
}
2207
2208
2209
static inline void
482 by Brian Aker
Remove uint.
2210
my_hash_add(uint32_t *n1, uint32_t *n2, uint32_t ch)
1 by brian
clean slate
2211
{
2212
  n1[0]^= (((n1[0] & 63) + n2[0]) * (ch)) + (n1[0] << 8);
2213
  n2[0]+= 3;
2214
}
2215
2216
2445.1.3 by Olaf van der Spek
Refactor
2217
void my_hash_sort_utf8mb4(const charset_info_st* cs,
612.2.11 by Monty Taylor
Cleanup up the extern+static combo (plus some attributes because I got bored.)
2218
                          const unsigned char *s, size_t slen,
2219
                          uint32_t *n1, uint32_t *n2)
1 by brian
clean slate
2220
{
2221
  my_wc_t wc;
2222
  int res;
481 by Brian Aker
Remove all of uchar.
2223
  const unsigned char *e= s + slen;
1 by brian
clean slate
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
481 by Brian Aker
Remove all of uchar.
2233
  while ((res= my_mb_wc_utf8mb4(cs, &wc, (const unsigned char*) s, (const unsigned char*) e)) > 0)
1 by brian
clean slate
2234
  {
2235
    my_tosort_utf8mb4(uni_plane, &wc);
895 by Brian Aker
Completion (?) of uint conversion.
2236
    my_hash_add(n1, n2, (uint32_t) (wc & 0xFF));
2237
    my_hash_add(n1, n2, (uint32_t) (wc >> 8)  & 0xFF);
1 by brian
clean slate
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
      */
895 by Brian Aker
Completion (?) of uint conversion.
2247
      my_hash_add(n1, n2, (uint32_t) (wc >> 16) & 0xFF);
1 by brian
clean slate
2248
    }
2249
    s+= res;
2250
  }
2251
}
2252
2253
2445.1.3 by Olaf van der Spek
Refactor
2254
static size_t my_caseup_str_utf8mb4(const charset_info_st* cs, char *src)
1 by brian
clean slate
2255
{
2256
  my_wc_t wc;
2257
  int srcres, dstres;
2258
  char *dst= src, *dst0= src;
2259
  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
51.3.9 by Jay Pipes
Removal of DBUG from strings/ library
2260
  assert(cs->caseup_multiply == 1);
1 by brian
clean slate
2261
2262
  while (*src &&
481 by Brian Aker
Remove all of uchar.
2263
         (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
1 by brian
clean slate
2264
  {
2265
    my_toupper_utf8mb4(uni_plane, &wc);
481 by Brian Aker
Remove all of uchar.
2266
    if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
1 by brian
clean slate
2267
      break;
2268
    src+= srcres;
2269
    dst+= dstres;
2270
  }
2271
  *dst= '\0';
2272
  return (size_t) (dst - dst0);
2273
}
2274
2275
2445.1.3 by Olaf van der Spek
Refactor
2276
static size_t my_casedn_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
1 by brian
clean slate
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;
51.3.9 by Jay Pipes
Removal of DBUG from strings/ library
2282
  assert(src != dst || cs->casedn_multiply == 1);
1 by brian
clean slate
2283
2284
  while ((src < srcend) &&
2285
         (srcres= my_mb_wc_utf8mb4(cs, &wc,
481 by Brian Aker
Remove all of uchar.
2286
                                   (unsigned char*) src, (unsigned char*) srcend)) > 0)
1 by brian
clean slate
2287
  {
2288
    my_tolower_utf8mb4(uni_plane, &wc);
481 by Brian Aker
Remove all of uchar.
2289
    if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
1 by brian
clean slate
2290
      break;
2291
    src+= srcres;
2292
    dst+= dstres;
2293
  }
2294
  return (size_t) (dst - dst0);
2295
}
2296
2297
2445.1.3 by Olaf van der Spek
Refactor
2298
static size_t my_casedn_str_utf8mb4(const charset_info_st* cs, char *src)
1 by brian
clean slate
2299
{
2300
  my_wc_t wc;
2301
  int srcres, dstres;
2302
  char *dst= src, *dst0= src;
2303
  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
51.3.9 by Jay Pipes
Removal of DBUG from strings/ library
2304
  assert(cs->casedn_multiply == 1);
1 by brian
clean slate
2305
2306
  while (*src &&
481 by Brian Aker
Remove all of uchar.
2307
         (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
1 by brian
clean slate
2308
  {
2309
    my_tolower_utf8mb4(uni_plane, &wc);
481 by Brian Aker
Remove all of uchar.
2310
    if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
1 by brian
clean slate
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
2445.1.3 by Olaf van der Spek
Refactor
2336
static int my_strnncoll_utf8mb4(const charset_info_st* cs,
481 by Brian Aker
Remove all of uchar.
2337
                     const unsigned char *s, size_t slen,
2338
                     const unsigned char *t, size_t tlen,
276 by Brian Aker
Cleaned out my_bool from strings.
2339
                     bool t_is_prefix)
1 by brian
clean slate
2340
{
435.1.2 by Monty
Fixed older compiler warning.
2341
  my_wc_t s_wc=0;
2342
  my_wc_t t_wc=0;
481 by Brian Aker
Remove all of uchar.
2343
  const unsigned char *se= s + slen;
2344
  const unsigned char *te= t + tlen;
1 by brian
clean slate
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);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2360
1 by brian
clean slate
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
2373
/**
2374
  Compare strings, discarding end space
2375
2376
  If one string is shorter as the other, then we space extend the other
2377
  so that the strings have equal length.
2378
2379
  This will ensure that the following things hold:
2380
2381
    "a"  == "a "
2382
    "a\0" < "a"
2383
    "a\0" < "a "
2384
2385
  @param  cs        Character set pinter.
2386
  @param  a         First string to compare.
2387
  @param  a_length  Length of 'a'.
2388
  @param  b         Second string to compare.
2389
  @param  b_length  Length of 'b'.
2390
  @param  diff_if_only_endspace_difference
2391
                    Set to 1 if the strings should be regarded as different
2392
                    if they only difference in end space
2393
2394
  @return Comparison result.
2395
    @retval Negative number, if a less than b.
2396
    @retval 0, if a is equal to b
2397
    @retval Positive number, if a > b
2398
*/
2399
2445.1.3 by Olaf van der Spek
Refactor
2400
static int my_strnncollsp_utf8mb4(const charset_info_st* cs,
481 by Brian Aker
Remove all of uchar.
2401
                       const unsigned char *s, size_t slen,
2402
                       const unsigned char *t, size_t tlen,
276 by Brian Aker
Cleaned out my_bool from strings.
2403
                       bool diff_if_only_endspace_difference)
1 by brian
clean slate
2404
{
2405
  int res;
435.1.2 by Monty
Fixed older compiler warning.
2406
  my_wc_t s_wc=0;
2407
  my_wc_t t_wc=0;
481 by Brian Aker
Remove all of uchar.
2408
  const unsigned char *se= s + slen, *te= t + tlen;
1 by brian
clean slate
2409
  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2410
2411
#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
163 by Brian Aker
Merge Monty's code.
2412
  diff_if_only_endspace_difference= false;
1 by brian
clean slate
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
2475
/**
2476
  Compare 0-terminated UTF8 strings.
2477
2478
  @param  cs                  character set handler
2479
  @param  s                   First 0-terminated string to compare
2480
  @param  t                   Second 0-terminated string to compare
2481
2482
  @return Comparison result.
2483
    @retval negative number if s < t
2484
    @retval positive number if s > t
2485
    @retval 0 is the strings are equal
2486
*/
2487
2445.1.3 by Olaf van der Spek
Refactor
2488
static int my_strcasecmp_utf8mb4(const charset_info_st* cs, const char *s, const char *t)
1 by brian
clean slate
2489
{
2490
  MY_UNICASE_INFO **uni_plane= cs->caseinfo;
2491
  while (s[0] && t[0])
2492
  {
2493
    my_wc_t s_wc,t_wc;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2494
481 by Brian Aker
Remove all of uchar.
2495
    if ((unsigned char) s[0] < 128)
1 by brian
clean slate
2496
    {
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2497
      /*
1 by brian
clean slate
2498
        s[0] is between 0 and 127.
2499
        It represents a single byte character.
2500
        Convert it into weight according to collation.
2501
      */
481 by Brian Aker
Remove all of uchar.
2502
      s_wc= plane00[(unsigned char) s[0]].tolower;
1 by brian
clean slate
2503
      s++;
2504
    }
2505
    else
2506
    {
481 by Brian Aker
Remove all of uchar.
2507
      int res= my_mb_wc_utf8mb4_no_range(cs, &s_wc, (const unsigned char*) s);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2508
2509
      /*
1 by brian
clean slate
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;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2516
1 by brian
clean slate
2517
      my_tolower_utf8mb4(uni_plane, &s_wc);
2518
    }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2519
2520
1 by brian
clean slate
2521
    /* Do the same for the second string */
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2522
481 by Brian Aker
Remove all of uchar.
2523
    if ((unsigned char) t[0] < 128)
1 by brian
clean slate
2524
    {
2525
      /* Convert single byte character into weight */
481 by Brian Aker
Remove all of uchar.
2526
      t_wc= plane00[(unsigned char) t[0]].tolower;
1 by brian
clean slate
2527
      t++;
2528
    }
2529
    else
2530
    {
481 by Brian Aker
Remove all of uchar.
2531
      int res= my_mb_wc_utf8mb4_no_range(cs, &t_wc, (const unsigned char*) t);
1 by brian
clean slate
2532
      if (res <= 0)
2533
        return strcmp(s, t);
2534
      t+= res;
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2535
1 by brian
clean slate
2536
      my_tolower_utf8mb4(uni_plane, &t_wc);
2537
    }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2538
1 by brian
clean slate
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
  }
481 by Brian Aker
Remove all of uchar.
2543
  return ((int) (unsigned char) s[0]) - ((int) (unsigned char) t[0]);
1 by brian
clean slate
2544
}
2545
2546
2445.1.3 by Olaf van der Spek
Refactor
2547
static int my_wildcmp_utf8mb4(const charset_info_st* cs,
1 by brian
clean slate
2548
                   const char *str, const char *strend,
2549
                   const char *wildstr, const char *wildend,
2550
                   int escape, int w_one, int w_many)
2551
{
2445.1.3 by Olaf van der Spek
Refactor
2552
  return my_wildcmp_unicode(cs, str, strend, wildstr, wildend, escape, w_one, w_many, cs->caseinfo);
1 by brian
clean slate
2553
}
2554
2555
2445.1.3 by Olaf van der Spek
Refactor
2556
static size_t my_strnxfrmlen_utf8mb4(const charset_info_st*, size_t len)
1 by brian
clean slate
2557
{
2558
  /* TODO: fix when working on WL "Unicode new version" */
2559
  return (len * 2 + 2) / 4;
2560
}
2561
2562
2445.1.3 by Olaf van der Spek
Refactor
2563
static size_t my_strnxfrm_utf8mb4(const charset_info_st* cs,
482 by Brian Aker
Remove uint.
2564
                    unsigned char *dst, size_t dstlen, uint32_t nweights,
2565
                    const unsigned char *src, size_t srclen, uint32_t flags)
1 by brian
clean slate
2566
{
2567
  my_wc_t wc;
2568
  int res;
481 by Brian Aker
Remove all of uchar.
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;
1 by brian
clean slate
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);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2584
481 by Brian Aker
Remove all of uchar.
2585
    *dst++= (unsigned char)(wc >> 8);
2586
    *dst++= (unsigned char)(wc & 0xFF);
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2587
1 by brian
clean slate
2588
  }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2589
1 by brian
clean slate
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
    }
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
2598
1 by brian
clean slate
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
2445.1.3 by Olaf van der Spek
Refactor
2607
static unsigned int my_ismbchar_utf8mb4(const charset_info_st* cs, const char *b, const char *e)
1 by brian
clean slate
2608
{
2609
  my_wc_t wc;
481 by Brian Aker
Remove all of uchar.
2610
  int res= my_mb_wc_utf8mb4(cs,&wc, (const unsigned char*)b, (const unsigned char*)e);
1 by brian
clean slate
2611
  return (res > 1) ? res : 0;
2612
}
2613
2614
2445.1.3 by Olaf van der Spek
Refactor
2615
static unsigned int my_mbcharlen_utf8mb4(const charset_info_st*, uint32_t c)
1 by brian
clean slate
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,
2635
  my_strnncollsp_utf8mb4,
2636
  my_strnxfrm_utf8mb4,
2637
  my_strnxfrmlen_utf8mb4,
2638
  my_like_range_mb,
2639
  my_wildcmp_utf8mb4,
2640
  my_strcasecmp_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,
152 by Brian Aker
longlong replacement
2681
  my_int64_t10_to_str_8bit,
1 by brian
clean slate
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
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
2695
DRIZZLED_API charset_info_st my_charset_utf8mb4_general_ci=
1 by brian
clean slate
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
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
2729
DRIZZLED_API charset_info_st my_charset_utf8mb4_bin=
1 by brian
clean slate
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
1054.2.18 by Monty Taylor
Removed my_charset_filename... since we no longer use it. (hip hip, hoorah!)
2762
1 by brian
clean slate
2763
481 by Brian Aker
Remove all of uchar.
2764
static inline int bincmp(const unsigned char *s, const unsigned char *se,
2765
                         const unsigned char *t, const unsigned char *te)
1 by brian
clean slate
2766
{
2767
  int slen= (int) (se-s), tlen= (int) (te-t);
1067.4.9 by Nathan Williams
Converted all usages of cmin/cmax in mystrings directory to use std::min/max
2768
  int len= min(slen,tlen);
1 by brian
clean slate
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
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
2797
} /* namespace drizzled */
1 by brian
clean slate
2798
2799
#ifdef MY_TEST_UTF8
2800
#include <stdio.h>
2801
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
2802
static void test_mb(charset_info_st *cs, unsigned char *s)
1 by brian
clean slate
2803
{
2804
  while(*s)
2805
  {
2806
    if (my_ismbhead_utf8(cs,*s))
2807
    {
482 by Brian Aker
Remove uint.
2808
      uint32_t len=my_mbcharlen_utf8(cs,*s);
1 by brian
clean slate
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 проба ПЕРА по-РУССКИ";
2254 by Brian Aker
Shift CHARSET_INFO to charset_info_st
2827
  charset_info_st *cs;
1 by brian
clean slate
2828
481 by Brian Aker
Remove all of uchar.
2829
  test_mb(cs,(unsigned char*)str);
1 by brian
clean slate
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