Drizzled Public API Documentation

ctype-utf8.cc
00001 /* Copyright (C) 2000 MySQL AB
00002 
00003    This library is free software; you can redistribute it and/or
00004    modify it under the terms of the GNU Library General Public
00005    License as published by the Free Software Foundation; version 2
00006    of the License.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public
00014    License along with this library; if not, write to the Free
00015    Software Foundation, Inc., 51 Franklin Place - Suite 330, Boston,
00016    MA 02110-1301, USA */
00017 
00018 /* UTF8 according RFC 2279 */
00019 /* Written by Alexander Barkov <bar@udm.net> */
00020 
00021 #include <config.h>
00022 
00023 #include <drizzled/internal/m_string.h>
00024 #include <drizzled/charset.h>
00025 #include <errno.h>
00026 
00027 #include <algorithm>
00028 
00029 #ifndef EILSEQ
00030 #define EILSEQ ENOENT
00031 #endif
00032 
00033 
00034 #define MY_UTF8MB3_GENERAL_CI MY_UTF8MB3 "_general_ci"
00035 #define MY_UTF8MB3_BIN        MY_UTF8MB3 "_bin"
00036 #define MY_UTF8MB4_GENERAL_CI MY_UTF8MB4 "_general_ci"
00037 #define MY_UTF8MB4_BIN        MY_UTF8MB4 "_bin"
00038 
00039 
00040 using namespace std;
00041 
00042 namespace drizzled
00043 {
00044 
00045 void my_hash_sort_utf8mb4(const charset_info_st* cs,
00046                           const unsigned char *s, size_t slen,
00047                           uint32_t *n1, uint32_t *n2);
00048 
00049 static MY_UNICASE_INFO plane00[]={
00050   {0x0000,0x0000,0x0000},  {0x0001,0x0001,0x0001},
00051   {0x0002,0x0002,0x0002},  {0x0003,0x0003,0x0003},
00052   {0x0004,0x0004,0x0004},  {0x0005,0x0005,0x0005},
00053   {0x0006,0x0006,0x0006},  {0x0007,0x0007,0x0007},
00054   {0x0008,0x0008,0x0008},  {0x0009,0x0009,0x0009},
00055   {0x000A,0x000A,0x000A},  {0x000B,0x000B,0x000B},
00056   {0x000C,0x000C,0x000C},  {0x000D,0x000D,0x000D},
00057   {0x000E,0x000E,0x000E},  {0x000F,0x000F,0x000F},
00058   {0x0010,0x0010,0x0010},  {0x0011,0x0011,0x0011},
00059   {0x0012,0x0012,0x0012},  {0x0013,0x0013,0x0013},
00060   {0x0014,0x0014,0x0014},  {0x0015,0x0015,0x0015},
00061   {0x0016,0x0016,0x0016},  {0x0017,0x0017,0x0017},
00062   {0x0018,0x0018,0x0018},  {0x0019,0x0019,0x0019},
00063   {0x001A,0x001A,0x001A},  {0x001B,0x001B,0x001B},
00064   {0x001C,0x001C,0x001C},  {0x001D,0x001D,0x001D},
00065   {0x001E,0x001E,0x001E},  {0x001F,0x001F,0x001F},
00066   {0x0020,0x0020,0x0020},  {0x0021,0x0021,0x0021},
00067   {0x0022,0x0022,0x0022},  {0x0023,0x0023,0x0023},
00068   {0x0024,0x0024,0x0024},  {0x0025,0x0025,0x0025},
00069   {0x0026,0x0026,0x0026},  {0x0027,0x0027,0x0027},
00070   {0x0028,0x0028,0x0028},  {0x0029,0x0029,0x0029},
00071   {0x002A,0x002A,0x002A},  {0x002B,0x002B,0x002B},
00072   {0x002C,0x002C,0x002C},  {0x002D,0x002D,0x002D},
00073   {0x002E,0x002E,0x002E},  {0x002F,0x002F,0x002F},
00074   {0x0030,0x0030,0x0030},  {0x0031,0x0031,0x0031},
00075   {0x0032,0x0032,0x0032},  {0x0033,0x0033,0x0033},
00076   {0x0034,0x0034,0x0034},  {0x0035,0x0035,0x0035},
00077   {0x0036,0x0036,0x0036},  {0x0037,0x0037,0x0037},
00078   {0x0038,0x0038,0x0038},  {0x0039,0x0039,0x0039},
00079   {0x003A,0x003A,0x003A},  {0x003B,0x003B,0x003B},
00080   {0x003C,0x003C,0x003C},  {0x003D,0x003D,0x003D},
00081   {0x003E,0x003E,0x003E},  {0x003F,0x003F,0x003F},
00082   {0x0040,0x0040,0x0040},  {0x0041,0x0061,0x0041},
00083   {0x0042,0x0062,0x0042},  {0x0043,0x0063,0x0043},
00084   {0x0044,0x0064,0x0044},  {0x0045,0x0065,0x0045},
00085   {0x0046,0x0066,0x0046},  {0x0047,0x0067,0x0047},
00086   {0x0048,0x0068,0x0048},  {0x0049,0x0069,0x0049},
00087   {0x004A,0x006A,0x004A},  {0x004B,0x006B,0x004B},
00088   {0x004C,0x006C,0x004C},  {0x004D,0x006D,0x004D},
00089   {0x004E,0x006E,0x004E},  {0x004F,0x006F,0x004F},
00090   {0x0050,0x0070,0x0050},  {0x0051,0x0071,0x0051},
00091   {0x0052,0x0072,0x0052},  {0x0053,0x0073,0x0053},
00092   {0x0054,0x0074,0x0054},  {0x0055,0x0075,0x0055},
00093   {0x0056,0x0076,0x0056},  {0x0057,0x0077,0x0057},
00094   {0x0058,0x0078,0x0058},  {0x0059,0x0079,0x0059},
00095   {0x005A,0x007A,0x005A},  {0x005B,0x005B,0x005B},
00096   {0x005C,0x005C,0x005C},  {0x005D,0x005D,0x005D},
00097   {0x005E,0x005E,0x005E},  {0x005F,0x005F,0x005F},
00098   {0x0060,0x0060,0x0060},  {0x0041,0x0061,0x0041},
00099   {0x0042,0x0062,0x0042},  {0x0043,0x0063,0x0043},
00100   {0x0044,0x0064,0x0044},  {0x0045,0x0065,0x0045},
00101   {0x0046,0x0066,0x0046},  {0x0047,0x0067,0x0047},
00102   {0x0048,0x0068,0x0048},  {0x0049,0x0069,0x0049},
00103   {0x004A,0x006A,0x004A},  {0x004B,0x006B,0x004B},
00104   {0x004C,0x006C,0x004C},  {0x004D,0x006D,0x004D},
00105   {0x004E,0x006E,0x004E},  {0x004F,0x006F,0x004F},
00106   {0x0050,0x0070,0x0050},  {0x0051,0x0071,0x0051},
00107   {0x0052,0x0072,0x0052},  {0x0053,0x0073,0x0053},
00108   {0x0054,0x0074,0x0054},  {0x0055,0x0075,0x0055},
00109   {0x0056,0x0076,0x0056},  {0x0057,0x0077,0x0057},
00110   {0x0058,0x0078,0x0058},  {0x0059,0x0079,0x0059},
00111   {0x005A,0x007A,0x005A},  {0x007B,0x007B,0x007B},
00112   {0x007C,0x007C,0x007C},  {0x007D,0x007D,0x007D},
00113   {0x007E,0x007E,0x007E},  {0x007F,0x007F,0x007F},
00114   {0x0080,0x0080,0x0080},  {0x0081,0x0081,0x0081},
00115   {0x0082,0x0082,0x0082},  {0x0083,0x0083,0x0083},
00116   {0x0084,0x0084,0x0084},  {0x0085,0x0085,0x0085},
00117   {0x0086,0x0086,0x0086},  {0x0087,0x0087,0x0087},
00118   {0x0088,0x0088,0x0088},  {0x0089,0x0089,0x0089},
00119   {0x008A,0x008A,0x008A},  {0x008B,0x008B,0x008B},
00120   {0x008C,0x008C,0x008C},  {0x008D,0x008D,0x008D},
00121   {0x008E,0x008E,0x008E},  {0x008F,0x008F,0x008F},
00122   {0x0090,0x0090,0x0090},  {0x0091,0x0091,0x0091},
00123   {0x0092,0x0092,0x0092},  {0x0093,0x0093,0x0093},
00124   {0x0094,0x0094,0x0094},  {0x0095,0x0095,0x0095},
00125   {0x0096,0x0096,0x0096},  {0x0097,0x0097,0x0097},
00126   {0x0098,0x0098,0x0098},  {0x0099,0x0099,0x0099},
00127   {0x009A,0x009A,0x009A},  {0x009B,0x009B,0x009B},
00128   {0x009C,0x009C,0x009C},  {0x009D,0x009D,0x009D},
00129   {0x009E,0x009E,0x009E},  {0x009F,0x009F,0x009F},
00130   {0x00A0,0x00A0,0x00A0},  {0x00A1,0x00A1,0x00A1},
00131   {0x00A2,0x00A2,0x00A2},  {0x00A3,0x00A3,0x00A3},
00132   {0x00A4,0x00A4,0x00A4},  {0x00A5,0x00A5,0x00A5},
00133   {0x00A6,0x00A6,0x00A6},  {0x00A7,0x00A7,0x00A7},
00134   {0x00A8,0x00A8,0x00A8},  {0x00A9,0x00A9,0x00A9},
00135   {0x00AA,0x00AA,0x00AA},  {0x00AB,0x00AB,0x00AB},
00136   {0x00AC,0x00AC,0x00AC},  {0x00AD,0x00AD,0x00AD},
00137   {0x00AE,0x00AE,0x00AE},  {0x00AF,0x00AF,0x00AF},
00138   {0x00B0,0x00B0,0x00B0},  {0x00B1,0x00B1,0x00B1},
00139   {0x00B2,0x00B2,0x00B2},  {0x00B3,0x00B3,0x00B3},
00140   {0x00B4,0x00B4,0x00B4},  {0x039C,0x00B5,0x039C},
00141   {0x00B6,0x00B6,0x00B6},  {0x00B7,0x00B7,0x00B7},
00142   {0x00B8,0x00B8,0x00B8},  {0x00B9,0x00B9,0x00B9},
00143   {0x00BA,0x00BA,0x00BA},  {0x00BB,0x00BB,0x00BB},
00144   {0x00BC,0x00BC,0x00BC},  {0x00BD,0x00BD,0x00BD},
00145   {0x00BE,0x00BE,0x00BE},  {0x00BF,0x00BF,0x00BF},
00146   {0x00C0,0x00E0,0x0041},  {0x00C1,0x00E1,0x0041},
00147   {0x00C2,0x00E2,0x0041},  {0x00C3,0x00E3,0x0041},
00148   {0x00C4,0x00E4,0x0041},  {0x00C5,0x00E5,0x0041},
00149   {0x00C6,0x00E6,0x00C6},  {0x00C7,0x00E7,0x0043},
00150   {0x00C8,0x00E8,0x0045},  {0x00C9,0x00E9,0x0045},
00151   {0x00CA,0x00EA,0x0045},  {0x00CB,0x00EB,0x0045},
00152   {0x00CC,0x00EC,0x0049},  {0x00CD,0x00ED,0x0049},
00153   {0x00CE,0x00EE,0x0049},  {0x00CF,0x00EF,0x0049},
00154   {0x00D0,0x00F0,0x00D0},  {0x00D1,0x00F1,0x004E},
00155   {0x00D2,0x00F2,0x004F},  {0x00D3,0x00F3,0x004F},
00156   {0x00D4,0x00F4,0x004F},  {0x00D5,0x00F5,0x004F},
00157   {0x00D6,0x00F6,0x004F},  {0x00D7,0x00D7,0x00D7},
00158   {0x00D8,0x00F8,0x00D8},  {0x00D9,0x00F9,0x0055},
00159   {0x00DA,0x00FA,0x0055},  {0x00DB,0x00FB,0x0055},
00160   {0x00DC,0x00FC,0x0055},  {0x00DD,0x00FD,0x0059},
00161   {0x00DE,0x00FE,0x00DE},  {0x00DF,0x00DF,0x0053},
00162   {0x00C0,0x00E0,0x0041},  {0x00C1,0x00E1,0x0041},
00163   {0x00C2,0x00E2,0x0041},  {0x00C3,0x00E3,0x0041},
00164   {0x00C4,0x00E4,0x0041},  {0x00C5,0x00E5,0x0041},
00165   {0x00C6,0x00E6,0x00C6},  {0x00C7,0x00E7,0x0043},
00166   {0x00C8,0x00E8,0x0045},  {0x00C9,0x00E9,0x0045},
00167   {0x00CA,0x00EA,0x0045},  {0x00CB,0x00EB,0x0045},
00168   {0x00CC,0x00EC,0x0049},  {0x00CD,0x00ED,0x0049},
00169   {0x00CE,0x00EE,0x0049},  {0x00CF,0x00EF,0x0049},
00170   {0x00D0,0x00F0,0x00D0},  {0x00D1,0x00F1,0x004E},
00171   {0x00D2,0x00F2,0x004F},  {0x00D3,0x00F3,0x004F},
00172   {0x00D4,0x00F4,0x004F},  {0x00D5,0x00F5,0x004F},
00173   {0x00D6,0x00F6,0x004F},  {0x00F7,0x00F7,0x00F7},
00174   {0x00D8,0x00F8,0x00D8},  {0x00D9,0x00F9,0x0055},
00175   {0x00DA,0x00FA,0x0055},  {0x00DB,0x00FB,0x0055},
00176   {0x00DC,0x00FC,0x0055},  {0x00DD,0x00FD,0x0059},
00177   {0x00DE,0x00FE,0x00DE},  {0x0178,0x00FF,0x0059}
00178 };
00179 
00180 
00181 
00182 static MY_UNICASE_INFO plane01[]={
00183   {0x0100,0x0101,0x0041},  {0x0100,0x0101,0x0041},
00184   {0x0102,0x0103,0x0041},  {0x0102,0x0103,0x0041},
00185   {0x0104,0x0105,0x0041},  {0x0104,0x0105,0x0041},
00186   {0x0106,0x0107,0x0043},  {0x0106,0x0107,0x0043},
00187   {0x0108,0x0109,0x0043},  {0x0108,0x0109,0x0043},
00188   {0x010A,0x010B,0x0043},  {0x010A,0x010B,0x0043},
00189   {0x010C,0x010D,0x0043},  {0x010C,0x010D,0x0043},
00190   {0x010E,0x010F,0x0044},  {0x010E,0x010F,0x0044},
00191   {0x0110,0x0111,0x0110},  {0x0110,0x0111,0x0110},
00192   {0x0112,0x0113,0x0045},  {0x0112,0x0113,0x0045},
00193   {0x0114,0x0115,0x0045},  {0x0114,0x0115,0x0045},
00194   {0x0116,0x0117,0x0045},  {0x0116,0x0117,0x0045},
00195   {0x0118,0x0119,0x0045},  {0x0118,0x0119,0x0045},
00196   {0x011A,0x011B,0x0045},  {0x011A,0x011B,0x0045},
00197   {0x011C,0x011D,0x0047},  {0x011C,0x011D,0x0047},
00198   {0x011E,0x011F,0x0047},  {0x011E,0x011F,0x0047},
00199   {0x0120,0x0121,0x0047},  {0x0120,0x0121,0x0047},
00200   {0x0122,0x0123,0x0047},  {0x0122,0x0123,0x0047},
00201   {0x0124,0x0125,0x0048},  {0x0124,0x0125,0x0048},
00202   {0x0126,0x0127,0x0126},  {0x0126,0x0127,0x0126},
00203   {0x0128,0x0129,0x0049},  {0x0128,0x0129,0x0049},
00204   {0x012A,0x012B,0x0049},  {0x012A,0x012B,0x0049},
00205   {0x012C,0x012D,0x0049},  {0x012C,0x012D,0x0049},
00206   {0x012E,0x012F,0x0049},  {0x012E,0x012F,0x0049},
00207   {0x0130,0x0069,0x0049},  {0x0049,0x0131,0x0049},
00208   {0x0132,0x0133,0x0132},  {0x0132,0x0133,0x0132},
00209   {0x0134,0x0135,0x004A},  {0x0134,0x0135,0x004A},
00210   {0x0136,0x0137,0x004B},  {0x0136,0x0137,0x004B},
00211   {0x0138,0x0138,0x0138},  {0x0139,0x013A,0x004C},
00212   {0x0139,0x013A,0x004C},  {0x013B,0x013C,0x004C},
00213   {0x013B,0x013C,0x004C},  {0x013D,0x013E,0x004C},
00214   {0x013D,0x013E,0x004C},  {0x013F,0x0140,0x013F},
00215   {0x013F,0x0140,0x013F},  {0x0141,0x0142,0x0141},
00216   {0x0141,0x0142,0x0141},  {0x0143,0x0144,0x004E},
00217   {0x0143,0x0144,0x004E},  {0x0145,0x0146,0x004E},
00218   {0x0145,0x0146,0x004E},  {0x0147,0x0148,0x004E},
00219   {0x0147,0x0148,0x004E},  {0x0149,0x0149,0x0149},
00220   {0x014A,0x014B,0x014A},  {0x014A,0x014B,0x014A},
00221   {0x014C,0x014D,0x004F},  {0x014C,0x014D,0x004F},
00222   {0x014E,0x014F,0x004F},  {0x014E,0x014F,0x004F},
00223   {0x0150,0x0151,0x004F},  {0x0150,0x0151,0x004F},
00224   {0x0152,0x0153,0x0152},  {0x0152,0x0153,0x0152},
00225   {0x0154,0x0155,0x0052},  {0x0154,0x0155,0x0052},
00226   {0x0156,0x0157,0x0052},  {0x0156,0x0157,0x0052},
00227   {0x0158,0x0159,0x0052},  {0x0158,0x0159,0x0052},
00228   {0x015A,0x015B,0x0053},  {0x015A,0x015B,0x0053},
00229   {0x015C,0x015D,0x0053},  {0x015C,0x015D,0x0053},
00230   {0x015E,0x015F,0x0053},  {0x015E,0x015F,0x0053},
00231   {0x0160,0x0161,0x0053},  {0x0160,0x0161,0x0053},
00232   {0x0162,0x0163,0x0054},  {0x0162,0x0163,0x0054},
00233   {0x0164,0x0165,0x0054},  {0x0164,0x0165,0x0054},
00234   {0x0166,0x0167,0x0166},  {0x0166,0x0167,0x0166},
00235   {0x0168,0x0169,0x0055},  {0x0168,0x0169,0x0055},
00236   {0x016A,0x016B,0x0055},  {0x016A,0x016B,0x0055},
00237   {0x016C,0x016D,0x0055},  {0x016C,0x016D,0x0055},
00238   {0x016E,0x016F,0x0055},  {0x016E,0x016F,0x0055},
00239   {0x0170,0x0171,0x0055},  {0x0170,0x0171,0x0055},
00240   {0x0172,0x0173,0x0055},  {0x0172,0x0173,0x0055},
00241   {0x0174,0x0175,0x0057},  {0x0174,0x0175,0x0057},
00242   {0x0176,0x0177,0x0059},  {0x0176,0x0177,0x0059},
00243   {0x0178,0x00FF,0x0059},  {0x0179,0x017A,0x005A},
00244   {0x0179,0x017A,0x005A},  {0x017B,0x017C,0x005A},
00245   {0x017B,0x017C,0x005A},  {0x017D,0x017E,0x005A},
00246   {0x017D,0x017E,0x005A},  {0x0053,0x017F,0x0053},
00247   {0x0180,0x0180,0x0180},  {0x0181,0x0253,0x0181},
00248   {0x0182,0x0183,0x0182},  {0x0182,0x0183,0x0182},
00249   {0x0184,0x0185,0x0184},  {0x0184,0x0185,0x0184},
00250   {0x0186,0x0254,0x0186},  {0x0187,0x0188,0x0187},
00251   {0x0187,0x0188,0x0187},  {0x0189,0x0256,0x0189},
00252   {0x018A,0x0257,0x018A},  {0x018B,0x018C,0x018B},
00253   {0x018B,0x018C,0x018B},  {0x018D,0x018D,0x018D},
00254   {0x018E,0x01DD,0x018E},  {0x018F,0x0259,0x018F},
00255   {0x0190,0x025B,0x0190},  {0x0191,0x0192,0x0191},
00256   {0x0191,0x0192,0x0191},  {0x0193,0x0260,0x0193},
00257   {0x0194,0x0263,0x0194},  {0x01F6,0x0195,0x01F6},
00258   {0x0196,0x0269,0x0196},  {0x0197,0x0268,0x0197},
00259   {0x0198,0x0199,0x0198},  {0x0198,0x0199,0x0198},
00260   {0x019A,0x019A,0x019A},  {0x019B,0x019B,0x019B},
00261   {0x019C,0x026F,0x019C},  {0x019D,0x0272,0x019D},
00262   {0x019E,0x019E,0x019E},  {0x019F,0x0275,0x019F},
00263   {0x01A0,0x01A1,0x004F},  {0x01A0,0x01A1,0x004F},
00264   {0x01A2,0x01A3,0x01A2},  {0x01A2,0x01A3,0x01A2},
00265   {0x01A4,0x01A5,0x01A4},  {0x01A4,0x01A5,0x01A4},
00266   {0x01A6,0x0280,0x01A6},  {0x01A7,0x01A8,0x01A7},
00267   {0x01A7,0x01A8,0x01A7},  {0x01A9,0x0283,0x01A9},
00268   {0x01AA,0x01AA,0x01AA},  {0x01AB,0x01AB,0x01AB},
00269   {0x01AC,0x01AD,0x01AC},  {0x01AC,0x01AD,0x01AC},
00270   {0x01AE,0x0288,0x01AE},  {0x01AF,0x01B0,0x0055},
00271   {0x01AF,0x01B0,0x0055},  {0x01B1,0x028A,0x01B1},
00272   {0x01B2,0x028B,0x01B2},  {0x01B3,0x01B4,0x01B3},
00273   {0x01B3,0x01B4,0x01B3},  {0x01B5,0x01B6,0x01B5},
00274   {0x01B5,0x01B6,0x01B5},  {0x01B7,0x0292,0x01B7},
00275   {0x01B8,0x01B9,0x01B8},  {0x01B8,0x01B9,0x01B8},
00276   {0x01BA,0x01BA,0x01BA},  {0x01BB,0x01BB,0x01BB},
00277   {0x01BC,0x01BD,0x01BC},  {0x01BC,0x01BD,0x01BC},
00278   {0x01BE,0x01BE,0x01BE},  {0x01F7,0x01BF,0x01F7},
00279   {0x01C0,0x01C0,0x01C0},  {0x01C1,0x01C1,0x01C1},
00280   {0x01C2,0x01C2,0x01C2},  {0x01C3,0x01C3,0x01C3},
00281   {0x01C4,0x01C6,0x01C4},  {0x01C4,0x01C6,0x01C4},
00282   {0x01C4,0x01C6,0x01C4},  {0x01C7,0x01C9,0x01C7},
00283   {0x01C7,0x01C9,0x01C7},  {0x01C7,0x01C9,0x01C7},
00284   {0x01CA,0x01CC,0x01CA},  {0x01CA,0x01CC,0x01CA},
00285   {0x01CA,0x01CC,0x01CA},  {0x01CD,0x01CE,0x0041},
00286   {0x01CD,0x01CE,0x0041},  {0x01CF,0x01D0,0x0049},
00287   {0x01CF,0x01D0,0x0049},  {0x01D1,0x01D2,0x004F},
00288   {0x01D1,0x01D2,0x004F},  {0x01D3,0x01D4,0x0055},
00289   {0x01D3,0x01D4,0x0055},  {0x01D5,0x01D6,0x0055},
00290   {0x01D5,0x01D6,0x0055},  {0x01D7,0x01D8,0x0055},
00291   {0x01D7,0x01D8,0x0055},  {0x01D9,0x01DA,0x0055},
00292   {0x01D9,0x01DA,0x0055},  {0x01DB,0x01DC,0x0055},
00293   {0x01DB,0x01DC,0x0055},  {0x018E,0x01DD,0x018E},
00294   {0x01DE,0x01DF,0x0041},  {0x01DE,0x01DF,0x0041},
00295   {0x01E0,0x01E1,0x0041},  {0x01E0,0x01E1,0x0041},
00296   {0x01E2,0x01E3,0x00C6},  {0x01E2,0x01E3,0x00C6},
00297   {0x01E4,0x01E5,0x01E4},  {0x01E4,0x01E5,0x01E4},
00298   {0x01E6,0x01E7,0x0047},  {0x01E6,0x01E7,0x0047},
00299   {0x01E8,0x01E9,0x004B},  {0x01E8,0x01E9,0x004B},
00300   {0x01EA,0x01EB,0x004F},  {0x01EA,0x01EB,0x004F},
00301   {0x01EC,0x01ED,0x004F},  {0x01EC,0x01ED,0x004F},
00302   {0x01EE,0x01EF,0x01B7},  {0x01EE,0x01EF,0x01B7},
00303   {0x01F0,0x01F0,0x004A},  {0x01F1,0x01F3,0x01F1},
00304   {0x01F1,0x01F3,0x01F1},  {0x01F1,0x01F3,0x01F1},
00305   {0x01F4,0x01F5,0x0047},  {0x01F4,0x01F5,0x0047},
00306   {0x01F6,0x0195,0x01F6},  {0x01F7,0x01BF,0x01F7},
00307   {0x01F8,0x01F9,0x004E},  {0x01F8,0x01F9,0x004E},
00308   {0x01FA,0x01FB,0x0041},  {0x01FA,0x01FB,0x0041},
00309   {0x01FC,0x01FD,0x00C6},  {0x01FC,0x01FD,0x00C6},
00310   {0x01FE,0x01FF,0x00D8},  {0x01FE,0x01FF,0x00D8}
00311 };
00312 
00313 static MY_UNICASE_INFO plane02[]={
00314   {0x0200,0x0201,0x0041},  {0x0200,0x0201,0x0041},
00315   {0x0202,0x0203,0x0041},  {0x0202,0x0203,0x0041},
00316   {0x0204,0x0205,0x0045},  {0x0204,0x0205,0x0045},
00317   {0x0206,0x0207,0x0045},  {0x0206,0x0207,0x0045},
00318   {0x0208,0x0209,0x0049},  {0x0208,0x0209,0x0049},
00319   {0x020A,0x020B,0x0049},  {0x020A,0x020B,0x0049},
00320   {0x020C,0x020D,0x004F},  {0x020C,0x020D,0x004F},
00321   {0x020E,0x020F,0x004F},  {0x020E,0x020F,0x004F},
00322   {0x0210,0x0211,0x0052},  {0x0210,0x0211,0x0052},
00323   {0x0212,0x0213,0x0052},  {0x0212,0x0213,0x0052},
00324   {0x0214,0x0215,0x0055},  {0x0214,0x0215,0x0055},
00325   {0x0216,0x0217,0x0055},  {0x0216,0x0217,0x0055},
00326   {0x0218,0x0219,0x0053},  {0x0218,0x0219,0x0053},
00327   {0x021A,0x021B,0x0054},  {0x021A,0x021B,0x0054},
00328   {0x021C,0x021D,0x021C},  {0x021C,0x021D,0x021C},
00329   {0x021E,0x021F,0x0048},  {0x021E,0x021F,0x0048},
00330   {0x0220,0x0220,0x0220},  {0x0221,0x0221,0x0221},
00331   {0x0222,0x0223,0x0222},  {0x0222,0x0223,0x0222},
00332   {0x0224,0x0225,0x0224},  {0x0224,0x0225,0x0224},
00333   {0x0226,0x0227,0x0041},  {0x0226,0x0227,0x0041},
00334   {0x0228,0x0229,0x0045},  {0x0228,0x0229,0x0045},
00335   {0x022A,0x022B,0x004F},  {0x022A,0x022B,0x004F},
00336   {0x022C,0x022D,0x004F},  {0x022C,0x022D,0x004F},
00337   {0x022E,0x022F,0x004F},  {0x022E,0x022F,0x004F},
00338   {0x0230,0x0231,0x004F},  {0x0230,0x0231,0x004F},
00339   {0x0232,0x0233,0x0059},  {0x0232,0x0233,0x0059},
00340   {0x0234,0x0234,0x0234},  {0x0235,0x0235,0x0235},
00341   {0x0236,0x0236,0x0236},  {0x0237,0x0237,0x0237},
00342   {0x0238,0x0238,0x0238},  {0x0239,0x0239,0x0239},
00343   {0x023A,0x023A,0x023A},  {0x023B,0x023B,0x023B},
00344   {0x023C,0x023C,0x023C},  {0x023D,0x023D,0x023D},
00345   {0x023E,0x023E,0x023E},  {0x023F,0x023F,0x023F},
00346   {0x0240,0x0240,0x0240},  {0x0241,0x0241,0x0241},
00347   {0x0242,0x0242,0x0242},  {0x0243,0x0243,0x0243},
00348   {0x0244,0x0244,0x0244},  {0x0245,0x0245,0x0245},
00349   {0x0246,0x0246,0x0246},  {0x0247,0x0247,0x0247},
00350   {0x0248,0x0248,0x0248},  {0x0249,0x0249,0x0249},
00351   {0x024A,0x024A,0x024A},  {0x024B,0x024B,0x024B},
00352   {0x024C,0x024C,0x024C},  {0x024D,0x024D,0x024D},
00353   {0x024E,0x024E,0x024E},  {0x024F,0x024F,0x024F},
00354   {0x0250,0x0250,0x0250},  {0x0251,0x0251,0x0251},
00355   {0x0252,0x0252,0x0252},  {0x0181,0x0253,0x0181},
00356   {0x0186,0x0254,0x0186},  {0x0255,0x0255,0x0255},
00357   {0x0189,0x0256,0x0189},  {0x018A,0x0257,0x018A},
00358   {0x0258,0x0258,0x0258},  {0x018F,0x0259,0x018F},
00359   {0x025A,0x025A,0x025A},  {0x0190,0x025B,0x0190},
00360   {0x025C,0x025C,0x025C},  {0x025D,0x025D,0x025D},
00361   {0x025E,0x025E,0x025E},  {0x025F,0x025F,0x025F},
00362   {0x0193,0x0260,0x0193},  {0x0261,0x0261,0x0261},
00363   {0x0262,0x0262,0x0262},  {0x0194,0x0263,0x0194},
00364   {0x0264,0x0264,0x0264},  {0x0265,0x0265,0x0265},
00365   {0x0266,0x0266,0x0266},  {0x0267,0x0267,0x0267},
00366   {0x0197,0x0268,0x0197},  {0x0196,0x0269,0x0196},
00367   {0x026A,0x026A,0x026A},  {0x026B,0x026B,0x026B},
00368   {0x026C,0x026C,0x026C},  {0x026D,0x026D,0x026D},
00369   {0x026E,0x026E,0x026E},  {0x019C,0x026F,0x019C},
00370   {0x0270,0x0270,0x0270},  {0x0271,0x0271,0x0271},
00371   {0x019D,0x0272,0x019D},  {0x0273,0x0273,0x0273},
00372   {0x0274,0x0274,0x0274},  {0x019F,0x0275,0x019F},
00373   {0x0276,0x0276,0x0276},  {0x0277,0x0277,0x0277},
00374   {0x0278,0x0278,0x0278},  {0x0279,0x0279,0x0279},
00375   {0x027A,0x027A,0x027A},  {0x027B,0x027B,0x027B},
00376   {0x027C,0x027C,0x027C},  {0x027D,0x027D,0x027D},
00377   {0x027E,0x027E,0x027E},  {0x027F,0x027F,0x027F},
00378   {0x01A6,0x0280,0x01A6},  {0x0281,0x0281,0x0281},
00379   {0x0282,0x0282,0x0282},  {0x01A9,0x0283,0x01A9},
00380   {0x0284,0x0284,0x0284},  {0x0285,0x0285,0x0285},
00381   {0x0286,0x0286,0x0286},  {0x0287,0x0287,0x0287},
00382   {0x01AE,0x0288,0x01AE},  {0x0289,0x0289,0x0289},
00383   {0x01B1,0x028A,0x01B1},  {0x01B2,0x028B,0x01B2},
00384   {0x028C,0x028C,0x028C},  {0x028D,0x028D,0x028D},
00385   {0x028E,0x028E,0x028E},  {0x028F,0x028F,0x028F},
00386   {0x0290,0x0290,0x0290},  {0x0291,0x0291,0x0291},
00387   {0x01B7,0x0292,0x01B7},  {0x0293,0x0293,0x0293},
00388   {0x0294,0x0294,0x0294},  {0x0295,0x0295,0x0295},
00389   {0x0296,0x0296,0x0296},  {0x0297,0x0297,0x0297},
00390   {0x0298,0x0298,0x0298},  {0x0299,0x0299,0x0299},
00391   {0x029A,0x029A,0x029A},  {0x029B,0x029B,0x029B},
00392   {0x029C,0x029C,0x029C},  {0x029D,0x029D,0x029D},
00393   {0x029E,0x029E,0x029E},  {0x029F,0x029F,0x029F},
00394   {0x02A0,0x02A0,0x02A0},  {0x02A1,0x02A1,0x02A1},
00395   {0x02A2,0x02A2,0x02A2},  {0x02A3,0x02A3,0x02A3},
00396   {0x02A4,0x02A4,0x02A4},  {0x02A5,0x02A5,0x02A5},
00397   {0x02A6,0x02A6,0x02A6},  {0x02A7,0x02A7,0x02A7},
00398   {0x02A8,0x02A8,0x02A8},  {0x02A9,0x02A9,0x02A9},
00399   {0x02AA,0x02AA,0x02AA},  {0x02AB,0x02AB,0x02AB},
00400   {0x02AC,0x02AC,0x02AC},  {0x02AD,0x02AD,0x02AD},
00401   {0x02AE,0x02AE,0x02AE},  {0x02AF,0x02AF,0x02AF},
00402   {0x02B0,0x02B0,0x02B0},  {0x02B1,0x02B1,0x02B1},
00403   {0x02B2,0x02B2,0x02B2},  {0x02B3,0x02B3,0x02B3},
00404   {0x02B4,0x02B4,0x02B4},  {0x02B5,0x02B5,0x02B5},
00405   {0x02B6,0x02B6,0x02B6},  {0x02B7,0x02B7,0x02B7},
00406   {0x02B8,0x02B8,0x02B8},  {0x02B9,0x02B9,0x02B9},
00407   {0x02BA,0x02BA,0x02BA},  {0x02BB,0x02BB,0x02BB},
00408   {0x02BC,0x02BC,0x02BC},  {0x02BD,0x02BD,0x02BD},
00409   {0x02BE,0x02BE,0x02BE},  {0x02BF,0x02BF,0x02BF},
00410   {0x02C0,0x02C0,0x02C0},  {0x02C1,0x02C1,0x02C1},
00411   {0x02C2,0x02C2,0x02C2},  {0x02C3,0x02C3,0x02C3},
00412   {0x02C4,0x02C4,0x02C4},  {0x02C5,0x02C5,0x02C5},
00413   {0x02C6,0x02C6,0x02C6},  {0x02C7,0x02C7,0x02C7},
00414   {0x02C8,0x02C8,0x02C8},  {0x02C9,0x02C9,0x02C9},
00415   {0x02CA,0x02CA,0x02CA},  {0x02CB,0x02CB,0x02CB},
00416   {0x02CC,0x02CC,0x02CC},  {0x02CD,0x02CD,0x02CD},
00417   {0x02CE,0x02CE,0x02CE},  {0x02CF,0x02CF,0x02CF},
00418   {0x02D0,0x02D0,0x02D0},  {0x02D1,0x02D1,0x02D1},
00419   {0x02D2,0x02D2,0x02D2},  {0x02D3,0x02D3,0x02D3},
00420   {0x02D4,0x02D4,0x02D4},  {0x02D5,0x02D5,0x02D5},
00421   {0x02D6,0x02D6,0x02D6},  {0x02D7,0x02D7,0x02D7},
00422   {0x02D8,0x02D8,0x02D8},  {0x02D9,0x02D9,0x02D9},
00423   {0x02DA,0x02DA,0x02DA},  {0x02DB,0x02DB,0x02DB},
00424   {0x02DC,0x02DC,0x02DC},  {0x02DD,0x02DD,0x02DD},
00425   {0x02DE,0x02DE,0x02DE},  {0x02DF,0x02DF,0x02DF},
00426   {0x02E0,0x02E0,0x02E0},  {0x02E1,0x02E1,0x02E1},
00427   {0x02E2,0x02E2,0x02E2},  {0x02E3,0x02E3,0x02E3},
00428   {0x02E4,0x02E4,0x02E4},  {0x02E5,0x02E5,0x02E5},
00429   {0x02E6,0x02E6,0x02E6},  {0x02E7,0x02E7,0x02E7},
00430   {0x02E8,0x02E8,0x02E8},  {0x02E9,0x02E9,0x02E9},
00431   {0x02EA,0x02EA,0x02EA},  {0x02EB,0x02EB,0x02EB},
00432   {0x02EC,0x02EC,0x02EC},  {0x02ED,0x02ED,0x02ED},
00433   {0x02EE,0x02EE,0x02EE},  {0x02EF,0x02EF,0x02EF},
00434   {0x02F0,0x02F0,0x02F0},  {0x02F1,0x02F1,0x02F1},
00435   {0x02F2,0x02F2,0x02F2},  {0x02F3,0x02F3,0x02F3},
00436   {0x02F4,0x02F4,0x02F4},  {0x02F5,0x02F5,0x02F5},
00437   {0x02F6,0x02F6,0x02F6},  {0x02F7,0x02F7,0x02F7},
00438   {0x02F8,0x02F8,0x02F8},  {0x02F9,0x02F9,0x02F9},
00439   {0x02FA,0x02FA,0x02FA},  {0x02FB,0x02FB,0x02FB},
00440   {0x02FC,0x02FC,0x02FC},  {0x02FD,0x02FD,0x02FD},
00441   {0x02FE,0x02FE,0x02FE},  {0x02FF,0x02FF,0x02FF}
00442 };
00443 
00444 static MY_UNICASE_INFO plane03[]={
00445   {0x0300,0x0300,0x0300},  {0x0301,0x0301,0x0301},
00446   {0x0302,0x0302,0x0302},  {0x0303,0x0303,0x0303},
00447   {0x0304,0x0304,0x0304},  {0x0305,0x0305,0x0305},
00448   {0x0306,0x0306,0x0306},  {0x0307,0x0307,0x0307},
00449   {0x0308,0x0308,0x0308},  {0x0309,0x0309,0x0309},
00450   {0x030A,0x030A,0x030A},  {0x030B,0x030B,0x030B},
00451   {0x030C,0x030C,0x030C},  {0x030D,0x030D,0x030D},
00452   {0x030E,0x030E,0x030E},  {0x030F,0x030F,0x030F},
00453   {0x0310,0x0310,0x0310},  {0x0311,0x0311,0x0311},
00454   {0x0312,0x0312,0x0312},  {0x0313,0x0313,0x0313},
00455   {0x0314,0x0314,0x0314},  {0x0315,0x0315,0x0315},
00456   {0x0316,0x0316,0x0316},  {0x0317,0x0317,0x0317},
00457   {0x0318,0x0318,0x0318},  {0x0319,0x0319,0x0319},
00458   {0x031A,0x031A,0x031A},  {0x031B,0x031B,0x031B},
00459   {0x031C,0x031C,0x031C},  {0x031D,0x031D,0x031D},
00460   {0x031E,0x031E,0x031E},  {0x031F,0x031F,0x031F},
00461   {0x0320,0x0320,0x0320},  {0x0321,0x0321,0x0321},
00462   {0x0322,0x0322,0x0322},  {0x0323,0x0323,0x0323},
00463   {0x0324,0x0324,0x0324},  {0x0325,0x0325,0x0325},
00464   {0x0326,0x0326,0x0326},  {0x0327,0x0327,0x0327},
00465   {0x0328,0x0328,0x0328},  {0x0329,0x0329,0x0329},
00466   {0x032A,0x032A,0x032A},  {0x032B,0x032B,0x032B},
00467   {0x032C,0x032C,0x032C},  {0x032D,0x032D,0x032D},
00468   {0x032E,0x032E,0x032E},  {0x032F,0x032F,0x032F},
00469   {0x0330,0x0330,0x0330},  {0x0331,0x0331,0x0331},
00470   {0x0332,0x0332,0x0332},  {0x0333,0x0333,0x0333},
00471   {0x0334,0x0334,0x0334},  {0x0335,0x0335,0x0335},
00472   {0x0336,0x0336,0x0336},  {0x0337,0x0337,0x0337},
00473   {0x0338,0x0338,0x0338},  {0x0339,0x0339,0x0339},
00474   {0x033A,0x033A,0x033A},  {0x033B,0x033B,0x033B},
00475   {0x033C,0x033C,0x033C},  {0x033D,0x033D,0x033D},
00476   {0x033E,0x033E,0x033E},  {0x033F,0x033F,0x033F},
00477   {0x0340,0x0340,0x0340},  {0x0341,0x0341,0x0341},
00478   {0x0342,0x0342,0x0342},  {0x0343,0x0343,0x0343},
00479   {0x0344,0x0344,0x0344},  {0x0399,0x0345,0x0399},
00480   {0x0346,0x0346,0x0346},  {0x0347,0x0347,0x0347},
00481   {0x0348,0x0348,0x0348},  {0x0349,0x0349,0x0349},
00482   {0x034A,0x034A,0x034A},  {0x034B,0x034B,0x034B},
00483   {0x034C,0x034C,0x034C},  {0x034D,0x034D,0x034D},
00484   {0x034E,0x034E,0x034E},  {0x034F,0x034F,0x034F},
00485   {0x0350,0x0350,0x0350},  {0x0351,0x0351,0x0351},
00486   {0x0352,0x0352,0x0352},  {0x0353,0x0353,0x0353},
00487   {0x0354,0x0354,0x0354},  {0x0355,0x0355,0x0355},
00488   {0x0356,0x0356,0x0356},  {0x0357,0x0357,0x0357},
00489   {0x0358,0x0358,0x0358},  {0x0359,0x0359,0x0359},
00490   {0x035A,0x035A,0x035A},  {0x035B,0x035B,0x035B},
00491   {0x035C,0x035C,0x035C},  {0x035D,0x035D,0x035D},
00492   {0x035E,0x035E,0x035E},  {0x035F,0x035F,0x035F},
00493   {0x0360,0x0360,0x0360},  {0x0361,0x0361,0x0361},
00494   {0x0362,0x0362,0x0362},  {0x0363,0x0363,0x0363},
00495   {0x0364,0x0364,0x0364},  {0x0365,0x0365,0x0365},
00496   {0x0366,0x0366,0x0366},  {0x0367,0x0367,0x0367},
00497   {0x0368,0x0368,0x0368},  {0x0369,0x0369,0x0369},
00498   {0x036A,0x036A,0x036A},  {0x036B,0x036B,0x036B},
00499   {0x036C,0x036C,0x036C},  {0x036D,0x036D,0x036D},
00500   {0x036E,0x036E,0x036E},  {0x036F,0x036F,0x036F},
00501   {0x0370,0x0370,0x0370},  {0x0371,0x0371,0x0371},
00502   {0x0372,0x0372,0x0372},  {0x0373,0x0373,0x0373},
00503   {0x0374,0x0374,0x0374},  {0x0375,0x0375,0x0375},
00504   {0x0376,0x0376,0x0376},  {0x0377,0x0377,0x0377},
00505   {0x0378,0x0378,0x0378},  {0x0379,0x0379,0x0379},
00506   {0x037A,0x037A,0x037A},  {0x037B,0x037B,0x037B},
00507   {0x037C,0x037C,0x037C},  {0x037D,0x037D,0x037D},
00508   {0x037E,0x037E,0x037E},  {0x037F,0x037F,0x037F},
00509   {0x0380,0x0380,0x0380},  {0x0381,0x0381,0x0381},
00510   {0x0382,0x0382,0x0382},  {0x0383,0x0383,0x0383},
00511   {0x0384,0x0384,0x0384},  {0x0385,0x0385,0x0385},
00512   {0x0386,0x03AC,0x0391},  {0x0387,0x0387,0x0387},
00513   {0x0388,0x03AD,0x0395},  {0x0389,0x03AE,0x0397},
00514   {0x038A,0x03AF,0x0399},  {0x038B,0x038B,0x038B},
00515   {0x038C,0x03CC,0x039F},  {0x038D,0x038D,0x038D},
00516   {0x038E,0x03CD,0x03A5},  {0x038F,0x03CE,0x03A9},
00517   {0x0390,0x0390,0x0399},  {0x0391,0x03B1,0x0391},
00518   {0x0392,0x03B2,0x0392},  {0x0393,0x03B3,0x0393},
00519   {0x0394,0x03B4,0x0394},  {0x0395,0x03B5,0x0395},
00520   {0x0396,0x03B6,0x0396},  {0x0397,0x03B7,0x0397},
00521   {0x0398,0x03B8,0x0398},  {0x0399,0x03B9,0x0399},
00522   {0x039A,0x03BA,0x039A},  {0x039B,0x03BB,0x039B},
00523   {0x039C,0x03BC,0x039C},  {0x039D,0x03BD,0x039D},
00524   {0x039E,0x03BE,0x039E},  {0x039F,0x03BF,0x039F},
00525   {0x03A0,0x03C0,0x03A0},  {0x03A1,0x03C1,0x03A1},
00526   {0x03A2,0x03A2,0x03A2},  {0x03A3,0x03C3,0x03A3},
00527   {0x03A4,0x03C4,0x03A4},  {0x03A5,0x03C5,0x03A5},
00528   {0x03A6,0x03C6,0x03A6},  {0x03A7,0x03C7,0x03A7},
00529   {0x03A8,0x03C8,0x03A8},  {0x03A9,0x03C9,0x03A9},
00530   {0x03AA,0x03CA,0x0399},  {0x03AB,0x03CB,0x03A5},
00531   {0x0386,0x03AC,0x0391},  {0x0388,0x03AD,0x0395},
00532   {0x0389,0x03AE,0x0397},  {0x038A,0x03AF,0x0399},
00533   {0x03B0,0x03B0,0x03A5},  {0x0391,0x03B1,0x0391},
00534   {0x0392,0x03B2,0x0392},  {0x0393,0x03B3,0x0393},
00535   {0x0394,0x03B4,0x0394},  {0x0395,0x03B5,0x0395},
00536   {0x0396,0x03B6,0x0396},  {0x0397,0x03B7,0x0397},
00537   {0x0398,0x03B8,0x0398},  {0x0399,0x03B9,0x0399},
00538   {0x039A,0x03BA,0x039A},  {0x039B,0x03BB,0x039B},
00539   {0x039C,0x03BC,0x039C},  {0x039D,0x03BD,0x039D},
00540   {0x039E,0x03BE,0x039E},  {0x039F,0x03BF,0x039F},
00541   {0x03A0,0x03C0,0x03A0},  {0x03A1,0x03C1,0x03A1},
00542   {0x03A3,0x03C2,0x03A3},  {0x03A3,0x03C3,0x03A3},
00543   {0x03A4,0x03C4,0x03A4},  {0x03A5,0x03C5,0x03A5},
00544   {0x03A6,0x03C6,0x03A6},  {0x03A7,0x03C7,0x03A7},
00545   {0x03A8,0x03C8,0x03A8},  {0x03A9,0x03C9,0x03A9},
00546   {0x03AA,0x03CA,0x0399},  {0x03AB,0x03CB,0x03A5},
00547   {0x038C,0x03CC,0x039F},  {0x038E,0x03CD,0x03A5},
00548   {0x038F,0x03CE,0x03A9},  {0x03CF,0x03CF,0x03CF},
00549   {0x0392,0x03D0,0x0392},  {0x0398,0x03D1,0x0398},
00550   {0x03D2,0x03D2,0x03D2},  {0x03D3,0x03D3,0x03D2},
00551   {0x03D4,0x03D4,0x03D2},  {0x03A6,0x03D5,0x03A6},
00552   {0x03A0,0x03D6,0x03A0},  {0x03D7,0x03D7,0x03D7},
00553   {0x03D8,0x03D8,0x03D8},  {0x03D9,0x03D9,0x03D9},
00554   {0x03DA,0x03DB,0x03DA},  {0x03DA,0x03DB,0x03DA},
00555   {0x03DC,0x03DD,0x03DC},  {0x03DC,0x03DD,0x03DC},
00556   {0x03DE,0x03DF,0x03DE},  {0x03DE,0x03DF,0x03DE},
00557   {0x03E0,0x03E1,0x03E0},  {0x03E0,0x03E1,0x03E0},
00558   {0x03E2,0x03E3,0x03E2},  {0x03E2,0x03E3,0x03E2},
00559   {0x03E4,0x03E5,0x03E4},  {0x03E4,0x03E5,0x03E4},
00560   {0x03E6,0x03E7,0x03E6},  {0x03E6,0x03E7,0x03E6},
00561   {0x03E8,0x03E9,0x03E8},  {0x03E8,0x03E9,0x03E8},
00562   {0x03EA,0x03EB,0x03EA},  {0x03EA,0x03EB,0x03EA},
00563   {0x03EC,0x03ED,0x03EC},  {0x03EC,0x03ED,0x03EC},
00564   {0x03EE,0x03EF,0x03EE},  {0x03EE,0x03EF,0x03EE},
00565   {0x039A,0x03F0,0x039A},  {0x03A1,0x03F1,0x03A1},
00566   {0x03A3,0x03F2,0x03A3},  {0x03F3,0x03F3,0x03F3},
00567   {0x03F4,0x03F4,0x03F4},  {0x03F5,0x03F5,0x03F5},
00568   {0x03F6,0x03F6,0x03F6},  {0x03F7,0x03F7,0x03F7},
00569   {0x03F8,0x03F8,0x03F8},  {0x03F9,0x03F9,0x03F9},
00570   {0x03FA,0x03FA,0x03FA},  {0x03FB,0x03FB,0x03FB},
00571   {0x03FC,0x03FC,0x03FC},  {0x03FD,0x03FD,0x03FD},
00572   {0x03FE,0x03FE,0x03FE},  {0x03FF,0x03FF,0x03FF}
00573 };
00574 
00575 static MY_UNICASE_INFO plane04[]={
00576   {0x0400,0x0450,0x0415},  {0x0401,0x0451,0x0415},
00577   {0x0402,0x0452,0x0402},  {0x0403,0x0453,0x0413},
00578   {0x0404,0x0454,0x0404},  {0x0405,0x0455,0x0405},
00579   {0x0406,0x0456,0x0406},  {0x0407,0x0457,0x0406},
00580   {0x0408,0x0458,0x0408},  {0x0409,0x0459,0x0409},
00581   {0x040A,0x045A,0x040A},  {0x040B,0x045B,0x040B},
00582   {0x040C,0x045C,0x041A},  {0x040D,0x045D,0x0418},
00583   {0x040E,0x045E,0x0423},  {0x040F,0x045F,0x040F},
00584   {0x0410,0x0430,0x0410},  {0x0411,0x0431,0x0411},
00585   {0x0412,0x0432,0x0412},  {0x0413,0x0433,0x0413},
00586   {0x0414,0x0434,0x0414},  {0x0415,0x0435,0x0415},
00587   {0x0416,0x0436,0x0416},  {0x0417,0x0437,0x0417},
00588   {0x0418,0x0438,0x0418},  {0x0419,0x0439,0x0419},
00589   {0x041A,0x043A,0x041A},  {0x041B,0x043B,0x041B},
00590   {0x041C,0x043C,0x041C},  {0x041D,0x043D,0x041D},
00591   {0x041E,0x043E,0x041E},  {0x041F,0x043F,0x041F},
00592   {0x0420,0x0440,0x0420},  {0x0421,0x0441,0x0421},
00593   {0x0422,0x0442,0x0422},  {0x0423,0x0443,0x0423},
00594   {0x0424,0x0444,0x0424},  {0x0425,0x0445,0x0425},
00595   {0x0426,0x0446,0x0426},  {0x0427,0x0447,0x0427},
00596   {0x0428,0x0448,0x0428},  {0x0429,0x0449,0x0429},
00597   {0x042A,0x044A,0x042A},  {0x042B,0x044B,0x042B},
00598   {0x042C,0x044C,0x042C},  {0x042D,0x044D,0x042D},
00599   {0x042E,0x044E,0x042E},  {0x042F,0x044F,0x042F},
00600   {0x0410,0x0430,0x0410},  {0x0411,0x0431,0x0411},
00601   {0x0412,0x0432,0x0412},  {0x0413,0x0433,0x0413},
00602   {0x0414,0x0434,0x0414},  {0x0415,0x0435,0x0415},
00603   {0x0416,0x0436,0x0416},  {0x0417,0x0437,0x0417},
00604   {0x0418,0x0438,0x0418},  {0x0419,0x0439,0x0419},
00605   {0x041A,0x043A,0x041A},  {0x041B,0x043B,0x041B},
00606   {0x041C,0x043C,0x041C},  {0x041D,0x043D,0x041D},
00607   {0x041E,0x043E,0x041E},  {0x041F,0x043F,0x041F},
00608   {0x0420,0x0440,0x0420},  {0x0421,0x0441,0x0421},
00609   {0x0422,0x0442,0x0422},  {0x0423,0x0443,0x0423},
00610   {0x0424,0x0444,0x0424},  {0x0425,0x0445,0x0425},
00611   {0x0426,0x0446,0x0426},  {0x0427,0x0447,0x0427},
00612   {0x0428,0x0448,0x0428},  {0x0429,0x0449,0x0429},
00613   {0x042A,0x044A,0x042A},  {0x042B,0x044B,0x042B},
00614   {0x042C,0x044C,0x042C},  {0x042D,0x044D,0x042D},
00615   {0x042E,0x044E,0x042E},  {0x042F,0x044F,0x042F},
00616   {0x0400,0x0450,0x0415},  {0x0401,0x0451,0x0415},
00617   {0x0402,0x0452,0x0402},  {0x0403,0x0453,0x0413},
00618   {0x0404,0x0454,0x0404},  {0x0405,0x0455,0x0405},
00619   {0x0406,0x0456,0x0406},  {0x0407,0x0457,0x0406},
00620   {0x0408,0x0458,0x0408},  {0x0409,0x0459,0x0409},
00621   {0x040A,0x045A,0x040A},  {0x040B,0x045B,0x040B},
00622   {0x040C,0x045C,0x041A},  {0x040D,0x045D,0x0418},
00623   {0x040E,0x045E,0x0423},  {0x040F,0x045F,0x040F},
00624   {0x0460,0x0461,0x0460},  {0x0460,0x0461,0x0460},
00625   {0x0462,0x0463,0x0462},  {0x0462,0x0463,0x0462},
00626   {0x0464,0x0465,0x0464},  {0x0464,0x0465,0x0464},
00627   {0x0466,0x0467,0x0466},  {0x0466,0x0467,0x0466},
00628   {0x0468,0x0469,0x0468},  {0x0468,0x0469,0x0468},
00629   {0x046A,0x046B,0x046A},  {0x046A,0x046B,0x046A},
00630   {0x046C,0x046D,0x046C},  {0x046C,0x046D,0x046C},
00631   {0x046E,0x046F,0x046E},  {0x046E,0x046F,0x046E},
00632   {0x0470,0x0471,0x0470},  {0x0470,0x0471,0x0470},
00633   {0x0472,0x0473,0x0472},  {0x0472,0x0473,0x0472},
00634   {0x0474,0x0475,0x0474},  {0x0474,0x0475,0x0474},
00635   {0x0476,0x0477,0x0474},  {0x0476,0x0477,0x0474},
00636   {0x0478,0x0479,0x0478},  {0x0478,0x0479,0x0478},
00637   {0x047A,0x047B,0x047A},  {0x047A,0x047B,0x047A},
00638   {0x047C,0x047D,0x047C},  {0x047C,0x047D,0x047C},
00639   {0x047E,0x047F,0x047E},  {0x047E,0x047F,0x047E},
00640   {0x0480,0x0481,0x0480},  {0x0480,0x0481,0x0480},
00641   {0x0482,0x0482,0x0482},  {0x0483,0x0483,0x0483},
00642   {0x0484,0x0484,0x0484},  {0x0485,0x0485,0x0485},
00643   {0x0486,0x0486,0x0486},  {0x0487,0x0487,0x0487},
00644   {0x0488,0x0488,0x0488},  {0x0489,0x0489,0x0489},
00645   {0x048A,0x048A,0x048A},  {0x048B,0x048B,0x048B},
00646   {0x048C,0x048D,0x048C},  {0x048C,0x048D,0x048C},
00647   {0x048E,0x048F,0x048E},  {0x048E,0x048F,0x048E},
00648   {0x0490,0x0491,0x0490},  {0x0490,0x0491,0x0490},
00649   {0x0492,0x0493,0x0492},  {0x0492,0x0493,0x0492},
00650   {0x0494,0x0495,0x0494},  {0x0494,0x0495,0x0494},
00651   {0x0496,0x0497,0x0496},  {0x0496,0x0497,0x0496},
00652   {0x0498,0x0499,0x0498},  {0x0498,0x0499,0x0498},
00653   {0x049A,0x049B,0x049A},  {0x049A,0x049B,0x049A},
00654   {0x049C,0x049D,0x049C},  {0x049C,0x049D,0x049C},
00655   {0x049E,0x049F,0x049E},  {0x049E,0x049F,0x049E},
00656   {0x04A0,0x04A1,0x04A0},  {0x04A0,0x04A1,0x04A0},
00657   {0x04A2,0x04A3,0x04A2},  {0x04A2,0x04A3,0x04A2},
00658   {0x04A4,0x04A5,0x04A4},  {0x04A4,0x04A5,0x04A4},
00659   {0x04A6,0x04A7,0x04A6},  {0x04A6,0x04A7,0x04A6},
00660   {0x04A8,0x04A9,0x04A8},  {0x04A8,0x04A9,0x04A8},
00661   {0x04AA,0x04AB,0x04AA},  {0x04AA,0x04AB,0x04AA},
00662   {0x04AC,0x04AD,0x04AC},  {0x04AC,0x04AD,0x04AC},
00663   {0x04AE,0x04AF,0x04AE},  {0x04AE,0x04AF,0x04AE},
00664   {0x04B0,0x04B1,0x04B0},  {0x04B0,0x04B1,0x04B0},
00665   {0x04B2,0x04B3,0x04B2},  {0x04B2,0x04B3,0x04B2},
00666   {0x04B4,0x04B5,0x04B4},  {0x04B4,0x04B5,0x04B4},
00667   {0x04B6,0x04B7,0x04B6},  {0x04B6,0x04B7,0x04B6},
00668   {0x04B8,0x04B9,0x04B8},  {0x04B8,0x04B9,0x04B8},
00669   {0x04BA,0x04BB,0x04BA},  {0x04BA,0x04BB,0x04BA},
00670   {0x04BC,0x04BD,0x04BC},  {0x04BC,0x04BD,0x04BC},
00671   {0x04BE,0x04BF,0x04BE},  {0x04BE,0x04BF,0x04BE},
00672   {0x04C0,0x04C0,0x04C0},  {0x04C1,0x04C2,0x0416},
00673   {0x04C1,0x04C2,0x0416},  {0x04C3,0x04C4,0x04C3},
00674   {0x04C3,0x04C4,0x04C3},  {0x04C5,0x04C5,0x04C5},
00675   {0x04C6,0x04C6,0x04C6},  {0x04C7,0x04C8,0x04C7},
00676   {0x04C7,0x04C8,0x04C7},  {0x04C9,0x04C9,0x04C9},
00677   {0x04CA,0x04CA,0x04CA},  {0x04CB,0x04CC,0x04CB},
00678   {0x04CB,0x04CC,0x04CB},  {0x04CD,0x04CD,0x04CD},
00679   {0x04CE,0x04CE,0x04CE},  {0x04CF,0x04CF,0x04CF},
00680   {0x04D0,0x04D1,0x0410},  {0x04D0,0x04D1,0x0410},
00681   {0x04D2,0x04D3,0x0410},  {0x04D2,0x04D3,0x0410},
00682   {0x04D4,0x04D5,0x04D4},  {0x04D4,0x04D5,0x04D4},
00683   {0x04D6,0x04D7,0x0415},  {0x04D6,0x04D7,0x0415},
00684   {0x04D8,0x04D9,0x04D8},  {0x04D8,0x04D9,0x04D8},
00685   {0x04DA,0x04DB,0x04D8},  {0x04DA,0x04DB,0x04D8},
00686   {0x04DC,0x04DD,0x0416},  {0x04DC,0x04DD,0x0416},
00687   {0x04DE,0x04DF,0x0417},  {0x04DE,0x04DF,0x0417},
00688   {0x04E0,0x04E1,0x04E0},  {0x04E0,0x04E1,0x04E0},
00689   {0x04E2,0x04E3,0x0418},  {0x04E2,0x04E3,0x0418},
00690   {0x04E4,0x04E5,0x0418},  {0x04E4,0x04E5,0x0418},
00691   {0x04E6,0x04E7,0x041E},  {0x04E6,0x04E7,0x041E},
00692   {0x04E8,0x04E9,0x04E8},  {0x04E8,0x04E9,0x04E8},
00693   {0x04EA,0x04EB,0x04E8},  {0x04EA,0x04EB,0x04E8},
00694   {0x04EC,0x04ED,0x042D},  {0x04EC,0x04ED,0x042D},
00695   {0x04EE,0x04EF,0x0423},  {0x04EE,0x04EF,0x0423},
00696   {0x04F0,0x04F1,0x0423},  {0x04F0,0x04F1,0x0423},
00697   {0x04F2,0x04F3,0x0423},  {0x04F2,0x04F3,0x0423},
00698   {0x04F4,0x04F5,0x0427},  {0x04F4,0x04F5,0x0427},
00699   {0x04F6,0x04F6,0x04F6},  {0x04F7,0x04F7,0x04F7},
00700   {0x04F8,0x04F9,0x042B},  {0x04F8,0x04F9,0x042B},
00701   {0x04FA,0x04FA,0x04FA},  {0x04FB,0x04FB,0x04FB},
00702   {0x04FC,0x04FC,0x04FC},  {0x04FD,0x04FD,0x04FD},
00703   {0x04FE,0x04FE,0x04FE},  {0x04FF,0x04FF,0x04FF}
00704 };
00705 
00706 static MY_UNICASE_INFO plane05[]={
00707   {0x0500,0x0500,0x0500},  {0x0501,0x0501,0x0501},
00708   {0x0502,0x0502,0x0502},  {0x0503,0x0503,0x0503},
00709   {0x0504,0x0504,0x0504},  {0x0505,0x0505,0x0505},
00710   {0x0506,0x0506,0x0506},  {0x0507,0x0507,0x0507},
00711   {0x0508,0x0508,0x0508},  {0x0509,0x0509,0x0509},
00712   {0x050A,0x050A,0x050A},  {0x050B,0x050B,0x050B},
00713   {0x050C,0x050C,0x050C},  {0x050D,0x050D,0x050D},
00714   {0x050E,0x050E,0x050E},  {0x050F,0x050F,0x050F},
00715   {0x0510,0x0510,0x0510},  {0x0511,0x0511,0x0511},
00716   {0x0512,0x0512,0x0512},  {0x0513,0x0513,0x0513},
00717   {0x0514,0x0514,0x0514},  {0x0515,0x0515,0x0515},
00718   {0x0516,0x0516,0x0516},  {0x0517,0x0517,0x0517},
00719   {0x0518,0x0518,0x0518},  {0x0519,0x0519,0x0519},
00720   {0x051A,0x051A,0x051A},  {0x051B,0x051B,0x051B},
00721   {0x051C,0x051C,0x051C},  {0x051D,0x051D,0x051D},
00722   {0x051E,0x051E,0x051E},  {0x051F,0x051F,0x051F},
00723   {0x0520,0x0520,0x0520},  {0x0521,0x0521,0x0521},
00724   {0x0522,0x0522,0x0522},  {0x0523,0x0523,0x0523},
00725   {0x0524,0x0524,0x0524},  {0x0525,0x0525,0x0525},
00726   {0x0526,0x0526,0x0526},  {0x0527,0x0527,0x0527},
00727   {0x0528,0x0528,0x0528},  {0x0529,0x0529,0x0529},
00728   {0x052A,0x052A,0x052A},  {0x052B,0x052B,0x052B},
00729   {0x052C,0x052C,0x052C},  {0x052D,0x052D,0x052D},
00730   {0x052E,0x052E,0x052E},  {0x052F,0x052F,0x052F},
00731   {0x0530,0x0530,0x0530},  {0x0531,0x0561,0x0531},
00732   {0x0532,0x0562,0x0532},  {0x0533,0x0563,0x0533},
00733   {0x0534,0x0564,0x0534},  {0x0535,0x0565,0x0535},
00734   {0x0536,0x0566,0x0536},  {0x0537,0x0567,0x0537},
00735   {0x0538,0x0568,0x0538},  {0x0539,0x0569,0x0539},
00736   {0x053A,0x056A,0x053A},  {0x053B,0x056B,0x053B},
00737   {0x053C,0x056C,0x053C},  {0x053D,0x056D,0x053D},
00738   {0x053E,0x056E,0x053E},  {0x053F,0x056F,0x053F},
00739   {0x0540,0x0570,0x0540},  {0x0541,0x0571,0x0541},
00740   {0x0542,0x0572,0x0542},  {0x0543,0x0573,0x0543},
00741   {0x0544,0x0574,0x0544},  {0x0545,0x0575,0x0545},
00742   {0x0546,0x0576,0x0546},  {0x0547,0x0577,0x0547},
00743   {0x0548,0x0578,0x0548},  {0x0549,0x0579,0x0549},
00744   {0x054A,0x057A,0x054A},  {0x054B,0x057B,0x054B},
00745   {0x054C,0x057C,0x054C},  {0x054D,0x057D,0x054D},
00746   {0x054E,0x057E,0x054E},  {0x054F,0x057F,0x054F},
00747   {0x0550,0x0580,0x0550},  {0x0551,0x0581,0x0551},
00748   {0x0552,0x0582,0x0552},  {0x0553,0x0583,0x0553},
00749   {0x0554,0x0584,0x0554},  {0x0555,0x0585,0x0555},
00750   {0x0556,0x0586,0x0556},  {0x0557,0x0557,0x0557},
00751   {0x0558,0x0558,0x0558},  {0x0559,0x0559,0x0559},
00752   {0x055A,0x055A,0x055A},  {0x055B,0x055B,0x055B},
00753   {0x055C,0x055C,0x055C},  {0x055D,0x055D,0x055D},
00754   {0x055E,0x055E,0x055E},  {0x055F,0x055F,0x055F},
00755   {0x0560,0x0560,0x0560},  {0x0531,0x0561,0x0531},
00756   {0x0532,0x0562,0x0532},  {0x0533,0x0563,0x0533},
00757   {0x0534,0x0564,0x0534},  {0x0535,0x0565,0x0535},
00758   {0x0536,0x0566,0x0536},  {0x0537,0x0567,0x0537},
00759   {0x0538,0x0568,0x0538},  {0x0539,0x0569,0x0539},
00760   {0x053A,0x056A,0x053A},  {0x053B,0x056B,0x053B},
00761   {0x053C,0x056C,0x053C},  {0x053D,0x056D,0x053D},
00762   {0x053E,0x056E,0x053E},  {0x053F,0x056F,0x053F},
00763   {0x0540,0x0570,0x0540},  {0x0541,0x0571,0x0541},
00764   {0x0542,0x0572,0x0542},  {0x0543,0x0573,0x0543},
00765   {0x0544,0x0574,0x0544},  {0x0545,0x0575,0x0545},
00766   {0x0546,0x0576,0x0546},  {0x0547,0x0577,0x0547},
00767   {0x0548,0x0578,0x0548},  {0x0549,0x0579,0x0549},
00768   {0x054A,0x057A,0x054A},  {0x054B,0x057B,0x054B},
00769   {0x054C,0x057C,0x054C},  {0x054D,0x057D,0x054D},
00770   {0x054E,0x057E,0x054E},  {0x054F,0x057F,0x054F},
00771   {0x0550,0x0580,0x0550},  {0x0551,0x0581,0x0551},
00772   {0x0552,0x0582,0x0552},  {0x0553,0x0583,0x0553},
00773   {0x0554,0x0584,0x0554},  {0x0555,0x0585,0x0555},
00774   {0x0556,0x0586,0x0556},  {0x0587,0x0587,0x0587},
00775   {0x0588,0x0588,0x0588},  {0x0589,0x0589,0x0589},
00776   {0x058A,0x058A,0x058A},  {0x058B,0x058B,0x058B},
00777   {0x058C,0x058C,0x058C},  {0x058D,0x058D,0x058D},
00778   {0x058E,0x058E,0x058E},  {0x058F,0x058F,0x058F},
00779   {0x0590,0x0590,0x0590},  {0x0591,0x0591,0x0591},
00780   {0x0592,0x0592,0x0592},  {0x0593,0x0593,0x0593},
00781   {0x0594,0x0594,0x0594},  {0x0595,0x0595,0x0595},
00782   {0x0596,0x0596,0x0596},  {0x0597,0x0597,0x0597},
00783   {0x0598,0x0598,0x0598},  {0x0599,0x0599,0x0599},
00784   {0x059A,0x059A,0x059A},  {0x059B,0x059B,0x059B},
00785   {0x059C,0x059C,0x059C},  {0x059D,0x059D,0x059D},
00786   {0x059E,0x059E,0x059E},  {0x059F,0x059F,0x059F},
00787   {0x05A0,0x05A0,0x05A0},  {0x05A1,0x05A1,0x05A1},
00788   {0x05A2,0x05A2,0x05A2},  {0x05A3,0x05A3,0x05A3},
00789   {0x05A4,0x05A4,0x05A4},  {0x05A5,0x05A5,0x05A5},
00790   {0x05A6,0x05A6,0x05A6},  {0x05A7,0x05A7,0x05A7},
00791   {0x05A8,0x05A8,0x05A8},  {0x05A9,0x05A9,0x05A9},
00792   {0x05AA,0x05AA,0x05AA},  {0x05AB,0x05AB,0x05AB},
00793   {0x05AC,0x05AC,0x05AC},  {0x05AD,0x05AD,0x05AD},
00794   {0x05AE,0x05AE,0x05AE},  {0x05AF,0x05AF,0x05AF},
00795   {0x05B0,0x05B0,0x05B0},  {0x05B1,0x05B1,0x05B1},
00796   {0x05B2,0x05B2,0x05B2},  {0x05B3,0x05B3,0x05B3},
00797   {0x05B4,0x05B4,0x05B4},  {0x05B5,0x05B5,0x05B5},
00798   {0x05B6,0x05B6,0x05B6},  {0x05B7,0x05B7,0x05B7},
00799   {0x05B8,0x05B8,0x05B8},  {0x05B9,0x05B9,0x05B9},
00800   {0x05BA,0x05BA,0x05BA},  {0x05BB,0x05BB,0x05BB},
00801   {0x05BC,0x05BC,0x05BC},  {0x05BD,0x05BD,0x05BD},
00802   {0x05BE,0x05BE,0x05BE},  {0x05BF,0x05BF,0x05BF},
00803   {0x05C0,0x05C0,0x05C0},  {0x05C1,0x05C1,0x05C1},
00804   {0x05C2,0x05C2,0x05C2},  {0x05C3,0x05C3,0x05C3},
00805   {0x05C4,0x05C4,0x05C4},  {0x05C5,0x05C5,0x05C5},
00806   {0x05C6,0x05C6,0x05C6},  {0x05C7,0x05C7,0x05C7},
00807   {0x05C8,0x05C8,0x05C8},  {0x05C9,0x05C9,0x05C9},
00808   {0x05CA,0x05CA,0x05CA},  {0x05CB,0x05CB,0x05CB},
00809   {0x05CC,0x05CC,0x05CC},  {0x05CD,0x05CD,0x05CD},
00810   {0x05CE,0x05CE,0x05CE},  {0x05CF,0x05CF,0x05CF},
00811   {0x05D0,0x05D0,0x05D0},  {0x05D1,0x05D1,0x05D1},
00812   {0x05D2,0x05D2,0x05D2},  {0x05D3,0x05D3,0x05D3},
00813   {0x05D4,0x05D4,0x05D4},  {0x05D5,0x05D5,0x05D5},
00814   {0x05D6,0x05D6,0x05D6},  {0x05D7,0x05D7,0x05D7},
00815   {0x05D8,0x05D8,0x05D8},  {0x05D9,0x05D9,0x05D9},
00816   {0x05DA,0x05DA,0x05DA},  {0x05DB,0x05DB,0x05DB},
00817   {0x05DC,0x05DC,0x05DC},  {0x05DD,0x05DD,0x05DD},
00818   {0x05DE,0x05DE,0x05DE},  {0x05DF,0x05DF,0x05DF},
00819   {0x05E0,0x05E0,0x05E0},  {0x05E1,0x05E1,0x05E1},
00820   {0x05E2,0x05E2,0x05E2},  {0x05E3,0x05E3,0x05E3},
00821   {0x05E4,0x05E4,0x05E4},  {0x05E5,0x05E5,0x05E5},
00822   {0x05E6,0x05E6,0x05E6},  {0x05E7,0x05E7,0x05E7},
00823   {0x05E8,0x05E8,0x05E8},  {0x05E9,0x05E9,0x05E9},
00824   {0x05EA,0x05EA,0x05EA},  {0x05EB,0x05EB,0x05EB},
00825   {0x05EC,0x05EC,0x05EC},  {0x05ED,0x05ED,0x05ED},
00826   {0x05EE,0x05EE,0x05EE},  {0x05EF,0x05EF,0x05EF},
00827   {0x05F0,0x05F0,0x05F0},  {0x05F1,0x05F1,0x05F1},
00828   {0x05F2,0x05F2,0x05F2},  {0x05F3,0x05F3,0x05F3},
00829   {0x05F4,0x05F4,0x05F4},  {0x05F5,0x05F5,0x05F5},
00830   {0x05F6,0x05F6,0x05F6},  {0x05F7,0x05F7,0x05F7},
00831   {0x05F8,0x05F8,0x05F8},  {0x05F9,0x05F9,0x05F9},
00832   {0x05FA,0x05FA,0x05FA},  {0x05FB,0x05FB,0x05FB},
00833   {0x05FC,0x05FC,0x05FC},  {0x05FD,0x05FD,0x05FD},
00834   {0x05FE,0x05FE,0x05FE},  {0x05FF,0x05FF,0x05FF}
00835 };
00836 
00837 static MY_UNICASE_INFO plane1E[]={
00838   {0x1E00,0x1E01,0x0041},  {0x1E00,0x1E01,0x0041},
00839   {0x1E02,0x1E03,0x0042},  {0x1E02,0x1E03,0x0042},
00840   {0x1E04,0x1E05,0x0042},  {0x1E04,0x1E05,0x0042},
00841   {0x1E06,0x1E07,0x0042},  {0x1E06,0x1E07,0x0042},
00842   {0x1E08,0x1E09,0x0043},  {0x1E08,0x1E09,0x0043},
00843   {0x1E0A,0x1E0B,0x0044},  {0x1E0A,0x1E0B,0x0044},
00844   {0x1E0C,0x1E0D,0x0044},  {0x1E0C,0x1E0D,0x0044},
00845   {0x1E0E,0x1E0F,0x0044},  {0x1E0E,0x1E0F,0x0044},
00846   {0x1E10,0x1E11,0x0044},  {0x1E10,0x1E11,0x0044},
00847   {0x1E12,0x1E13,0x0044},  {0x1E12,0x1E13,0x0044},
00848   {0x1E14,0x1E15,0x0045},  {0x1E14,0x1E15,0x0045},
00849   {0x1E16,0x1E17,0x0045},  {0x1E16,0x1E17,0x0045},
00850   {0x1E18,0x1E19,0x0045},  {0x1E18,0x1E19,0x0045},
00851   {0x1E1A,0x1E1B,0x0045},  {0x1E1A,0x1E1B,0x0045},
00852   {0x1E1C,0x1E1D,0x0045},  {0x1E1C,0x1E1D,0x0045},
00853   {0x1E1E,0x1E1F,0x0046},  {0x1E1E,0x1E1F,0x0046},
00854   {0x1E20,0x1E21,0x0047},  {0x1E20,0x1E21,0x0047},
00855   {0x1E22,0x1E23,0x0048},  {0x1E22,0x1E23,0x0048},
00856   {0x1E24,0x1E25,0x0048},  {0x1E24,0x1E25,0x0048},
00857   {0x1E26,0x1E27,0x0048},  {0x1E26,0x1E27,0x0048},
00858   {0x1E28,0x1E29,0x0048},  {0x1E28,0x1E29,0x0048},
00859   {0x1E2A,0x1E2B,0x0048},  {0x1E2A,0x1E2B,0x0048},
00860   {0x1E2C,0x1E2D,0x0049},  {0x1E2C,0x1E2D,0x0049},
00861   {0x1E2E,0x1E2F,0x0049},  {0x1E2E,0x1E2F,0x0049},
00862   {0x1E30,0x1E31,0x004B},  {0x1E30,0x1E31,0x004B},
00863   {0x1E32,0x1E33,0x004B},  {0x1E32,0x1E33,0x004B},
00864   {0x1E34,0x1E35,0x004B},  {0x1E34,0x1E35,0x004B},
00865   {0x1E36,0x1E37,0x004C},  {0x1E36,0x1E37,0x004C},
00866   {0x1E38,0x1E39,0x004C},  {0x1E38,0x1E39,0x004C},
00867   {0x1E3A,0x1E3B,0x004C},  {0x1E3A,0x1E3B,0x004C},
00868   {0x1E3C,0x1E3D,0x004C},  {0x1E3C,0x1E3D,0x004C},
00869   {0x1E3E,0x1E3F,0x004D},  {0x1E3E,0x1E3F,0x004D},
00870   {0x1E40,0x1E41,0x004D},  {0x1E40,0x1E41,0x004D},
00871   {0x1E42,0x1E43,0x004D},  {0x1E42,0x1E43,0x004D},
00872   {0x1E44,0x1E45,0x004E},  {0x1E44,0x1E45,0x004E},
00873   {0x1E46,0x1E47,0x004E},  {0x1E46,0x1E47,0x004E},
00874   {0x1E48,0x1E49,0x004E},  {0x1E48,0x1E49,0x004E},
00875   {0x1E4A,0x1E4B,0x004E},  {0x1E4A,0x1E4B,0x004E},
00876   {0x1E4C,0x1E4D,0x004F},  {0x1E4C,0x1E4D,0x004F},
00877   {0x1E4E,0x1E4F,0x004F},  {0x1E4E,0x1E4F,0x004F},
00878   {0x1E50,0x1E51,0x004F},  {0x1E50,0x1E51,0x004F},
00879   {0x1E52,0x1E53,0x004F},  {0x1E52,0x1E53,0x004F},
00880   {0x1E54,0x1E55,0x0050},  {0x1E54,0x1E55,0x0050},
00881   {0x1E56,0x1E57,0x0050},  {0x1E56,0x1E57,0x0050},
00882   {0x1E58,0x1E59,0x0052},  {0x1E58,0x1E59,0x0052},
00883   {0x1E5A,0x1E5B,0x0052},  {0x1E5A,0x1E5B,0x0052},
00884   {0x1E5C,0x1E5D,0x0052},  {0x1E5C,0x1E5D,0x0052},
00885   {0x1E5E,0x1E5F,0x0052},  {0x1E5E,0x1E5F,0x0052},
00886   {0x1E60,0x1E61,0x0053},  {0x1E60,0x1E61,0x0053},
00887   {0x1E62,0x1E63,0x0053},  {0x1E62,0x1E63,0x0053},
00888   {0x1E64,0x1E65,0x0053},  {0x1E64,0x1E65,0x0053},
00889   {0x1E66,0x1E67,0x0053},  {0x1E66,0x1E67,0x0053},
00890   {0x1E68,0x1E69,0x0053},  {0x1E68,0x1E69,0x0053},
00891   {0x1E6A,0x1E6B,0x0054},  {0x1E6A,0x1E6B,0x0054},
00892   {0x1E6C,0x1E6D,0x0054},  {0x1E6C,0x1E6D,0x0054},
00893   {0x1E6E,0x1E6F,0x0054},  {0x1E6E,0x1E6F,0x0054},
00894   {0x1E70,0x1E71,0x0054},  {0x1E70,0x1E71,0x0054},
00895   {0x1E72,0x1E73,0x0055},  {0x1E72,0x1E73,0x0055},
00896   {0x1E74,0x1E75,0x0055},  {0x1E74,0x1E75,0x0055},
00897   {0x1E76,0x1E77,0x0055},  {0x1E76,0x1E77,0x0055},
00898   {0x1E78,0x1E79,0x0055},  {0x1E78,0x1E79,0x0055},
00899   {0x1E7A,0x1E7B,0x0055},  {0x1E7A,0x1E7B,0x0055},
00900   {0x1E7C,0x1E7D,0x0056},  {0x1E7C,0x1E7D,0x0056},
00901   {0x1E7E,0x1E7F,0x0056},  {0x1E7E,0x1E7F,0x0056},
00902   {0x1E80,0x1E81,0x0057},  {0x1E80,0x1E81,0x0057},
00903   {0x1E82,0x1E83,0x0057},  {0x1E82,0x1E83,0x0057},
00904   {0x1E84,0x1E85,0x0057},  {0x1E84,0x1E85,0x0057},
00905   {0x1E86,0x1E87,0x0057},  {0x1E86,0x1E87,0x0057},
00906   {0x1E88,0x1E89,0x0057},  {0x1E88,0x1E89,0x0057},
00907   {0x1E8A,0x1E8B,0x0058},  {0x1E8A,0x1E8B,0x0058},
00908   {0x1E8C,0x1E8D,0x0058},  {0x1E8C,0x1E8D,0x0058},
00909   {0x1E8E,0x1E8F,0x0059},  {0x1E8E,0x1E8F,0x0059},
00910   {0x1E90,0x1E91,0x005A},  {0x1E90,0x1E91,0x005A},
00911   {0x1E92,0x1E93,0x005A},  {0x1E92,0x1E93,0x005A},
00912   {0x1E94,0x1E95,0x005A},  {0x1E94,0x1E95,0x005A},
00913   {0x1E96,0x1E96,0x0048},  {0x1E97,0x1E97,0x0054},
00914   {0x1E98,0x1E98,0x0057},  {0x1E99,0x1E99,0x0059},
00915   {0x1E9A,0x1E9A,0x1E9A},  {0x1E60,0x1E9B,0x0053},
00916   {0x1E9C,0x1E9C,0x1E9C},  {0x1E9D,0x1E9D,0x1E9D},
00917   {0x1E9E,0x1E9E,0x1E9E},  {0x1E9F,0x1E9F,0x1E9F},
00918   {0x1EA0,0x1EA1,0x0041},  {0x1EA0,0x1EA1,0x0041},
00919   {0x1EA2,0x1EA3,0x0041},  {0x1EA2,0x1EA3,0x0041},
00920   {0x1EA4,0x1EA5,0x0041},  {0x1EA4,0x1EA5,0x0041},
00921   {0x1EA6,0x1EA7,0x0041},  {0x1EA6,0x1EA7,0x0041},
00922   {0x1EA8,0x1EA9,0x0041},  {0x1EA8,0x1EA9,0x0041},
00923   {0x1EAA,0x1EAB,0x0041},  {0x1EAA,0x1EAB,0x0041},
00924   {0x1EAC,0x1EAD,0x0041},  {0x1EAC,0x1EAD,0x0041},
00925   {0x1EAE,0x1EAF,0x0041},  {0x1EAE,0x1EAF,0x0041},
00926   {0x1EB0,0x1EB1,0x0041},  {0x1EB0,0x1EB1,0x0041},
00927   {0x1EB2,0x1EB3,0x0041},  {0x1EB2,0x1EB3,0x0041},
00928   {0x1EB4,0x1EB5,0x0041},  {0x1EB4,0x1EB5,0x0041},
00929   {0x1EB6,0x1EB7,0x0041},  {0x1EB6,0x1EB7,0x0041},
00930   {0x1EB8,0x1EB9,0x0045},  {0x1EB8,0x1EB9,0x0045},
00931   {0x1EBA,0x1EBB,0x0045},  {0x1EBA,0x1EBB,0x0045},
00932   {0x1EBC,0x1EBD,0x0045},  {0x1EBC,0x1EBD,0x0045},
00933   {0x1EBE,0x1EBF,0x0045},  {0x1EBE,0x1EBF,0x0045},
00934   {0x1EC0,0x1EC1,0x0045},  {0x1EC0,0x1EC1,0x0045},
00935   {0x1EC2,0x1EC3,0x0045},  {0x1EC2,0x1EC3,0x0045},
00936   {0x1EC4,0x1EC5,0x0045},  {0x1EC4,0x1EC5,0x0045},
00937   {0x1EC6,0x1EC7,0x0045},  {0x1EC6,0x1EC7,0x0045},
00938   {0x1EC8,0x1EC9,0x0049},  {0x1EC8,0x1EC9,0x0049},
00939   {0x1ECA,0x1ECB,0x0049},  {0x1ECA,0x1ECB,0x0049},
00940   {0x1ECC,0x1ECD,0x004F},  {0x1ECC,0x1ECD,0x004F},
00941   {0x1ECE,0x1ECF,0x004F},  {0x1ECE,0x1ECF,0x004F},
00942   {0x1ED0,0x1ED1,0x004F},  {0x1ED0,0x1ED1,0x004F},
00943   {0x1ED2,0x1ED3,0x004F},  {0x1ED2,0x1ED3,0x004F},
00944   {0x1ED4,0x1ED5,0x004F},  {0x1ED4,0x1ED5,0x004F},
00945   {0x1ED6,0x1ED7,0x004F},  {0x1ED6,0x1ED7,0x004F},
00946   {0x1ED8,0x1ED9,0x004F},  {0x1ED8,0x1ED9,0x004F},
00947   {0x1EDA,0x1EDB,0x004F},  {0x1EDA,0x1EDB,0x004F},
00948   {0x1EDC,0x1EDD,0x004F},  {0x1EDC,0x1EDD,0x004F},
00949   {0x1EDE,0x1EDF,0x004F},  {0x1EDE,0x1EDF,0x004F},
00950   {0x1EE0,0x1EE1,0x004F},  {0x1EE0,0x1EE1,0x004F},
00951   {0x1EE2,0x1EE3,0x004F},  {0x1EE2,0x1EE3,0x004F},
00952   {0x1EE4,0x1EE5,0x0055},  {0x1EE4,0x1EE5,0x0055},
00953   {0x1EE6,0x1EE7,0x0055},  {0x1EE6,0x1EE7,0x0055},
00954   {0x1EE8,0x1EE9,0x0055},  {0x1EE8,0x1EE9,0x0055},
00955   {0x1EEA,0x1EEB,0x0055},  {0x1EEA,0x1EEB,0x0055},
00956   {0x1EEC,0x1EED,0x0055},  {0x1EEC,0x1EED,0x0055},
00957   {0x1EEE,0x1EEF,0x0055},  {0x1EEE,0x1EEF,0x0055},
00958   {0x1EF0,0x1EF1,0x0055},  {0x1EF0,0x1EF1,0x0055},
00959   {0x1EF2,0x1EF3,0x0059},  {0x1EF2,0x1EF3,0x0059},
00960   {0x1EF4,0x1EF5,0x0059},  {0x1EF4,0x1EF5,0x0059},
00961   {0x1EF6,0x1EF7,0x0059},  {0x1EF6,0x1EF7,0x0059},
00962   {0x1EF8,0x1EF9,0x0059},  {0x1EF8,0x1EF9,0x0059},
00963   {0x1EFA,0x1EFA,0x1EFA},  {0x1EFB,0x1EFB,0x1EFB},
00964   {0x1EFC,0x1EFC,0x1EFC},  {0x1EFD,0x1EFD,0x1EFD},
00965   {0x1EFE,0x1EFE,0x1EFE},  {0x1EFF,0x1EFF,0x1EFF}
00966 };
00967 
00968 static MY_UNICASE_INFO plane1F[]={
00969   {0x1F08,0x1F00,0x0391},  {0x1F09,0x1F01,0x0391},
00970   {0x1F0A,0x1F02,0x0391},  {0x1F0B,0x1F03,0x0391},
00971   {0x1F0C,0x1F04,0x0391},  {0x1F0D,0x1F05,0x0391},
00972   {0x1F0E,0x1F06,0x0391},  {0x1F0F,0x1F07,0x0391},
00973   {0x1F08,0x1F00,0x0391},  {0x1F09,0x1F01,0x0391},
00974   {0x1F0A,0x1F02,0x0391},  {0x1F0B,0x1F03,0x0391},
00975   {0x1F0C,0x1F04,0x0391},  {0x1F0D,0x1F05,0x0391},
00976   {0x1F0E,0x1F06,0x0391},  {0x1F0F,0x1F07,0x0391},
00977   {0x1F18,0x1F10,0x0395},  {0x1F19,0x1F11,0x0395},
00978   {0x1F1A,0x1F12,0x0395},  {0x1F1B,0x1F13,0x0395},
00979   {0x1F1C,0x1F14,0x0395},  {0x1F1D,0x1F15,0x0395},
00980   {0x1F16,0x1F16,0x1F16},  {0x1F17,0x1F17,0x1F17},
00981   {0x1F18,0x1F10,0x0395},  {0x1F19,0x1F11,0x0395},
00982   {0x1F1A,0x1F12,0x0395},  {0x1F1B,0x1F13,0x0395},
00983   {0x1F1C,0x1F14,0x0395},  {0x1F1D,0x1F15,0x0395},
00984   {0x1F1E,0x1F1E,0x1F1E},  {0x1F1F,0x1F1F,0x1F1F},
00985   {0x1F28,0x1F20,0x0397},  {0x1F29,0x1F21,0x0397},
00986   {0x1F2A,0x1F22,0x0397},  {0x1F2B,0x1F23,0x0397},
00987   {0x1F2C,0x1F24,0x0397},  {0x1F2D,0x1F25,0x0397},
00988   {0x1F2E,0x1F26,0x0397},  {0x1F2F,0x1F27,0x0397},
00989   {0x1F28,0x1F20,0x0397},  {0x1F29,0x1F21,0x0397},
00990   {0x1F2A,0x1F22,0x0397},  {0x1F2B,0x1F23,0x0397},
00991   {0x1F2C,0x1F24,0x0397},  {0x1F2D,0x1F25,0x0397},
00992   {0x1F2E,0x1F26,0x0397},  {0x1F2F,0x1F27,0x0397},
00993   {0x1F38,0x1F30,0x0399},  {0x1F39,0x1F31,0x0399},
00994   {0x1F3A,0x1F32,0x0399},  {0x1F3B,0x1F33,0x0399},
00995   {0x1F3C,0x1F34,0x0399},  {0x1F3D,0x1F35,0x0399},
00996   {0x1F3E,0x1F36,0x0399},  {0x1F3F,0x1F37,0x0399},
00997   {0x1F38,0x1F30,0x0399},  {0x1F39,0x1F31,0x0399},
00998   {0x1F3A,0x1F32,0x0399},  {0x1F3B,0x1F33,0x0399},
00999   {0x1F3C,0x1F34,0x0399},  {0x1F3D,0x1F35,0x0399},
01000   {0x1F3E,0x1F36,0x0399},  {0x1F3F,0x1F37,0x0399},
01001   {0x1F48,0x1F40,0x039F},  {0x1F49,0x1F41,0x039F},
01002   {0x1F4A,0x1F42,0x039F},  {0x1F4B,0x1F43,0x039F},
01003   {0x1F4C,0x1F44,0x039F},  {0x1F4D,0x1F45,0x039F},
01004   {0x1F46,0x1F46,0x1F46},  {0x1F47,0x1F47,0x1F47},
01005   {0x1F48,0x1F40,0x039F},  {0x1F49,0x1F41,0x039F},
01006   {0x1F4A,0x1F42,0x039F},  {0x1F4B,0x1F43,0x039F},
01007   {0x1F4C,0x1F44,0x039F},  {0x1F4D,0x1F45,0x039F},
01008   {0x1F4E,0x1F4E,0x1F4E},  {0x1F4F,0x1F4F,0x1F4F},
01009   {0x1F50,0x1F50,0x03A5},  {0x1F59,0x1F51,0x03A5},
01010   {0x1F52,0x1F52,0x03A5},  {0x1F5B,0x1F53,0x03A5},
01011   {0x1F54,0x1F54,0x03A5},  {0x1F5D,0x1F55,0x03A5},
01012   {0x1F56,0x1F56,0x03A5},  {0x1F5F,0x1F57,0x03A5},
01013   {0x1F58,0x1F58,0x1F58},  {0x1F59,0x1F51,0x03A5},
01014   {0x1F5A,0x1F5A,0x1F5A},  {0x1F5B,0x1F53,0x03A5},
01015   {0x1F5C,0x1F5C,0x1F5C},  {0x1F5D,0x1F55,0x03A5},
01016   {0x1F5E,0x1F5E,0x1F5E},  {0x1F5F,0x1F57,0x03A5},
01017   {0x1F68,0x1F60,0x03A9},  {0x1F69,0x1F61,0x03A9},
01018   {0x1F6A,0x1F62,0x03A9},  {0x1F6B,0x1F63,0x03A9},
01019   {0x1F6C,0x1F64,0x03A9},  {0x1F6D,0x1F65,0x03A9},
01020   {0x1F6E,0x1F66,0x03A9},  {0x1F6F,0x1F67,0x03A9},
01021   {0x1F68,0x1F60,0x03A9},  {0x1F69,0x1F61,0x03A9},
01022   {0x1F6A,0x1F62,0x03A9},  {0x1F6B,0x1F63,0x03A9},
01023   {0x1F6C,0x1F64,0x03A9},  {0x1F6D,0x1F65,0x03A9},
01024   {0x1F6E,0x1F66,0x03A9},  {0x1F6F,0x1F67,0x03A9},
01025   {0x1FBA,0x1F70,0x0391},  {0x1FBB,0x1F71,0x1FBB},
01026   {0x1FC8,0x1F72,0x0395},  {0x1FC9,0x1F73,0x1FC9},
01027   {0x1FCA,0x1F74,0x0397},  {0x1FCB,0x1F75,0x1FCB},
01028   {0x1FDA,0x1F76,0x0399},  {0x1FDB,0x1F77,0x1FDB},
01029   {0x1FF8,0x1F78,0x039F},  {0x1FF9,0x1F79,0x1FF9},
01030   {0x1FEA,0x1F7A,0x03A5},  {0x1FEB,0x1F7B,0x1FEB},
01031   {0x1FFA,0x1F7C,0x03A9},  {0x1FFB,0x1F7D,0x1FFB},
01032   {0x1F7E,0x1F7E,0x1F7E},  {0x1F7F,0x1F7F,0x1F7F},
01033   {0x1F88,0x1F80,0x0391},  {0x1F89,0x1F81,0x0391},
01034   {0x1F8A,0x1F82,0x0391},  {0x1F8B,0x1F83,0x0391},
01035   {0x1F8C,0x1F84,0x0391},  {0x1F8D,0x1F85,0x0391},
01036   {0x1F8E,0x1F86,0x0391},  {0x1F8F,0x1F87,0x0391},
01037   {0x1F88,0x1F80,0x0391},  {0x1F89,0x1F81,0x0391},
01038   {0x1F8A,0x1F82,0x0391},  {0x1F8B,0x1F83,0x0391},
01039   {0x1F8C,0x1F84,0x0391},  {0x1F8D,0x1F85,0x0391},
01040   {0x1F8E,0x1F86,0x0391},  {0x1F8F,0x1F87,0x0391},
01041   {0x1F98,0x1F90,0x0397},  {0x1F99,0x1F91,0x0397},
01042   {0x1F9A,0x1F92,0x0397},  {0x1F9B,0x1F93,0x0397},
01043   {0x1F9C,0x1F94,0x0397},  {0x1F9D,0x1F95,0x0397},
01044   {0x1F9E,0x1F96,0x0397},  {0x1F9F,0x1F97,0x0397},
01045   {0x1F98,0x1F90,0x0397},  {0x1F99,0x1F91,0x0397},
01046   {0x1F9A,0x1F92,0x0397},  {0x1F9B,0x1F93,0x0397},
01047   {0x1F9C,0x1F94,0x0397},  {0x1F9D,0x1F95,0x0397},
01048   {0x1F9E,0x1F96,0x0397},  {0x1F9F,0x1F97,0x0397},
01049   {0x1FA8,0x1FA0,0x03A9},  {0x1FA9,0x1FA1,0x03A9},
01050   {0x1FAA,0x1FA2,0x03A9},  {0x1FAB,0x1FA3,0x03A9},
01051   {0x1FAC,0x1FA4,0x03A9},  {0x1FAD,0x1FA5,0x03A9},
01052   {0x1FAE,0x1FA6,0x03A9},  {0x1FAF,0x1FA7,0x03A9},
01053   {0x1FA8,0x1FA0,0x03A9},  {0x1FA9,0x1FA1,0x03A9},
01054   {0x1FAA,0x1FA2,0x03A9},  {0x1FAB,0x1FA3,0x03A9},
01055   {0x1FAC,0x1FA4,0x03A9},  {0x1FAD,0x1FA5,0x03A9},
01056   {0x1FAE,0x1FA6,0x03A9},  {0x1FAF,0x1FA7,0x03A9},
01057   {0x1FB8,0x1FB0,0x0391},  {0x1FB9,0x1FB1,0x0391},
01058   {0x1FB2,0x1FB2,0x0391},  {0x1FBC,0x1FB3,0x0391},
01059   {0x1FB4,0x1FB4,0x0391},  {0x1FB5,0x1FB5,0x1FB5},
01060   {0x1FB6,0x1FB6,0x0391},  {0x1FB7,0x1FB7,0x0391},
01061   {0x1FB8,0x1FB0,0x0391},  {0x1FB9,0x1FB1,0x0391},
01062   {0x1FBA,0x1F70,0x0391},  {0x1FBB,0x1F71,0x1FBB},
01063   {0x1FBC,0x1FB3,0x0391},  {0x1FBD,0x1FBD,0x1FBD},
01064   {0x0399,0x1FBE,0x0399},  {0x1FBF,0x1FBF,0x1FBF},
01065   {0x1FC0,0x1FC0,0x1FC0},  {0x1FC1,0x1FC1,0x1FC1},
01066   {0x1FC2,0x1FC2,0x0397},  {0x1FCC,0x1FC3,0x0397},
01067   {0x1FC4,0x1FC4,0x0397},  {0x1FC5,0x1FC5,0x1FC5},
01068   {0x1FC6,0x1FC6,0x0397},  {0x1FC7,0x1FC7,0x0397},
01069   {0x1FC8,0x1F72,0x0395},  {0x1FC9,0x1F73,0x1FC9},
01070   {0x1FCA,0x1F74,0x0397},  {0x1FCB,0x1F75,0x1FCB},
01071   {0x1FCC,0x1FC3,0x0397},  {0x1FCD,0x1FCD,0x1FCD},
01072   {0x1FCE,0x1FCE,0x1FCE},  {0x1FCF,0x1FCF,0x1FCF},
01073   {0x1FD8,0x1FD0,0x0399},  {0x1FD9,0x1FD1,0x0399},
01074   {0x1FD2,0x1FD2,0x0399},  {0x1FD3,0x1FD3,0x1FD3},
01075   {0x1FD4,0x1FD4,0x1FD4},  {0x1FD5,0x1FD5,0x1FD5},
01076   {0x1FD6,0x1FD6,0x0399},  {0x1FD7,0x1FD7,0x0399},
01077   {0x1FD8,0x1FD0,0x0399},  {0x1FD9,0x1FD1,0x0399},
01078   {0x1FDA,0x1F76,0x0399},  {0x1FDB,0x1F77,0x1FDB},
01079   {0x1FDC,0x1FDC,0x1FDC},  {0x1FDD,0x1FDD,0x1FDD},
01080   {0x1FDE,0x1FDE,0x1FDE},  {0x1FDF,0x1FDF,0x1FDF},
01081   {0x1FE8,0x1FE0,0x03A5},  {0x1FE9,0x1FE1,0x03A5},
01082   {0x1FE2,0x1FE2,0x03A5},  {0x1FE3,0x1FE3,0x1FE3},
01083   {0x1FE4,0x1FE4,0x03A1},  {0x1FEC,0x1FE5,0x03A1},
01084   {0x1FE6,0x1FE6,0x03A5},  {0x1FE7,0x1FE7,0x03A5},
01085   {0x1FE8,0x1FE0,0x03A5},  {0x1FE9,0x1FE1,0x03A5},
01086   {0x1FEA,0x1F7A,0x03A5},  {0x1FEB,0x1F7B,0x1FEB},
01087   {0x1FEC,0x1FE5,0x03A1},  {0x1FED,0x1FED,0x1FED},
01088   {0x1FEE,0x1FEE,0x1FEE},  {0x1FEF,0x1FEF,0x1FEF},
01089   {0x1FF0,0x1FF0,0x1FF0},  {0x1FF1,0x1FF1,0x1FF1},
01090   {0x1FF2,0x1FF2,0x03A9},  {0x1FFC,0x1FF3,0x03A9},
01091   {0x1FF4,0x1FF4,0x03A9},  {0x1FF5,0x1FF5,0x1FF5},
01092   {0x1FF6,0x1FF6,0x03A9},  {0x1FF7,0x1FF7,0x03A9},
01093   {0x1FF8,0x1F78,0x039F},  {0x1FF9,0x1F79,0x1FF9},
01094   {0x1FFA,0x1F7C,0x03A9},  {0x1FFB,0x1F7D,0x1FFB},
01095   {0x1FFC,0x1FF3,0x03A9},  {0x1FFD,0x1FFD,0x1FFD},
01096   {0x1FFE,0x1FFE,0x1FFE},  {0x1FFF,0x1FFF,0x1FFF}
01097 };
01098 
01099 static MY_UNICASE_INFO plane21[]={
01100   {0x2100,0x2100,0x2100},  {0x2101,0x2101,0x2101},
01101   {0x2102,0x2102,0x2102},  {0x2103,0x2103,0x2103},
01102   {0x2104,0x2104,0x2104},  {0x2105,0x2105,0x2105},
01103   {0x2106,0x2106,0x2106},  {0x2107,0x2107,0x2107},
01104   {0x2108,0x2108,0x2108},  {0x2109,0x2109,0x2109},
01105   {0x210A,0x210A,0x210A},  {0x210B,0x210B,0x210B},
01106   {0x210C,0x210C,0x210C},  {0x210D,0x210D,0x210D},
01107   {0x210E,0x210E,0x210E},  {0x210F,0x210F,0x210F},
01108   {0x2110,0x2110,0x2110},  {0x2111,0x2111,0x2111},
01109   {0x2112,0x2112,0x2112},  {0x2113,0x2113,0x2113},
01110   {0x2114,0x2114,0x2114},  {0x2115,0x2115,0x2115},
01111   {0x2116,0x2116,0x2116},  {0x2117,0x2117,0x2117},
01112   {0x2118,0x2118,0x2118},  {0x2119,0x2119,0x2119},
01113   {0x211A,0x211A,0x211A},  {0x211B,0x211B,0x211B},
01114   {0x211C,0x211C,0x211C},  {0x211D,0x211D,0x211D},
01115   {0x211E,0x211E,0x211E},  {0x211F,0x211F,0x211F},
01116   {0x2120,0x2120,0x2120},  {0x2121,0x2121,0x2121},
01117   {0x2122,0x2122,0x2122},  {0x2123,0x2123,0x2123},
01118   {0x2124,0x2124,0x2124},  {0x2125,0x2125,0x2125},
01119   {0x2126,0x03C9,0x2126},  {0x2127,0x2127,0x2127},
01120   {0x2128,0x2128,0x2128},  {0x2129,0x2129,0x2129},
01121   {0x212A,0x006B,0x212A},  {0x212B,0x00E5,0x212B},
01122   {0x212C,0x212C,0x212C},  {0x212D,0x212D,0x212D},
01123   {0x212E,0x212E,0x212E},  {0x212F,0x212F,0x212F},
01124   {0x2130,0x2130,0x2130},  {0x2131,0x2131,0x2131},
01125   {0x2132,0x2132,0x2132},  {0x2133,0x2133,0x2133},
01126   {0x2134,0x2134,0x2134},  {0x2135,0x2135,0x2135},
01127   {0x2136,0x2136,0x2136},  {0x2137,0x2137,0x2137},
01128   {0x2138,0x2138,0x2138},  {0x2139,0x2139,0x2139},
01129   {0x213A,0x213A,0x213A},  {0x213B,0x213B,0x213B},
01130   {0x213C,0x213C,0x213C},  {0x213D,0x213D,0x213D},
01131   {0x213E,0x213E,0x213E},  {0x213F,0x213F,0x213F},
01132   {0x2140,0x2140,0x2140},  {0x2141,0x2141,0x2141},
01133   {0x2142,0x2142,0x2142},  {0x2143,0x2143,0x2143},
01134   {0x2144,0x2144,0x2144},  {0x2145,0x2145,0x2145},
01135   {0x2146,0x2146,0x2146},  {0x2147,0x2147,0x2147},
01136   {0x2148,0x2148,0x2148},  {0x2149,0x2149,0x2149},
01137   {0x214A,0x214A,0x214A},  {0x214B,0x214B,0x214B},
01138   {0x214C,0x214C,0x214C},  {0x214D,0x214D,0x214D},
01139   {0x214E,0x214E,0x214E},  {0x214F,0x214F,0x214F},
01140   {0x2150,0x2150,0x2150},  {0x2151,0x2151,0x2151},
01141   {0x2152,0x2152,0x2152},  {0x2153,0x2153,0x2153},
01142   {0x2154,0x2154,0x2154},  {0x2155,0x2155,0x2155},
01143   {0x2156,0x2156,0x2156},  {0x2157,0x2157,0x2157},
01144   {0x2158,0x2158,0x2158},  {0x2159,0x2159,0x2159},
01145   {0x215A,0x215A,0x215A},  {0x215B,0x215B,0x215B},
01146   {0x215C,0x215C,0x215C},  {0x215D,0x215D,0x215D},
01147   {0x215E,0x215E,0x215E},  {0x215F,0x215F,0x215F},
01148   {0x2160,0x2170,0x2160},  {0x2161,0x2171,0x2161},
01149   {0x2162,0x2172,0x2162},  {0x2163,0x2173,0x2163},
01150   {0x2164,0x2174,0x2164},  {0x2165,0x2175,0x2165},
01151   {0x2166,0x2176,0x2166},  {0x2167,0x2177,0x2167},
01152   {0x2168,0x2178,0x2168},  {0x2169,0x2179,0x2169},
01153   {0x216A,0x217A,0x216A},  {0x216B,0x217B,0x216B},
01154   {0x216C,0x217C,0x216C},  {0x216D,0x217D,0x216D},
01155   {0x216E,0x217E,0x216E},  {0x216F,0x217F,0x216F},
01156   {0x2160,0x2170,0x2160},  {0x2161,0x2171,0x2161},
01157   {0x2162,0x2172,0x2162},  {0x2163,0x2173,0x2163},
01158   {0x2164,0x2174,0x2164},  {0x2165,0x2175,0x2165},
01159   {0x2166,0x2176,0x2166},  {0x2167,0x2177,0x2167},
01160   {0x2168,0x2178,0x2168},  {0x2169,0x2179,0x2169},
01161   {0x216A,0x217A,0x216A},  {0x216B,0x217B,0x216B},
01162   {0x216C,0x217C,0x216C},  {0x216D,0x217D,0x216D},
01163   {0x216E,0x217E,0x216E},  {0x216F,0x217F,0x216F},
01164   {0x2180,0x2180,0x2180},  {0x2181,0x2181,0x2181},
01165   {0x2182,0x2182,0x2182},  {0x2183,0x2183,0x2183},
01166   {0x2184,0x2184,0x2184},  {0x2185,0x2185,0x2185},
01167   {0x2186,0x2186,0x2186},  {0x2187,0x2187,0x2187},
01168   {0x2188,0x2188,0x2188},  {0x2189,0x2189,0x2189},
01169   {0x218A,0x218A,0x218A},  {0x218B,0x218B,0x218B},
01170   {0x218C,0x218C,0x218C},  {0x218D,0x218D,0x218D},
01171   {0x218E,0x218E,0x218E},  {0x218F,0x218F,0x218F},
01172   {0x2190,0x2190,0x2190},  {0x2191,0x2191,0x2191},
01173   {0x2192,0x2192,0x2192},  {0x2193,0x2193,0x2193},
01174   {0x2194,0x2194,0x2194},  {0x2195,0x2195,0x2195},
01175   {0x2196,0x2196,0x2196},  {0x2197,0x2197,0x2197},
01176   {0x2198,0x2198,0x2198},  {0x2199,0x2199,0x2199},
01177   {0x219A,0x219A,0x219A},  {0x219B,0x219B,0x219B},
01178   {0x219C,0x219C,0x219C},  {0x219D,0x219D,0x219D},
01179   {0x219E,0x219E,0x219E},  {0x219F,0x219F,0x219F},
01180   {0x21A0,0x21A0,0x21A0},  {0x21A1,0x21A1,0x21A1},
01181   {0x21A2,0x21A2,0x21A2},  {0x21A3,0x21A3,0x21A3},
01182   {0x21A4,0x21A4,0x21A4},  {0x21A5,0x21A5,0x21A5},
01183   {0x21A6,0x21A6,0x21A6},  {0x21A7,0x21A7,0x21A7},
01184   {0x21A8,0x21A8,0x21A8},  {0x21A9,0x21A9,0x21A9},
01185   {0x21AA,0x21AA,0x21AA},  {0x21AB,0x21AB,0x21AB},
01186   {0x21AC,0x21AC,0x21AC},  {0x21AD,0x21AD,0x21AD},
01187   {0x21AE,0x21AE,0x21AE},  {0x21AF,0x21AF,0x21AF},
01188   {0x21B0,0x21B0,0x21B0},  {0x21B1,0x21B1,0x21B1},
01189   {0x21B2,0x21B2,0x21B2},  {0x21B3,0x21B3,0x21B3},
01190   {0x21B4,0x21B4,0x21B4},  {0x21B5,0x21B5,0x21B5},
01191   {0x21B6,0x21B6,0x21B6},  {0x21B7,0x21B7,0x21B7},
01192   {0x21B8,0x21B8,0x21B8},  {0x21B9,0x21B9,0x21B9},
01193   {0x21BA,0x21BA,0x21BA},  {0x21BB,0x21BB,0x21BB},
01194   {0x21BC,0x21BC,0x21BC},  {0x21BD,0x21BD,0x21BD},
01195   {0x21BE,0x21BE,0x21BE},  {0x21BF,0x21BF,0x21BF},
01196   {0x21C0,0x21C0,0x21C0},  {0x21C1,0x21C1,0x21C1},
01197   {0x21C2,0x21C2,0x21C2},  {0x21C3,0x21C3,0x21C3},
01198   {0x21C4,0x21C4,0x21C4},  {0x21C5,0x21C5,0x21C5},
01199   {0x21C6,0x21C6,0x21C6},  {0x21C7,0x21C7,0x21C7},
01200   {0x21C8,0x21C8,0x21C8},  {0x21C9,0x21C9,0x21C9},
01201   {0x21CA,0x21CA,0x21CA},  {0x21CB,0x21CB,0x21CB},
01202   {0x21CC,0x21CC,0x21CC},  {0x21CD,0x21CD,0x21CD},
01203   {0x21CE,0x21CE,0x21CE},  {0x21CF,0x21CF,0x21CF},
01204   {0x21D0,0x21D0,0x21D0},  {0x21D1,0x21D1,0x21D1},
01205   {0x21D2,0x21D2,0x21D2},  {0x21D3,0x21D3,0x21D3},
01206   {0x21D4,0x21D4,0x21D4},  {0x21D5,0x21D5,0x21D5},
01207   {0x21D6,0x21D6,0x21D6},  {0x21D7,0x21D7,0x21D7},
01208   {0x21D8,0x21D8,0x21D8},  {0x21D9,0x21D9,0x21D9},
01209   {0x21DA,0x21DA,0x21DA},  {0x21DB,0x21DB,0x21DB},
01210   {0x21DC,0x21DC,0x21DC},  {0x21DD,0x21DD,0x21DD},
01211   {0x21DE,0x21DE,0x21DE},  {0x21DF,0x21DF,0x21DF},
01212   {0x21E0,0x21E0,0x21E0},  {0x21E1,0x21E1,0x21E1},
01213   {0x21E2,0x21E2,0x21E2},  {0x21E3,0x21E3,0x21E3},
01214   {0x21E4,0x21E4,0x21E4},  {0x21E5,0x21E5,0x21E5},
01215   {0x21E6,0x21E6,0x21E6},  {0x21E7,0x21E7,0x21E7},
01216   {0x21E8,0x21E8,0x21E8},  {0x21E9,0x21E9,0x21E9},
01217   {0x21EA,0x21EA,0x21EA},  {0x21EB,0x21EB,0x21EB},
01218   {0x21EC,0x21EC,0x21EC},  {0x21ED,0x21ED,0x21ED},
01219   {0x21EE,0x21EE,0x21EE},  {0x21EF,0x21EF,0x21EF},
01220   {0x21F0,0x21F0,0x21F0},  {0x21F1,0x21F1,0x21F1},
01221   {0x21F2,0x21F2,0x21F2},  {0x21F3,0x21F3,0x21F3},
01222   {0x21F4,0x21F4,0x21F4},  {0x21F5,0x21F5,0x21F5},
01223   {0x21F6,0x21F6,0x21F6},  {0x21F7,0x21F7,0x21F7},
01224   {0x21F8,0x21F8,0x21F8},  {0x21F9,0x21F9,0x21F9},
01225   {0x21FA,0x21FA,0x21FA},  {0x21FB,0x21FB,0x21FB},
01226   {0x21FC,0x21FC,0x21FC},  {0x21FD,0x21FD,0x21FD},
01227   {0x21FE,0x21FE,0x21FE},  {0x21FF,0x21FF,0x21FF}
01228 };
01229 
01230 static MY_UNICASE_INFO plane24[]={
01231   {0x2400,0x2400,0x2400},  {0x2401,0x2401,0x2401},
01232   {0x2402,0x2402,0x2402},  {0x2403,0x2403,0x2403},
01233   {0x2404,0x2404,0x2404},  {0x2405,0x2405,0x2405},
01234   {0x2406,0x2406,0x2406},  {0x2407,0x2407,0x2407},
01235   {0x2408,0x2408,0x2408},  {0x2409,0x2409,0x2409},
01236   {0x240A,0x240A,0x240A},  {0x240B,0x240B,0x240B},
01237   {0x240C,0x240C,0x240C},  {0x240D,0x240D,0x240D},
01238   {0x240E,0x240E,0x240E},  {0x240F,0x240F,0x240F},
01239   {0x2410,0x2410,0x2410},  {0x2411,0x2411,0x2411},
01240   {0x2412,0x2412,0x2412},  {0x2413,0x2413,0x2413},
01241   {0x2414,0x2414,0x2414},  {0x2415,0x2415,0x2415},
01242   {0x2416,0x2416,0x2416},  {0x2417,0x2417,0x2417},
01243   {0x2418,0x2418,0x2418},  {0x2419,0x2419,0x2419},
01244   {0x241A,0x241A,0x241A},  {0x241B,0x241B,0x241B},
01245   {0x241C,0x241C,0x241C},  {0x241D,0x241D,0x241D},
01246   {0x241E,0x241E,0x241E},  {0x241F,0x241F,0x241F},
01247   {0x2420,0x2420,0x2420},  {0x2421,0x2421,0x2421},
01248   {0x2422,0x2422,0x2422},  {0x2423,0x2423,0x2423},
01249   {0x2424,0x2424,0x2424},  {0x2425,0x2425,0x2425},
01250   {0x2426,0x2426,0x2426},  {0x2427,0x2427,0x2427},
01251   {0x2428,0x2428,0x2428},  {0x2429,0x2429,0x2429},
01252   {0x242A,0x242A,0x242A},  {0x242B,0x242B,0x242B},
01253   {0x242C,0x242C,0x242C},  {0x242D,0x242D,0x242D},
01254   {0x242E,0x242E,0x242E},  {0x242F,0x242F,0x242F},
01255   {0x2430,0x2430,0x2430},  {0x2431,0x2431,0x2431},
01256   {0x2432,0x2432,0x2432},  {0x2433,0x2433,0x2433},
01257   {0x2434,0x2434,0x2434},  {0x2435,0x2435,0x2435},
01258   {0x2436,0x2436,0x2436},  {0x2437,0x2437,0x2437},
01259   {0x2438,0x2438,0x2438},  {0x2439,0x2439,0x2439},
01260   {0x243A,0x243A,0x243A},  {0x243B,0x243B,0x243B},
01261   {0x243C,0x243C,0x243C},  {0x243D,0x243D,0x243D},
01262   {0x243E,0x243E,0x243E},  {0x243F,0x243F,0x243F},
01263   {0x2440,0x2440,0x2440},  {0x2441,0x2441,0x2441},
01264   {0x2442,0x2442,0x2442},  {0x2443,0x2443,0x2443},
01265   {0x2444,0x2444,0x2444},  {0x2445,0x2445,0x2445},
01266   {0x2446,0x2446,0x2446},  {0x2447,0x2447,0x2447},
01267   {0x2448,0x2448,0x2448},  {0x2449,0x2449,0x2449},
01268   {0x244A,0x244A,0x244A},  {0x244B,0x244B,0x244B},
01269   {0x244C,0x244C,0x244C},  {0x244D,0x244D,0x244D},
01270   {0x244E,0x244E,0x244E},  {0x244F,0x244F,0x244F},
01271   {0x2450,0x2450,0x2450},  {0x2451,0x2451,0x2451},
01272   {0x2452,0x2452,0x2452},  {0x2453,0x2453,0x2453},
01273   {0x2454,0x2454,0x2454},  {0x2455,0x2455,0x2455},
01274   {0x2456,0x2456,0x2456},  {0x2457,0x2457,0x2457},
01275   {0x2458,0x2458,0x2458},  {0x2459,0x2459,0x2459},
01276   {0x245A,0x245A,0x245A},  {0x245B,0x245B,0x245B},
01277   {0x245C,0x245C,0x245C},  {0x245D,0x245D,0x245D},
01278   {0x245E,0x245E,0x245E},  {0x245F,0x245F,0x245F},
01279   {0x2460,0x2460,0x2460},  {0x2461,0x2461,0x2461},
01280   {0x2462,0x2462,0x2462},  {0x2463,0x2463,0x2463},
01281   {0x2464,0x2464,0x2464},  {0x2465,0x2465,0x2465},
01282   {0x2466,0x2466,0x2466},  {0x2467,0x2467,0x2467},
01283   {0x2468,0x2468,0x2468},  {0x2469,0x2469,0x2469},
01284   {0x246A,0x246A,0x246A},  {0x246B,0x246B,0x246B},
01285   {0x246C,0x246C,0x246C},  {0x246D,0x246D,0x246D},
01286   {0x246E,0x246E,0x246E},  {0x246F,0x246F,0x246F},
01287   {0x2470,0x2470,0x2470},  {0x2471,0x2471,0x2471},
01288   {0x2472,0x2472,0x2472},  {0x2473,0x2473,0x2473},
01289   {0x2474,0x2474,0x2474},  {0x2475,0x2475,0x2475},
01290   {0x2476,0x2476,0x2476},  {0x2477,0x2477,0x2477},
01291   {0x2478,0x2478,0x2478},  {0x2479,0x2479,0x2479},
01292   {0x247A,0x247A,0x247A},  {0x247B,0x247B,0x247B},
01293   {0x247C,0x247C,0x247C},  {0x247D,0x247D,0x247D},
01294   {0x247E,0x247E,0x247E},  {0x247F,0x247F,0x247F},
01295   {0x2480,0x2480,0x2480},  {0x2481,0x2481,0x2481},
01296   {0x2482,0x2482,0x2482},  {0x2483,0x2483,0x2483},
01297   {0x2484,0x2484,0x2484},  {0x2485,0x2485,0x2485},
01298   {0x2486,0x2486,0x2486},  {0x2487,0x2487,0x2487},
01299   {0x2488,0x2488,0x2488},  {0x2489,0x2489,0x2489},
01300   {0x248A,0x248A,0x248A},  {0x248B,0x248B,0x248B},
01301   {0x248C,0x248C,0x248C},  {0x248D,0x248D,0x248D},
01302   {0x248E,0x248E,0x248E},  {0x248F,0x248F,0x248F},
01303   {0x2490,0x2490,0x2490},  {0x2491,0x2491,0x2491},
01304   {0x2492,0x2492,0x2492},  {0x2493,0x2493,0x2493},
01305   {0x2494,0x2494,0x2494},  {0x2495,0x2495,0x2495},
01306   {0x2496,0x2496,0x2496},  {0x2497,0x2497,0x2497},
01307   {0x2498,0x2498,0x2498},  {0x2499,0x2499,0x2499},
01308   {0x249A,0x249A,0x249A},  {0x249B,0x249B,0x249B},
01309   {0x249C,0x249C,0x249C},  {0x249D,0x249D,0x249D},
01310   {0x249E,0x249E,0x249E},  {0x249F,0x249F,0x249F},
01311   {0x24A0,0x24A0,0x24A0},  {0x24A1,0x24A1,0x24A1},
01312   {0x24A2,0x24A2,0x24A2},  {0x24A3,0x24A3,0x24A3},
01313   {0x24A4,0x24A4,0x24A4},  {0x24A5,0x24A5,0x24A5},
01314   {0x24A6,0x24A6,0x24A6},  {0x24A7,0x24A7,0x24A7},
01315   {0x24A8,0x24A8,0x24A8},  {0x24A9,0x24A9,0x24A9},
01316   {0x24AA,0x24AA,0x24AA},  {0x24AB,0x24AB,0x24AB},
01317   {0x24AC,0x24AC,0x24AC},  {0x24AD,0x24AD,0x24AD},
01318   {0x24AE,0x24AE,0x24AE},  {0x24AF,0x24AF,0x24AF},
01319   {0x24B0,0x24B0,0x24B0},  {0x24B1,0x24B1,0x24B1},
01320   {0x24B2,0x24B2,0x24B2},  {0x24B3,0x24B3,0x24B3},
01321   {0x24B4,0x24B4,0x24B4},  {0x24B5,0x24B5,0x24B5},
01322   {0x24B6,0x24D0,0x24B6},  {0x24B7,0x24D1,0x24B7},
01323   {0x24B8,0x24D2,0x24B8},  {0x24B9,0x24D3,0x24B9},
01324   {0x24BA,0x24D4,0x24BA},  {0x24BB,0x24D5,0x24BB},
01325   {0x24BC,0x24D6,0x24BC},  {0x24BD,0x24D7,0x24BD},
01326   {0x24BE,0x24D8,0x24BE},  {0x24BF,0x24D9,0x24BF},
01327   {0x24C0,0x24DA,0x24C0},  {0x24C1,0x24DB,0x24C1},
01328   {0x24C2,0x24DC,0x24C2},  {0x24C3,0x24DD,0x24C3},
01329   {0x24C4,0x24DE,0x24C4},  {0x24C5,0x24DF,0x24C5},
01330   {0x24C6,0x24E0,0x24C6},  {0x24C7,0x24E1,0x24C7},
01331   {0x24C8,0x24E2,0x24C8},  {0x24C9,0x24E3,0x24C9},
01332   {0x24CA,0x24E4,0x24CA},  {0x24CB,0x24E5,0x24CB},
01333   {0x24CC,0x24E6,0x24CC},  {0x24CD,0x24E7,0x24CD},
01334   {0x24CE,0x24E8,0x24CE},  {0x24CF,0x24E9,0x24CF},
01335   {0x24B6,0x24D0,0x24B6},  {0x24B7,0x24D1,0x24B7},
01336   {0x24B8,0x24D2,0x24B8},  {0x24B9,0x24D3,0x24B9},
01337   {0x24BA,0x24D4,0x24BA},  {0x24BB,0x24D5,0x24BB},
01338   {0x24BC,0x24D6,0x24BC},  {0x24BD,0x24D7,0x24BD},
01339   {0x24BE,0x24D8,0x24BE},  {0x24BF,0x24D9,0x24BF},
01340   {0x24C0,0x24DA,0x24C0},  {0x24C1,0x24DB,0x24C1},
01341   {0x24C2,0x24DC,0x24C2},  {0x24C3,0x24DD,0x24C3},
01342   {0x24C4,0x24DE,0x24C4},  {0x24C5,0x24DF,0x24C5},
01343   {0x24C6,0x24E0,0x24C6},  {0x24C7,0x24E1,0x24C7},
01344   {0x24C8,0x24E2,0x24C8},  {0x24C9,0x24E3,0x24C9},
01345   {0x24CA,0x24E4,0x24CA},  {0x24CB,0x24E5,0x24CB},
01346   {0x24CC,0x24E6,0x24CC},  {0x24CD,0x24E7,0x24CD},
01347   {0x24CE,0x24E8,0x24CE},  {0x24CF,0x24E9,0x24CF},
01348   {0x24EA,0x24EA,0x24EA},  {0x24EB,0x24EB,0x24EB},
01349   {0x24EC,0x24EC,0x24EC},  {0x24ED,0x24ED,0x24ED},
01350   {0x24EE,0x24EE,0x24EE},  {0x24EF,0x24EF,0x24EF},
01351   {0x24F0,0x24F0,0x24F0},  {0x24F1,0x24F1,0x24F1},
01352   {0x24F2,0x24F2,0x24F2},  {0x24F3,0x24F3,0x24F3},
01353   {0x24F4,0x24F4,0x24F4},  {0x24F5,0x24F5,0x24F5},
01354   {0x24F6,0x24F6,0x24F6},  {0x24F7,0x24F7,0x24F7},
01355   {0x24F8,0x24F8,0x24F8},  {0x24F9,0x24F9,0x24F9},
01356   {0x24FA,0x24FA,0x24FA},  {0x24FB,0x24FB,0x24FB},
01357   {0x24FC,0x24FC,0x24FC},  {0x24FD,0x24FD,0x24FD},
01358   {0x24FE,0x24FE,0x24FE},  {0x24FF,0x24FF,0x24FF}
01359 };
01360 
01361 static MY_UNICASE_INFO planeFF[]={
01362   {0xFF00,0xFF00,0xFF00},  {0xFF01,0xFF01,0xFF01},
01363   {0xFF02,0xFF02,0xFF02},  {0xFF03,0xFF03,0xFF03},
01364   {0xFF04,0xFF04,0xFF04},  {0xFF05,0xFF05,0xFF05},
01365   {0xFF06,0xFF06,0xFF06},  {0xFF07,0xFF07,0xFF07},
01366   {0xFF08,0xFF08,0xFF08},  {0xFF09,0xFF09,0xFF09},
01367   {0xFF0A,0xFF0A,0xFF0A},  {0xFF0B,0xFF0B,0xFF0B},
01368   {0xFF0C,0xFF0C,0xFF0C},  {0xFF0D,0xFF0D,0xFF0D},
01369   {0xFF0E,0xFF0E,0xFF0E},  {0xFF0F,0xFF0F,0xFF0F},
01370   {0xFF10,0xFF10,0xFF10},  {0xFF11,0xFF11,0xFF11},
01371   {0xFF12,0xFF12,0xFF12},  {0xFF13,0xFF13,0xFF13},
01372   {0xFF14,0xFF14,0xFF14},  {0xFF15,0xFF15,0xFF15},
01373   {0xFF16,0xFF16,0xFF16},  {0xFF17,0xFF17,0xFF17},
01374   {0xFF18,0xFF18,0xFF18},  {0xFF19,0xFF19,0xFF19},
01375   {0xFF1A,0xFF1A,0xFF1A},  {0xFF1B,0xFF1B,0xFF1B},
01376   {0xFF1C,0xFF1C,0xFF1C},  {0xFF1D,0xFF1D,0xFF1D},
01377   {0xFF1E,0xFF1E,0xFF1E},  {0xFF1F,0xFF1F,0xFF1F},
01378   {0xFF20,0xFF20,0xFF20},  {0xFF21,0xFF41,0xFF21},
01379   {0xFF22,0xFF42,0xFF22},  {0xFF23,0xFF43,0xFF23},
01380   {0xFF24,0xFF44,0xFF24},  {0xFF25,0xFF45,0xFF25},
01381   {0xFF26,0xFF46,0xFF26},  {0xFF27,0xFF47,0xFF27},
01382   {0xFF28,0xFF48,0xFF28},  {0xFF29,0xFF49,0xFF29},
01383   {0xFF2A,0xFF4A,0xFF2A},  {0xFF2B,0xFF4B,0xFF2B},
01384   {0xFF2C,0xFF4C,0xFF2C},  {0xFF2D,0xFF4D,0xFF2D},
01385   {0xFF2E,0xFF4E,0xFF2E},  {0xFF2F,0xFF4F,0xFF2F},
01386   {0xFF30,0xFF50,0xFF30},  {0xFF31,0xFF51,0xFF31},
01387   {0xFF32,0xFF52,0xFF32},  {0xFF33,0xFF53,0xFF33},
01388   {0xFF34,0xFF54,0xFF34},  {0xFF35,0xFF55,0xFF35},
01389   {0xFF36,0xFF56,0xFF36},  {0xFF37,0xFF57,0xFF37},
01390   {0xFF38,0xFF58,0xFF38},  {0xFF39,0xFF59,0xFF39},
01391   {0xFF3A,0xFF5A,0xFF3A},  {0xFF3B,0xFF3B,0xFF3B},
01392   {0xFF3C,0xFF3C,0xFF3C},  {0xFF3D,0xFF3D,0xFF3D},
01393   {0xFF3E,0xFF3E,0xFF3E},  {0xFF3F,0xFF3F,0xFF3F},
01394   {0xFF40,0xFF40,0xFF40},  {0xFF21,0xFF41,0xFF21},
01395   {0xFF22,0xFF42,0xFF22},  {0xFF23,0xFF43,0xFF23},
01396   {0xFF24,0xFF44,0xFF24},  {0xFF25,0xFF45,0xFF25},
01397   {0xFF26,0xFF46,0xFF26},  {0xFF27,0xFF47,0xFF27},
01398   {0xFF28,0xFF48,0xFF28},  {0xFF29,0xFF49,0xFF29},
01399   {0xFF2A,0xFF4A,0xFF2A},  {0xFF2B,0xFF4B,0xFF2B},
01400   {0xFF2C,0xFF4C,0xFF2C},  {0xFF2D,0xFF4D,0xFF2D},
01401   {0xFF2E,0xFF4E,0xFF2E},  {0xFF2F,0xFF4F,0xFF2F},
01402   {0xFF30,0xFF50,0xFF30},  {0xFF31,0xFF51,0xFF31},
01403   {0xFF32,0xFF52,0xFF32},  {0xFF33,0xFF53,0xFF33},
01404   {0xFF34,0xFF54,0xFF34},  {0xFF35,0xFF55,0xFF35},
01405   {0xFF36,0xFF56,0xFF36},  {0xFF37,0xFF57,0xFF37},
01406   {0xFF38,0xFF58,0xFF38},  {0xFF39,0xFF59,0xFF39},
01407   {0xFF3A,0xFF5A,0xFF3A},  {0xFF5B,0xFF5B,0xFF5B},
01408   {0xFF5C,0xFF5C,0xFF5C},  {0xFF5D,0xFF5D,0xFF5D},
01409   {0xFF5E,0xFF5E,0xFF5E},  {0xFF5F,0xFF5F,0xFF5F},
01410   {0xFF60,0xFF60,0xFF60},  {0xFF61,0xFF61,0xFF61},
01411   {0xFF62,0xFF62,0xFF62},  {0xFF63,0xFF63,0xFF63},
01412   {0xFF64,0xFF64,0xFF64},  {0xFF65,0xFF65,0xFF65},
01413   {0xFF66,0xFF66,0xFF66},  {0xFF67,0xFF67,0xFF67},
01414   {0xFF68,0xFF68,0xFF68},  {0xFF69,0xFF69,0xFF69},
01415   {0xFF6A,0xFF6A,0xFF6A},  {0xFF6B,0xFF6B,0xFF6B},
01416   {0xFF6C,0xFF6C,0xFF6C},  {0xFF6D,0xFF6D,0xFF6D},
01417   {0xFF6E,0xFF6E,0xFF6E},  {0xFF6F,0xFF6F,0xFF6F},
01418   {0xFF70,0xFF70,0xFF70},  {0xFF71,0xFF71,0xFF71},
01419   {0xFF72,0xFF72,0xFF72},  {0xFF73,0xFF73,0xFF73},
01420   {0xFF74,0xFF74,0xFF74},  {0xFF75,0xFF75,0xFF75},
01421   {0xFF76,0xFF76,0xFF76},  {0xFF77,0xFF77,0xFF77},
01422   {0xFF78,0xFF78,0xFF78},  {0xFF79,0xFF79,0xFF79},
01423   {0xFF7A,0xFF7A,0xFF7A},  {0xFF7B,0xFF7B,0xFF7B},
01424   {0xFF7C,0xFF7C,0xFF7C},  {0xFF7D,0xFF7D,0xFF7D},
01425   {0xFF7E,0xFF7E,0xFF7E},  {0xFF7F,0xFF7F,0xFF7F},
01426   {0xFF80,0xFF80,0xFF80},  {0xFF81,0xFF81,0xFF81},
01427   {0xFF82,0xFF82,0xFF82},  {0xFF83,0xFF83,0xFF83},
01428   {0xFF84,0xFF84,0xFF84},  {0xFF85,0xFF85,0xFF85},
01429   {0xFF86,0xFF86,0xFF86},  {0xFF87,0xFF87,0xFF87},
01430   {0xFF88,0xFF88,0xFF88},  {0xFF89,0xFF89,0xFF89},
01431   {0xFF8A,0xFF8A,0xFF8A},  {0xFF8B,0xFF8B,0xFF8B},
01432   {0xFF8C,0xFF8C,0xFF8C},  {0xFF8D,0xFF8D,0xFF8D},
01433   {0xFF8E,0xFF8E,0xFF8E},  {0xFF8F,0xFF8F,0xFF8F},
01434   {0xFF90,0xFF90,0xFF90},  {0xFF91,0xFF91,0xFF91},
01435   {0xFF92,0xFF92,0xFF92},  {0xFF93,0xFF93,0xFF93},
01436   {0xFF94,0xFF94,0xFF94},  {0xFF95,0xFF95,0xFF95},
01437   {0xFF96,0xFF96,0xFF96},  {0xFF97,0xFF97,0xFF97},
01438   {0xFF98,0xFF98,0xFF98},  {0xFF99,0xFF99,0xFF99},
01439   {0xFF9A,0xFF9A,0xFF9A},  {0xFF9B,0xFF9B,0xFF9B},
01440   {0xFF9C,0xFF9C,0xFF9C},  {0xFF9D,0xFF9D,0xFF9D},
01441   {0xFF9E,0xFF9E,0xFF9E},  {0xFF9F,0xFF9F,0xFF9F},
01442   {0xFFA0,0xFFA0,0xFFA0},  {0xFFA1,0xFFA1,0xFFA1},
01443   {0xFFA2,0xFFA2,0xFFA2},  {0xFFA3,0xFFA3,0xFFA3},
01444   {0xFFA4,0xFFA4,0xFFA4},  {0xFFA5,0xFFA5,0xFFA5},
01445   {0xFFA6,0xFFA6,0xFFA6},  {0xFFA7,0xFFA7,0xFFA7},
01446   {0xFFA8,0xFFA8,0xFFA8},  {0xFFA9,0xFFA9,0xFFA9},
01447   {0xFFAA,0xFFAA,0xFFAA},  {0xFFAB,0xFFAB,0xFFAB},
01448   {0xFFAC,0xFFAC,0xFFAC},  {0xFFAD,0xFFAD,0xFFAD},
01449   {0xFFAE,0xFFAE,0xFFAE},  {0xFFAF,0xFFAF,0xFFAF},
01450   {0xFFB0,0xFFB0,0xFFB0},  {0xFFB1,0xFFB1,0xFFB1},
01451   {0xFFB2,0xFFB2,0xFFB2},  {0xFFB3,0xFFB3,0xFFB3},
01452   {0xFFB4,0xFFB4,0xFFB4},  {0xFFB5,0xFFB5,0xFFB5},
01453   {0xFFB6,0xFFB6,0xFFB6},  {0xFFB7,0xFFB7,0xFFB7},
01454   {0xFFB8,0xFFB8,0xFFB8},  {0xFFB9,0xFFB9,0xFFB9},
01455   {0xFFBA,0xFFBA,0xFFBA},  {0xFFBB,0xFFBB,0xFFBB},
01456   {0xFFBC,0xFFBC,0xFFBC},  {0xFFBD,0xFFBD,0xFFBD},
01457   {0xFFBE,0xFFBE,0xFFBE},  {0xFFBF,0xFFBF,0xFFBF},
01458   {0xFFC0,0xFFC0,0xFFC0},  {0xFFC1,0xFFC1,0xFFC1},
01459   {0xFFC2,0xFFC2,0xFFC2},  {0xFFC3,0xFFC3,0xFFC3},
01460   {0xFFC4,0xFFC4,0xFFC4},  {0xFFC5,0xFFC5,0xFFC5},
01461   {0xFFC6,0xFFC6,0xFFC6},  {0xFFC7,0xFFC7,0xFFC7},
01462   {0xFFC8,0xFFC8,0xFFC8},  {0xFFC9,0xFFC9,0xFFC9},
01463   {0xFFCA,0xFFCA,0xFFCA},  {0xFFCB,0xFFCB,0xFFCB},
01464   {0xFFCC,0xFFCC,0xFFCC},  {0xFFCD,0xFFCD,0xFFCD},
01465   {0xFFCE,0xFFCE,0xFFCE},  {0xFFCF,0xFFCF,0xFFCF},
01466   {0xFFD0,0xFFD0,0xFFD0},  {0xFFD1,0xFFD1,0xFFD1},
01467   {0xFFD2,0xFFD2,0xFFD2},  {0xFFD3,0xFFD3,0xFFD3},
01468   {0xFFD4,0xFFD4,0xFFD4},  {0xFFD5,0xFFD5,0xFFD5},
01469   {0xFFD6,0xFFD6,0xFFD6},  {0xFFD7,0xFFD7,0xFFD7},
01470   {0xFFD8,0xFFD8,0xFFD8},  {0xFFD9,0xFFD9,0xFFD9},
01471   {0xFFDA,0xFFDA,0xFFDA},  {0xFFDB,0xFFDB,0xFFDB},
01472   {0xFFDC,0xFFDC,0xFFDC},  {0xFFDD,0xFFDD,0xFFDD},
01473   {0xFFDE,0xFFDE,0xFFDE},  {0xFFDF,0xFFDF,0xFFDF},
01474   {0xFFE0,0xFFE0,0xFFE0},  {0xFFE1,0xFFE1,0xFFE1},
01475   {0xFFE2,0xFFE2,0xFFE2},  {0xFFE3,0xFFE3,0xFFE3},
01476   {0xFFE4,0xFFE4,0xFFE4},  {0xFFE5,0xFFE5,0xFFE5},
01477   {0xFFE6,0xFFE6,0xFFE6},  {0xFFE7,0xFFE7,0xFFE7},
01478   {0xFFE8,0xFFE8,0xFFE8},  {0xFFE9,0xFFE9,0xFFE9},
01479   {0xFFEA,0xFFEA,0xFFEA},  {0xFFEB,0xFFEB,0xFFEB},
01480   {0xFFEC,0xFFEC,0xFFEC},  {0xFFED,0xFFED,0xFFED},
01481   {0xFFEE,0xFFEE,0xFFEE},  {0xFFEF,0xFFEF,0xFFEF},
01482   {0xFFF0,0xFFF0,0xFFF0},  {0xFFF1,0xFFF1,0xFFF1},
01483   {0xFFF2,0xFFF2,0xFFF2},  {0xFFF3,0xFFF3,0xFFF3},
01484   {0xFFF4,0xFFF4,0xFFF4},  {0xFFF5,0xFFF5,0xFFF5},
01485   {0xFFF6,0xFFF6,0xFFF6},  {0xFFF7,0xFFF7,0xFFF7},
01486   {0xFFF8,0xFFF8,0xFFF8},  {0xFFF9,0xFFF9,0xFFF9},
01487   {0xFFFA,0xFFFA,0xFFFA},  {0xFFFB,0xFFFB,0xFFFB},
01488   {0xFFFC,0xFFFC,0xFFFC},  {0xFFFD,0xFFFD,0xFFFD},
01489   {0xFFFE,0xFFFE,0xFFFE},  {0xFFFF,0xFFFF,0xFFFF}
01490 };
01491 
01492 MY_UNICASE_INFO *my_unicase_default[256]={
01493  plane00, plane01, plane02, plane03, plane04, plane05,    NULL,    NULL,
01494     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01495     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01496     NULL,    NULL,    NULL,    NULL,    NULL,    NULL, plane1E, plane1F,
01497     NULL, plane21,    NULL,    NULL, plane24,    NULL,    NULL,    NULL,
01498     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01499     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01500     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01501     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01502     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01503     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01504     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01505     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01506     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01507     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01508     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01509     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01510     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01511     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01512     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01513     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01514     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01515     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01516     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01517     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01518     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01519     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01520     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01521     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01522     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01523     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01524     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL, planeFF
01525 
01526 };
01527 
01528 
01529 /*
01530   Turkish lower/upper mapping:
01531   1. LOWER(0x0049 LATIN CAPITAL LETTER I) ->
01532            0x0131 LATIN SMALL   LETTER DOTLESS I
01533   2. UPPER(0x0069 LATIN SMALL   LETTER I) ->
01534            0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE
01535 */
01536 
01537 static MY_UNICASE_INFO turk00[]=
01538 {
01539   {0x0000,0x0000,0x0000},  {0x0001,0x0001,0x0001},
01540   {0x0002,0x0002,0x0002},  {0x0003,0x0003,0x0003},
01541   {0x0004,0x0004,0x0004},  {0x0005,0x0005,0x0005},
01542   {0x0006,0x0006,0x0006},  {0x0007,0x0007,0x0007},
01543   {0x0008,0x0008,0x0008},  {0x0009,0x0009,0x0009},
01544   {0x000A,0x000A,0x000A},  {0x000B,0x000B,0x000B},
01545   {0x000C,0x000C,0x000C},  {0x000D,0x000D,0x000D},
01546   {0x000E,0x000E,0x000E},  {0x000F,0x000F,0x000F},
01547   {0x0010,0x0010,0x0010},  {0x0011,0x0011,0x0011},
01548   {0x0012,0x0012,0x0012},  {0x0013,0x0013,0x0013},
01549   {0x0014,0x0014,0x0014},  {0x0015,0x0015,0x0015},
01550   {0x0016,0x0016,0x0016},  {0x0017,0x0017,0x0017},
01551   {0x0018,0x0018,0x0018},  {0x0019,0x0019,0x0019},
01552   {0x001A,0x001A,0x001A},  {0x001B,0x001B,0x001B},
01553   {0x001C,0x001C,0x001C},  {0x001D,0x001D,0x001D},
01554   {0x001E,0x001E,0x001E},  {0x001F,0x001F,0x001F},
01555   {0x0020,0x0020,0x0020},  {0x0021,0x0021,0x0021},
01556   {0x0022,0x0022,0x0022},  {0x0023,0x0023,0x0023},
01557   {0x0024,0x0024,0x0024},  {0x0025,0x0025,0x0025},
01558   {0x0026,0x0026,0x0026},  {0x0027,0x0027,0x0027},
01559   {0x0028,0x0028,0x0028},  {0x0029,0x0029,0x0029},
01560   {0x002A,0x002A,0x002A},  {0x002B,0x002B,0x002B},
01561   {0x002C,0x002C,0x002C},  {0x002D,0x002D,0x002D},
01562   {0x002E,0x002E,0x002E},  {0x002F,0x002F,0x002F},
01563   {0x0030,0x0030,0x0030},  {0x0031,0x0031,0x0031},
01564   {0x0032,0x0032,0x0032},  {0x0033,0x0033,0x0033},
01565   {0x0034,0x0034,0x0034},  {0x0035,0x0035,0x0035},
01566   {0x0036,0x0036,0x0036},  {0x0037,0x0037,0x0037},
01567   {0x0038,0x0038,0x0038},  {0x0039,0x0039,0x0039},
01568   {0x003A,0x003A,0x003A},  {0x003B,0x003B,0x003B},
01569   {0x003C,0x003C,0x003C},  {0x003D,0x003D,0x003D},
01570   {0x003E,0x003E,0x003E},  {0x003F,0x003F,0x003F},
01571   {0x0040,0x0040,0x0040},  {0x0041,0x0061,0x0041},
01572   {0x0042,0x0062,0x0042},  {0x0043,0x0063,0x0043},
01573   {0x0044,0x0064,0x0044},  {0x0045,0x0065,0x0045},
01574   {0x0046,0x0066,0x0046},  {0x0047,0x0067,0x0047},
01575   {0x0048,0x0068,0x0048},  {0x0049,0x0131,0x0049},
01576   {0x004A,0x006A,0x004A},  {0x004B,0x006B,0x004B},
01577   {0x004C,0x006C,0x004C},  {0x004D,0x006D,0x004D},
01578   {0x004E,0x006E,0x004E},  {0x004F,0x006F,0x004F},
01579   {0x0050,0x0070,0x0050},  {0x0051,0x0071,0x0051},
01580   {0x0052,0x0072,0x0052},  {0x0053,0x0073,0x0053},
01581   {0x0054,0x0074,0x0054},  {0x0055,0x0075,0x0055},
01582   {0x0056,0x0076,0x0056},  {0x0057,0x0077,0x0057},
01583   {0x0058,0x0078,0x0058},  {0x0059,0x0079,0x0059},
01584   {0x005A,0x007A,0x005A},  {0x005B,0x005B,0x005B},
01585   {0x005C,0x005C,0x005C},  {0x005D,0x005D,0x005D},
01586   {0x005E,0x005E,0x005E},  {0x005F,0x005F,0x005F},
01587   {0x0060,0x0060,0x0060},  {0x0041,0x0061,0x0041},
01588   {0x0042,0x0062,0x0042},  {0x0043,0x0063,0x0043},
01589   {0x0044,0x0064,0x0044},  {0x0045,0x0065,0x0045},
01590   {0x0046,0x0066,0x0046},  {0x0047,0x0067,0x0047},
01591   {0x0048,0x0068,0x0048},  {0x0130,0x0069,0x0049},
01592   {0x004A,0x006A,0x004A},  {0x004B,0x006B,0x004B},
01593   {0x004C,0x006C,0x004C},  {0x004D,0x006D,0x004D},
01594   {0x004E,0x006E,0x004E},  {0x004F,0x006F,0x004F},
01595   {0x0050,0x0070,0x0050},  {0x0051,0x0071,0x0051},
01596   {0x0052,0x0072,0x0052},  {0x0053,0x0073,0x0053},
01597   {0x0054,0x0074,0x0054},  {0x0055,0x0075,0x0055},
01598   {0x0056,0x0076,0x0056},  {0x0057,0x0077,0x0057},
01599   {0x0058,0x0078,0x0058},  {0x0059,0x0079,0x0059},
01600   {0x005A,0x007A,0x005A},  {0x007B,0x007B,0x007B},
01601   {0x007C,0x007C,0x007C},  {0x007D,0x007D,0x007D},
01602   {0x007E,0x007E,0x007E},  {0x007F,0x007F,0x007F},
01603   {0x0080,0x0080,0x0080},  {0x0081,0x0081,0x0081},
01604   {0x0082,0x0082,0x0082},  {0x0083,0x0083,0x0083},
01605   {0x0084,0x0084,0x0084},  {0x0085,0x0085,0x0085},
01606   {0x0086,0x0086,0x0086},  {0x0087,0x0087,0x0087},
01607   {0x0088,0x0088,0x0088},  {0x0089,0x0089,0x0089},
01608   {0x008A,0x008A,0x008A},  {0x008B,0x008B,0x008B},
01609   {0x008C,0x008C,0x008C},  {0x008D,0x008D,0x008D},
01610   {0x008E,0x008E,0x008E},  {0x008F,0x008F,0x008F},
01611   {0x0090,0x0090,0x0090},  {0x0091,0x0091,0x0091},
01612   {0x0092,0x0092,0x0092},  {0x0093,0x0093,0x0093},
01613   {0x0094,0x0094,0x0094},  {0x0095,0x0095,0x0095},
01614   {0x0096,0x0096,0x0096},  {0x0097,0x0097,0x0097},
01615   {0x0098,0x0098,0x0098},  {0x0099,0x0099,0x0099},
01616   {0x009A,0x009A,0x009A},  {0x009B,0x009B,0x009B},
01617   {0x009C,0x009C,0x009C},  {0x009D,0x009D,0x009D},
01618   {0x009E,0x009E,0x009E},  {0x009F,0x009F,0x009F},
01619   {0x00A0,0x00A0,0x00A0},  {0x00A1,0x00A1,0x00A1},
01620   {0x00A2,0x00A2,0x00A2},  {0x00A3,0x00A3,0x00A3},
01621   {0x00A4,0x00A4,0x00A4},  {0x00A5,0x00A5,0x00A5},
01622   {0x00A6,0x00A6,0x00A6},  {0x00A7,0x00A7,0x00A7},
01623   {0x00A8,0x00A8,0x00A8},  {0x00A9,0x00A9,0x00A9},
01624   {0x00AA,0x00AA,0x00AA},  {0x00AB,0x00AB,0x00AB},
01625   {0x00AC,0x00AC,0x00AC},  {0x00AD,0x00AD,0x00AD},
01626   {0x00AE,0x00AE,0x00AE},  {0x00AF,0x00AF,0x00AF},
01627   {0x00B0,0x00B0,0x00B0},  {0x00B1,0x00B1,0x00B1},
01628   {0x00B2,0x00B2,0x00B2},  {0x00B3,0x00B3,0x00B3},
01629   {0x00B4,0x00B4,0x00B4},  {0x039C,0x00B5,0x039C},
01630   {0x00B6,0x00B6,0x00B6},  {0x00B7,0x00B7,0x00B7},
01631   {0x00B8,0x00B8,0x00B8},  {0x00B9,0x00B9,0x00B9},
01632   {0x00BA,0x00BA,0x00BA},  {0x00BB,0x00BB,0x00BB},
01633   {0x00BC,0x00BC,0x00BC},  {0x00BD,0x00BD,0x00BD},
01634   {0x00BE,0x00BE,0x00BE},  {0x00BF,0x00BF,0x00BF},
01635   {0x00C0,0x00E0,0x0041},  {0x00C1,0x00E1,0x0041},
01636   {0x00C2,0x00E2,0x0041},  {0x00C3,0x00E3,0x0041},
01637   {0x00C4,0x00E4,0x0041},  {0x00C5,0x00E5,0x0041},
01638   {0x00C6,0x00E6,0x00C6},  {0x00C7,0x00E7,0x0043},
01639   {0x00C8,0x00E8,0x0045},  {0x00C9,0x00E9,0x0045},
01640   {0x00CA,0x00EA,0x0045},  {0x00CB,0x00EB,0x0045},
01641   {0x00CC,0x00EC,0x0049},  {0x00CD,0x00ED,0x0049},
01642   {0x00CE,0x00EE,0x0049},  {0x00CF,0x00EF,0x0049},
01643   {0x00D0,0x00F0,0x00D0},  {0x00D1,0x00F1,0x004E},
01644   {0x00D2,0x00F2,0x004F},  {0x00D3,0x00F3,0x004F},
01645   {0x00D4,0x00F4,0x004F},  {0x00D5,0x00F5,0x004F},
01646   {0x00D6,0x00F6,0x004F},  {0x00D7,0x00D7,0x00D7},
01647   {0x00D8,0x00F8,0x00D8},  {0x00D9,0x00F9,0x0055},
01648   {0x00DA,0x00FA,0x0055},  {0x00DB,0x00FB,0x0055},
01649   {0x00DC,0x00FC,0x0055},  {0x00DD,0x00FD,0x0059},
01650   {0x00DE,0x00FE,0x00DE},  {0x00DF,0x00DF,0x00DF},
01651   {0x00C0,0x00E0,0x0041},  {0x00C1,0x00E1,0x0041},
01652   {0x00C2,0x00E2,0x0041},  {0x00C3,0x00E3,0x0041},
01653   {0x00C4,0x00E4,0x0041},  {0x00C5,0x00E5,0x0041},
01654   {0x00C6,0x00E6,0x00C6},  {0x00C7,0x00E7,0x0043},
01655   {0x00C8,0x00E8,0x0045},  {0x00C9,0x00E9,0x0045},
01656   {0x00CA,0x00EA,0x0045},  {0x00CB,0x00EB,0x0045},
01657   {0x00CC,0x00EC,0x0049},  {0x00CD,0x00ED,0x0049},
01658   {0x00CE,0x00EE,0x0049},  {0x00CF,0x00EF,0x0049},
01659   {0x00D0,0x00F0,0x00D0},  {0x00D1,0x00F1,0x004E},
01660   {0x00D2,0x00F2,0x004F},  {0x00D3,0x00F3,0x004F},
01661   {0x00D4,0x00F4,0x004F},  {0x00D5,0x00F5,0x004F},
01662   {0x00D6,0x00F6,0x004F},  {0x00F7,0x00F7,0x00F7},
01663   {0x00D8,0x00F8,0x00D8},  {0x00D9,0x00F9,0x0055},
01664   {0x00DA,0x00FA,0x0055},  {0x00DB,0x00FB,0x0055},
01665   {0x00DC,0x00FC,0x0055},  {0x00DD,0x00FD,0x0059},
01666   {0x00DE,0x00FE,0x00DE},  {0x0178,0x00FF,0x0059}
01667 };
01668 
01669 
01670 
01671 MY_UNICASE_INFO *my_unicase_turkish[256]=
01672 {
01673   turk00, plane01, plane02, plane03, plane04, plane05,    NULL,    NULL,
01674     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01675     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01676     NULL,    NULL,    NULL,    NULL,    NULL,    NULL, plane1E, plane1F,
01677     NULL, plane21,    NULL,    NULL, plane24,    NULL,    NULL,    NULL,
01678     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01679     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01680     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01681     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01682     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01683     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01684     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01685     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01686     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01687     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01688     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01689     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01690     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01691     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01692     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01693     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01694     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01695     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01696     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01697     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01698     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01699     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01700     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01701     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01702     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01703     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL,
01704     NULL,    NULL,    NULL,    NULL,    NULL,    NULL,    NULL, planeFF
01705 };
01706 
01707 
01708 
01728 int my_wildcmp_unicode(const charset_info_st* cs,
01729            const char *str,const char *str_end,
01730            const char *wildstr,const char *wildend,
01731            int escape, int w_one, int w_many,
01732            MY_UNICASE_INFO **weights)
01733 {
01734   int result= -1;     /* Not found, using wildcards */
01735   my_wc_t s_wc=0, w_wc=0;
01736   int scan, plane;
01737   my_charset_conv_mb_wc mb_wc;
01738   mb_wc= cs->cset->mb_wc;
01739 
01740   while (wildstr != wildend)
01741   {
01742     while (1)
01743     {
01744       bool escaped= 0;
01745       if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
01746                        (const unsigned char*)wildend)) <= 0)
01747         return 1;
01748 
01749       if (w_wc == (my_wc_t)w_many)
01750       {
01751         result= 1;        /* Found an anchor char */
01752         break;
01753       }
01754 
01755       wildstr+= scan;
01756       if (w_wc ==  (my_wc_t)escape && wildstr < wildend)
01757       {
01758         if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
01759                          (const unsigned char*)wildend)) <= 0)
01760           return 1;
01761         wildstr+= scan;
01762         escaped= 1;
01763       }
01764 
01765       if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
01766                        (const unsigned char*)str_end)) <= 0)
01767         return 1;
01768       str+= scan;
01769 
01770       if (!escaped && w_wc == (my_wc_t)w_one)
01771       {
01772         result= 1;        /* Found an anchor char */
01773       }
01774       else
01775       {
01776         if (weights)
01777         {
01778           if (s_wc < 0x10000)
01779           {
01780             plane=(s_wc>>8) & 0xFF;
01781             s_wc = weights[plane] ? weights[plane][s_wc & 0xFF].sort : s_wc;
01782           }
01783           if (w_wc < 0x10000)
01784           {
01785             plane=(w_wc>>8) & 0xFF;
01786             w_wc = weights[plane] ? weights[plane][w_wc & 0xFF].sort : w_wc;
01787           }
01788         }
01789         if (s_wc != w_wc)
01790           return 1;       /* No match */
01791       }
01792       if (wildstr == wildend)
01793   return (str != str_end);    /* Match if both are at end */
01794     }
01795 
01796 
01797     if (w_wc == (my_wc_t)w_many)
01798     {           /* Found w_many */
01799 
01800       /* Remove any '%' and '_' from the wild search string */
01801       for (; wildstr != wildend ;)
01802       {
01803         if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
01804                          (const unsigned char*)wildend)) <= 0)
01805           return 1;
01806 
01807   if (w_wc == (my_wc_t)w_many)
01808   {
01809     wildstr+= scan;
01810     continue;
01811   }
01812 
01813   if (w_wc == (my_wc_t)w_one)
01814   {
01815     wildstr+= scan;
01816           if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
01817                            (const unsigned char*)str_end)) <=0)
01818             return 1;
01819           str+= scan;
01820     continue;
01821   }
01822   break;          /* Not a wild character */
01823       }
01824 
01825       if (wildstr == wildend)
01826   return 0;       /* Ok if w_many is last */
01827 
01828       if (str == str_end)
01829   return -1;
01830 
01831       if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
01832                        (const unsigned char*)wildend)) <=0)
01833         return 1;
01834       wildstr+= scan;
01835 
01836       if (w_wc ==  (my_wc_t)escape)
01837       {
01838         if (wildstr < wildend)
01839         {
01840           if ((scan= mb_wc(cs, &w_wc, (const unsigned char*)wildstr,
01841                            (const unsigned char*)wildend)) <=0)
01842             return 1;
01843           wildstr+= scan;
01844         }
01845       }
01846 
01847       while (1)
01848       {
01849         /* Skip until the first character from wildstr is found */
01850         while (str != str_end)
01851         {
01852           if ((scan= mb_wc(cs, &s_wc, (const unsigned char*)str,
01853                            (const unsigned char*)str_end)) <=0)
01854             return 1;
01855           if (weights)
01856           {
01857             plane=(s_wc>>8) & 0xFF;
01858             s_wc = weights[plane] ? weights[plane][s_wc & 0xFF].sort : s_wc;
01859             plane=(w_wc>>8) & 0xFF;
01860             w_wc = weights[plane] ? weights[plane][w_wc & 0xFF].sort : w_wc;
01861           }
01862 
01863           if (s_wc == w_wc)
01864             break;
01865           str+= scan;
01866         }
01867         if (str == str_end)
01868           return -1;
01869 
01870         str+= scan;
01871         result= my_wildcmp_unicode(cs, str, str_end, wildstr, wildend, escape, w_one, w_many, weights);
01872         if (result <= 0)
01873           return result;
01874       }
01875     }
01876   }
01877   return str != str_end;
01878 }
01879 
01880 
01881 int make_escape_code(const charset_info_st* cs, const char *escape)
01882 {
01883   my_charset_conv_mb_wc mb_wc= cs->cset->mb_wc;
01884   my_wc_t escape_wc;
01885   int rc= mb_wc(cs, &escape_wc, (const unsigned char*) escape, (const unsigned char*) escape + strlen(escape));
01886   return rc > 0 ? escape_wc : '\\';
01887 }
01888 
01889 /*
01890   We consider bytes with code more than 127 as a letter.
01891   This garantees that word boundaries work fine with regular
01892   expressions. Note, there is no need to mark byte 255  as a
01893   letter, it is illegal byte in UTF8.
01894 */
01895 static unsigned char ctype_utf8mb4[]=
01896 {
01897     0,
01898    32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32,
01899    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
01900    72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
01901   132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16,
01902    16,129,129,129,129,129,129,  1,  1,  1,  1,  1,  1,  1,  1,  1,
01903     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 16, 16, 16, 16, 16,
01904    16,130,130,130,130,130,130,  2,  2,  2,  2,  2,  2,  2,  2,  2,
01905     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 16, 16, 16, 16, 32,
01906     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01907     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01908     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01909     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01910     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01911     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01912     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
01913     3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  0
01914 };
01915 
01916 
01917 static unsigned char to_lower_utf8mb4[]=
01918 {
01919     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
01920    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
01921    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
01922    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
01923    64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
01924   112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95,
01925    96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
01926   112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
01927   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
01928   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
01929   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
01930   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
01931   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
01932   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
01933   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
01934   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
01935 };
01936 
01937 
01938 static unsigned char to_upper_utf8mb4[]=
01939 {
01940     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
01941    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
01942    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
01943    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
01944    64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
01945    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
01946    96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
01947    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
01948   128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
01949   144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
01950   160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
01951   176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
01952   192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
01953   208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
01954   224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
01955   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
01956 };
01957 
01958 
01959 static inline int
01960 bincmp_utf8mb4(const unsigned char *s, const unsigned char *se,
01961                const unsigned char *t, const unsigned char *te)
01962 {
01963   int slen= (int) (se - s), tlen= (int) (te - t);
01964   int len= min(slen, tlen);
01965   int cmp= memcmp(s, t, len);
01966   return cmp ? cmp : slen - tlen;
01967 }
01968 
01969 
01970 static int my_mb_wc_utf8mb4(const charset_info_st*, my_wc_t * pwc, const unsigned char *s, const unsigned char *e)
01971 {
01972   if (s >= e)
01973     return MY_CS_TOOSMALL;
01974 
01975   unsigned char c= s[0];
01976   if (c < 0x80)
01977   {
01978     *pwc= c;
01979     return 1;
01980   }
01981   else if (c < 0xc2)
01982     return MY_CS_ILSEQ;
01983   else if (c < 0xe0)
01984   {
01985     if (s + 2 > e) /* We need 2 characters */
01986       return MY_CS_TOOSMALL2;
01987 
01988     if (!((s[1] ^ 0x80) < 0x40))
01989       return MY_CS_ILSEQ;
01990 
01991     *pwc= ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
01992     return 2;
01993   }
01994   else if (c < 0xf0)
01995   {
01996     if (s + 3 > e) /* We need 3 characters */
01997       return MY_CS_TOOSMALL3;
01998 
01999     if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40 &&
02000           (c >= 0xe1 || s[1] >= 0xa0)))
02001       return MY_CS_ILSEQ;
02002 
02003     *pwc= ((my_wc_t) (c & 0x0f) << 12)   |
02004           ((my_wc_t) (s[1] ^ 0x80) << 6) |
02005            (my_wc_t) (s[2] ^ 0x80);
02006     return 3;
02007   }
02008   else if (c < 0xf8)
02009   {
02010     if (s + 4 > e) /* We need 4 characters */
02011       return MY_CS_TOOSMALL4;
02012 
02013     if (!((s[1] ^ 0x80) < 0x40 &&
02014           (s[2] ^ 0x80) < 0x40 &&
02015           (s[3] ^ 0x80) < 0x40 &&
02016           (c >= 0xf1 || s[1] >= 0x90)))
02017       return MY_CS_ILSEQ;
02018     *pwc = ((my_wc_t) (c & 0x07) << 18)    |
02019            ((my_wc_t) (s[1] ^ 0x80) << 12) |
02020            ((my_wc_t) (s[2] ^ 0x80) << 6)  |
02021             (my_wc_t) (s[3] ^ 0x80);
02022     return 4;
02023   }
02024   return MY_CS_ILSEQ;
02025 }
02026 
02027 
02028 /*
02029   The same as above, but without range check
02030   for example, for a null-terminated string
02031 */
02032 static int
02033 my_mb_wc_utf8mb4_no_range(const charset_info_st*,
02034                           my_wc_t *pwc, const unsigned char *s)
02035 {
02036   unsigned char c;
02037 
02038   c= s[0];
02039   if (c < 0x80)
02040   {
02041     *pwc = c;
02042     return 1;
02043   }
02044 
02045   if (c < 0xc2)
02046     return MY_CS_ILSEQ;
02047 
02048   if (c < 0xe0)
02049   {
02050     if (!((s[1] ^ 0x80) < 0x40))
02051       return MY_CS_ILSEQ;
02052 
02053     *pwc = ((my_wc_t) (c & 0x1f) << 6) | (my_wc_t) (s[1] ^ 0x80);
02054     return 2;
02055   }
02056 
02057   if (c < 0xf0)
02058   {
02059     if (!((s[1] ^ 0x80) < 0x40 &&
02060           (s[2] ^ 0x80) < 0x40 &&
02061           (c >= 0xe1 || s[1] >= 0xa0)))
02062       return MY_CS_ILSEQ;
02063     *pwc= ((my_wc_t) (c & 0x0f) << 12)   |
02064           ((my_wc_t) (s[1] ^ 0x80) << 6) |
02065            (my_wc_t) (s[2] ^ 0x80);
02066 
02067     return 3;
02068   }
02069   else if (c < 0xf8)
02070   {
02071     if (!((s[1] ^ 0x80) < 0x40 &&
02072           (s[2] ^ 0x80) < 0x40 &&
02073           (s[3] ^ 0x80) < 0x40 &&
02074           (c >= 0xf1 || s[1] >= 0x90)))
02075       return MY_CS_ILSEQ;
02076     *pwc = ((my_wc_t) (c & 0x07) << 18)    |
02077            ((my_wc_t) (s[1] ^ 0x80) << 12) |
02078            ((my_wc_t) (s[2] ^ 0x80) << 6)  |
02079             (my_wc_t) (s[3] ^ 0x80);
02080     return 4;
02081   }
02082   return MY_CS_ILSEQ;
02083 }
02084 
02085 
02086 static int my_wc_mb_utf8mb4(const charset_info_st*, my_wc_t wc, unsigned char *r, unsigned char *e)
02087 {
02088   int count;
02089 
02090   if (r >= e)
02091     return MY_CS_TOOSMALL;
02092 
02093   if (wc < 0x80)
02094     count= 1;
02095   else if (wc < 0x800)
02096     count= 2;
02097   else if (wc < 0x10000)
02098     count= 3;
02099   else if (wc < 0x200000)
02100     count= 4;
02101   else return MY_CS_ILUNI;
02102 
02103   if (r + count > e)
02104     return -100 - count;
02105 
02106   switch (count) 
02107   {
02108     /* Fall through all cases!!! */
02109     case 4: r[3] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x10000;
02110     case 3: r[2] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0x800;
02111     case 2: r[1] = (unsigned char) (0x80 | (wc & 0x3f)); wc = wc >> 6; wc |= 0xc0;
02112     case 1: r[0] = (unsigned char) wc;
02113   }
02114   return count;
02115 }
02116 
02117 
02118 /*
02119   The same as above, but without range check.
02120 */
02121 static int
02122 my_wc_mb_utf8mb4_no_range(const charset_info_st*,
02123                           my_wc_t wc, unsigned char *r)
02124 {
02125   int count;
02126 
02127   if (wc < 0x80)
02128     count= 1;
02129   else if (wc < 0x800)
02130     count= 2;
02131   else if (wc < 0x10000)
02132     count= 3;
02133   else if (wc < 0x200000)
02134     count= 4;
02135   else
02136     return MY_CS_ILUNI;
02137 
02138   switch (count)
02139   {
02140     /* Fall through all cases!!! */
02141     case 4: r[3]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x10000;
02142     case 3: r[2]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0x800;
02143     case 2: r[1]= (unsigned char) (0x80 | (wc & 0x3f)); wc= wc >> 6; wc |= 0xc0;
02144     case 1: r[0]= (unsigned char) wc;
02145   }
02146   return count;
02147 }
02148 
02149 
02150 #define REPLACEMENT_CHAR 0xFFFD;
02151 
02152 
02153 static inline void
02154 my_tolower_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
02155 {
02156   int page= *wc >> 8;
02157   if (page < 256 && uni_plane[page])
02158     *wc= uni_plane[page][*wc & 0xFF].tolower;
02159 }
02160 
02161 
02162 static inline void
02163 my_toupper_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
02164 {
02165   int page= *wc >> 8;
02166   if (page < 256 && uni_plane[page])
02167     *wc= uni_plane[page][*wc & 0xFF].toupper;
02168 }
02169 
02170 
02171 static inline void
02172 my_tosort_utf8mb4(MY_UNICASE_INFO **uni_plane, my_wc_t *wc)
02173 {
02174   int page= *wc >> 8;
02175   if (page < 256)
02176   {
02177     if (uni_plane[page])
02178       *wc= uni_plane[page][*wc & 0xFF].sort;
02179   }
02180   else
02181   {
02182     *wc= REPLACEMENT_CHAR;
02183   }
02184 }
02185 
02186 
02187 static size_t my_caseup_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
02188 {
02189   my_wc_t wc;
02190   int srcres, dstres;
02191   char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
02192   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02193   assert(src != dst || cs->caseup_multiply == 1);
02194 
02195   while ((src < srcend) &&
02196          (srcres= my_mb_wc_utf8mb4(cs, &wc,
02197                                    (unsigned char *) src, (unsigned char*) srcend)) > 0)
02198   {
02199     my_toupper_utf8mb4(uni_plane, &wc);
02200     if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
02201       break;
02202     src+= srcres;
02203     dst+= dstres;
02204   }
02205   return (size_t) (dst - dst0);
02206 }
02207 
02208 
02209 static inline void
02210 my_hash_add(uint32_t *n1, uint32_t *n2, uint32_t ch)
02211 {
02212   n1[0]^= (((n1[0] & 63) + n2[0]) * (ch)) + (n1[0] << 8);
02213   n2[0]+= 3;
02214 }
02215 
02216 
02217 void my_hash_sort_utf8mb4(const charset_info_st* cs,
02218                           const unsigned char *s, size_t slen,
02219                           uint32_t *n1, uint32_t *n2)
02220 {
02221   my_wc_t wc;
02222   int res;
02223   const unsigned char *e= s + slen;
02224   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02225 
02226   /*
02227     Remove end space. We do this to be able to compare
02228     'A ' and 'A' as identical
02229   */
02230   while (e > s && e[-1] == ' ')
02231     e--;
02232 
02233   while ((res= my_mb_wc_utf8mb4(cs, &wc, (const unsigned char*) s, (const unsigned char*) e)) > 0)
02234   {
02235     my_tosort_utf8mb4(uni_plane, &wc);
02236     my_hash_add(n1, n2, (uint32_t) (wc & 0xFF));
02237     my_hash_add(n1, n2, (uint32_t) (wc >> 8)  & 0xFF);
02238     if (wc > 0xFFFF)
02239     {
02240        /*
02241         Put the highest byte only if it is non-zero,
02242         to make hash functions for utf8mb3 and utf8mb4
02243         compatible for BMP characters.
02244         This is useful to keep order of records in
02245         test results, e.g. for "SHOW GRANTS".
02246       */
02247       my_hash_add(n1, n2, (uint32_t) (wc >> 16) & 0xFF);
02248     }
02249     s+= res;
02250   }
02251 }
02252 
02253 
02254 static size_t my_caseup_str_utf8mb4(const charset_info_st* cs, char *src)
02255 {
02256   my_wc_t wc;
02257   int srcres, dstres;
02258   char *dst= src, *dst0= src;
02259   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02260   assert(cs->caseup_multiply == 1);
02261 
02262   while (*src &&
02263          (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
02264   {
02265     my_toupper_utf8mb4(uni_plane, &wc);
02266     if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
02267       break;
02268     src+= srcres;
02269     dst+= dstres;
02270   }
02271   *dst= '\0';
02272   return (size_t) (dst - dst0);
02273 }
02274 
02275 
02276 static size_t my_casedn_utf8mb4(const charset_info_st* cs, char *src, size_t srclen, char *dst, size_t dstlen)
02277 {
02278   my_wc_t wc;
02279   int srcres, dstres;
02280   char *srcend= src + srclen, *dstend= dst + dstlen, *dst0= dst;
02281   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02282   assert(src != dst || cs->casedn_multiply == 1);
02283 
02284   while ((src < srcend) &&
02285          (srcres= my_mb_wc_utf8mb4(cs, &wc,
02286                                    (unsigned char*) src, (unsigned char*) srcend)) > 0)
02287   {
02288     my_tolower_utf8mb4(uni_plane, &wc);
02289     if ((dstres= my_wc_mb_utf8mb4(cs, wc, (unsigned char*) dst, (unsigned char*) dstend)) <= 0)
02290       break;
02291     src+= srcres;
02292     dst+= dstres;
02293   }
02294   return (size_t) (dst - dst0);
02295 }
02296 
02297 
02298 static size_t my_casedn_str_utf8mb4(const charset_info_st* cs, char *src)
02299 {
02300   my_wc_t wc;
02301   int srcres, dstres;
02302   char *dst= src, *dst0= src;
02303   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02304   assert(cs->casedn_multiply == 1);
02305 
02306   while (*src &&
02307          (srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (unsigned char *) src)) > 0)
02308   {
02309     my_tolower_utf8mb4(uni_plane, &wc);
02310     if ((dstres= my_wc_mb_utf8mb4_no_range(cs, wc, (unsigned char*) dst)) <= 0)
02311       break;
02312     src+= srcres;
02313     dst+= dstres;
02314   }
02315 
02316   /*
02317    In rare cases lower string can be shorter than
02318    the original string, for example:
02319 
02320    "U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE"
02321    (which is 0xC4B0 in utf8, i.e. two bytes)
02322 
02323    is converted into
02324 
02325    "U+0069 LATIN SMALL LETTER I"
02326    (which is 0x69 in utf8, i.e. one byte)
02327 
02328    So, we need to put '\0' terminator after converting.
02329   */
02330 
02331   *dst= '\0';
02332   return (size_t) (dst - dst0);
02333 }
02334 
02335 
02336 static int my_strnncoll_utf8mb4(const charset_info_st* cs,
02337                      const unsigned char *s, size_t slen,
02338                      const unsigned char *t, size_t tlen,
02339                      bool t_is_prefix)
02340 {
02341   my_wc_t s_wc=0;
02342   my_wc_t t_wc=0;
02343   const unsigned char *se= s + slen;
02344   const unsigned char *te= t + tlen;
02345   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02346 
02347   while ( s < se && t < te )
02348   {
02349     int s_res= my_mb_wc_utf8mb4(cs, &s_wc, s, se);
02350     int t_res= my_mb_wc_utf8mb4(cs, &t_wc, t, te);
02351 
02352     if ( s_res <= 0 || t_res <= 0 )
02353     {
02354       /* Incorrect string, compare bytewise */
02355       return bincmp_utf8mb4(s, se, t, te);
02356     }
02357 
02358     my_tosort_utf8mb4(uni_plane, &s_wc);
02359     my_tosort_utf8mb4(uni_plane, &t_wc);
02360 
02361     if ( s_wc != t_wc )
02362     {
02363       return s_wc > t_wc ? 1 : -1;
02364     }
02365 
02366     s+= s_res;
02367     t+= t_res;
02368   }
02369   return (int) (t_is_prefix ? (t - te) : ((se - s) - (te - t)));
02370 }
02371 
02372 
02400 static int my_strnncollsp_utf8mb4(const charset_info_st* cs,
02401                        const unsigned char *s, size_t slen,
02402                        const unsigned char *t, size_t tlen,
02403                        bool diff_if_only_endspace_difference)
02404 {
02405   int res;
02406   my_wc_t s_wc=0;
02407   my_wc_t t_wc=0;
02408   const unsigned char *se= s + slen, *te= t + tlen;
02409   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02410 
02411 #ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
02412   diff_if_only_endspace_difference= false;
02413 #endif
02414 
02415   while ( s < se && t < te )
02416   {
02417     int s_res= my_mb_wc_utf8mb4(cs, &s_wc, s, se);
02418     int t_res= my_mb_wc_utf8mb4(cs, &t_wc, t, te);
02419 
02420     if ( s_res <= 0 || t_res <= 0 )
02421     {
02422       /* Incorrect string, compare bytewise */
02423       return bincmp_utf8mb4(s, se, t, te);
02424     }
02425 
02426     my_tosort_utf8mb4(uni_plane, &s_wc);
02427     my_tosort_utf8mb4(uni_plane, &t_wc);
02428 
02429     if ( s_wc != t_wc )
02430     {
02431       return s_wc > t_wc ? 1 : -1;
02432     }
02433 
02434     s+=s_res;
02435     t+=t_res;
02436   }
02437 
02438   slen= (size_t) (se-s);
02439   tlen= (size_t) (te-t);
02440   res= 0;
02441 
02442   if (slen != tlen)
02443   {
02444     int swap= 1;
02445     if (diff_if_only_endspace_difference)
02446       res= 1;                                   /* Assume 'a' is bigger */
02447     if (slen < tlen)
02448     {
02449       slen= tlen;
02450       s= t;
02451       se= te;
02452       swap= -1;
02453       res= -res;
02454     }
02455     /*
02456       This following loop uses the fact that in UTF-8
02457       all multibyte characters are greater than space,
02458       and all multibyte head characters are greater than
02459       space. It means if we meet a character greater
02460       than space, it always means that the longer string
02461       is greater. So we can reuse the same loop from the
02462       8bit version, without having to process full multibute
02463       sequences.
02464     */
02465     for ( ; s < se; s++)
02466     {
02467       if (*s != ' ')
02468   return (*s < ' ') ? -swap : swap;
02469     }
02470   }
02471   return res;
02472 }
02473 
02474 
02488 static int my_strcasecmp_utf8mb4(const charset_info_st* cs, const char *s, const char *t)
02489 {
02490   MY_UNICASE_INFO **uni_plane= cs->caseinfo;
02491   while (s[0] && t[0])
02492   {
02493     my_wc_t s_wc,t_wc;
02494 
02495     if ((unsigned char) s[0] < 128)
02496     {
02497       /*
02498         s[0] is between 0 and 127.
02499         It represents a single byte character.
02500         Convert it into weight according to collation.
02501       */
02502       s_wc= plane00[(unsigned char) s[0]].tolower;
02503       s++;
02504     }
02505     else
02506     {
02507       int res= my_mb_wc_utf8mb4_no_range(cs, &s_wc, (const unsigned char*) s);
02508 
02509       /*
02510          In the case of wrong multibyte sequence we will
02511          call strcmp() for byte-to-byte comparison.
02512       */
02513       if (res <= 0)
02514         return strcmp(s, t);
02515       s+= res;
02516 
02517       my_tolower_utf8mb4(uni_plane, &s_wc);
02518     }
02519 
02520 
02521     /* Do the same for the second string */
02522 
02523     if ((unsigned char) t[0] < 128)
02524     {
02525       /* Convert single byte character into weight */
02526       t_wc= plane00[(unsigned char) t[0]].tolower;
02527       t++;
02528     }
02529     else
02530     {
02531       int res= my_mb_wc_utf8mb4_no_range(cs, &t_wc, (const unsigned char*) t);
02532       if (res <= 0)
02533         return strcmp(s, t);
02534       t+= res;
02535 
02536       my_tolower_utf8mb4(uni_plane, &t_wc);
02537     }
02538 
02539     /* Now we have two weights, let's compare them */
02540     if ( s_wc != t_wc )
02541       return  ((int) s_wc) - ((int) t_wc);
02542   }
02543   return ((int) (unsigned char) s[0]) - ((int) (unsigned char) t[0]);
02544 }
02545 
02546 
02547 static int my_wildcmp_utf8mb4(const charset_info_st* cs,
02548                    const char *str, const char *strend,
02549                    const char *wildstr, const char *wildend,
02550                    int escape, int w_one, int w_many)
02551 {
02552   return my_wildcmp_unicode(cs, str, strend, wildstr, wildend, escape, w_one, w_many, cs->caseinfo);
02553 }
02554 
02555 
02556 static size_t my_strnxfrmlen_utf8mb4(const charset_info_st*, size_t len)
02557 {
02558   /* TODO: fix when working on WL "Unicode new version" */
02559   return (len * 2 + 2) / 4;
02560 }
02561 
02562 
02563 static size_t my_strnxfrm_utf8mb4(const charset_info_st* cs,
02564                     unsigned char *dst, size_t dstlen, uint32_t nweights,
02565                     const unsigned char *src, size_t srclen, uint32_t flags)
02566 {
02567   my_wc_t wc;
02568   int res;
02569   unsigned char *dst0= dst;
02570   unsigned char *de= dst + dstlen;
02571   unsigned char *de_beg= de - 1;
02572   const unsigned char *se = src + srclen;
02573   MY_UNICASE_INFO **uni_plane= (cs->state & MY_CS_BINSORT) ?
02574                                 NULL : cs->caseinfo;
02575 
02576   for (; dst < de_beg && nweights; nweights--)
02577   {
02578     if ((res= my_mb_wc_utf8mb4(cs,&wc, src, se)) <= 0)
02579       break;
02580     src+=res;
02581 
02582     if (uni_plane)
02583       my_tosort_utf8mb4(uni_plane, &wc);
02584 
02585     *dst++= (unsigned char)(wc >> 8);
02586     *dst++= (unsigned char)(wc & 0xFF);
02587 
02588   }
02589 
02590   if (dst < de && nweights && (flags & MY_STRXFRM_PAD_WITH_SPACE))
02591   {
02592     /* Fill the tail with keys for space character */
02593     for (; dst < de_beg && nweights; nweights--)
02594     {
02595       *dst++= 0x00;
02596       *dst++= 0x20;
02597     }
02598 
02599     if (dst < de)  /* Clear the last byte, if "dstlen" was an odd number */
02600       *dst++= 0x00;
02601   }
02602   my_strxfrm_desc_and_reverse(dst0, dst, flags, 0);
02603   return dst - dst0;
02604 }
02605 
02606 
02607 static unsigned int my_ismbchar_utf8mb4(const charset_info_st* cs, const char *b, const char *e)
02608 {
02609   my_wc_t wc;
02610   int res= my_mb_wc_utf8mb4(cs,&wc, (const unsigned char*)b, (const unsigned char*)e);
02611   return (res > 1) ? res : 0;
02612 }
02613 
02614 
02615 static unsigned int my_mbcharlen_utf8mb4(const charset_info_st*, uint32_t c)
02616 {
02617   if (c < 0x80)
02618     return 1;
02619   if (c < 0xc2)
02620     return 0; /* Illegal mb head */
02621   if (c < 0xe0)
02622     return 2;
02623   if (c < 0xf0)
02624     return 3;
02625   if (c < 0xf8)
02626     return 4;
02627   return 0; /* Illegal mb head */;
02628 }
02629 
02630 
02631 static MY_COLLATION_HANDLER my_collation_utf8mb4_general_ci_handler=
02632 {
02633   NULL,               /* init */
02634   my_strnncoll_utf8mb4,
02635   my_strnncollsp_utf8mb4,
02636   my_strnxfrm_utf8mb4,
02637   my_strnxfrmlen_utf8mb4,
02638   my_like_range_mb,
02639   my_wildcmp_utf8mb4,
02640   my_strcasecmp_utf8mb4,
02641   my_instr_mb,
02642   my_hash_sort_utf8mb4,
02643   my_propagate_complex
02644 };
02645 
02646 
02647 static MY_COLLATION_HANDLER my_collation_utf8mb4_bin_handler =
02648 {
02649     NULL,   /* init */
02650     my_strnncoll_mb_bin,
02651     my_strnncollsp_mb_bin,
02652     my_strnxfrm_utf8mb4,
02653     my_strnxfrmlen_utf8mb4,
02654     my_like_range_mb,
02655     my_wildcmp_mb_bin,
02656     my_strcasecmp_mb_bin,
02657     my_instr_mb,
02658     my_hash_sort_mb_bin,
02659     my_propagate_simple
02660 };
02661 
02662 
02663 MY_CHARSET_HANDLER my_charset_utf8mb4_handler=
02664 {
02665   my_ismbchar_utf8mb4,
02666   my_mbcharlen_utf8mb4,
02667   my_numchars_mb,
02668   my_charpos_mb,
02669   my_well_formed_len_mb,
02670   my_lengthsp_8bit,
02671   my_numcells_mb,
02672   my_mb_wc_utf8mb4,
02673   my_wc_mb_utf8mb4,
02674   my_mb_ctype_mb,
02675   my_caseup_str_utf8mb4,
02676   my_casedn_str_utf8mb4,
02677   my_caseup_utf8mb4,
02678   my_casedn_utf8mb4,
02679   my_snprintf_8bit,
02680   my_long10_to_str_8bit,
02681   my_int64_t10_to_str_8bit,
02682   my_fill_8bit,
02683   my_strntol_8bit,
02684   my_strntoul_8bit,
02685   my_strntoll_8bit,
02686   my_strntoull_8bit,
02687   my_strntod_8bit,
02688   my_strtoll10_8bit,
02689   my_strntoull10rnd_8bit,
02690   my_scan_8bit
02691 };
02692 
02693 
02694 
02695 DRIZZLED_API charset_info_st my_charset_utf8mb4_general_ci=
02696 {
02697   45,0,0,              /* number       */
02698   MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE,  /* state  */
02699   MY_UTF8MB4,         /* cs name      */
02700   MY_UTF8MB4_GENERAL_CI,/* name       */
02701   "UTF-8 Unicode",    /* comment      */
02702   NULL,               /* tailoring    */
02703   ctype_utf8mb4,      /* ctype        */
02704   to_lower_utf8mb4,   /* to_lower     */
02705   to_upper_utf8mb4,   /* to_upper     */
02706   to_upper_utf8mb4,   /* sort_order   */
02707   NULL,               /* contractions */
02708   NULL,               /* sort_order_big*/
02709   NULL,               /* tab_to_uni   */
02710   NULL,               /* tab_from_uni */
02711   my_unicase_default, /* caseinfo     */
02712   NULL,               /* state_map    */
02713   NULL,               /* ident_map    */
02714   1,                  /* strxfrm_multiply */
02715   1,                  /* caseup_multiply  */
02716   1,                  /* casedn_multiply  */
02717   1,                  /* mbminlen     */
02718   4,                  /* mbmaxlen     */
02719   0,                  /* min_sort_char */
02720   0xFFFF,             /* max_sort_char */
02721   ' ',                /* pad char      */
02722   1,                  /* levels_for_compare */
02723   1,                  /* levels_for_order   */
02724   &my_charset_utf8mb4_handler,
02725   &my_collation_utf8mb4_general_ci_handler
02726 };
02727 
02728 
02729 DRIZZLED_API charset_info_st my_charset_utf8mb4_bin=
02730 {
02731   46,0,0,             /* number       */
02732   MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE, /* state  */
02733   MY_UTF8MB4,         /* cs name      */
02734   MY_UTF8MB4_BIN,     /* name         */
02735   "UTF-8 Unicode",    /* comment      */
02736   NULL,               /* tailoring    */
02737   ctype_utf8mb4,      /* ctype        */
02738   to_lower_utf8mb4,   /* to_lower     */
02739   to_upper_utf8mb4,   /* to_upper     */
02740   NULL,               /* sort_order   */
02741   NULL,               /* contractions */
02742   NULL,               /* sort_order_big*/
02743   NULL,               /* tab_to_uni   */
02744   NULL,               /* tab_from_uni */
02745   my_unicase_default, /* caseinfo     */
02746   NULL,               /* state_map    */
02747   NULL,               /* ident_map    */
02748   1,                  /* strxfrm_multiply */
02749   1,                  /* caseup_multiply  */
02750   1,                  /* casedn_multiply  */
02751   1,                  /* mbminlen     */
02752   4,                  /* mbmaxlen     */
02753   0,                  /* min_sort_char */
02754   0xFFFF,             /* max_sort_char */
02755   ' ',                /* pad char      */
02756   1,                  /* levels_for_compare */
02757   1,                  /* levels_for_order   */
02758   &my_charset_utf8mb4_handler,
02759   &my_collation_utf8mb4_bin_handler
02760 };
02761 
02762 
02763 
02764 static inline int bincmp(const unsigned char *s, const unsigned char *se,
02765                          const unsigned char *t, const unsigned char *te)
02766 {
02767   int slen= (int) (se-s), tlen= (int) (te-t);
02768   int len= min(slen,tlen);
02769   int cmp= memcmp(s,t,len);
02770   return cmp ? cmp : slen-tlen;
02771 }
02772 
02773 
02774 /*
02775   File system encoding components:
02776 
02777 Code range Pattern            Number   Used Unused  Blocks
02778 -----------------------------------------------------------------------------
02779 00C0..017F [.][0..4][g..z] 5*20= 100   97     3  Latin1 Supplement + Ext A
02780 0370..03FF [.][5..9][g..z] 5*20= 100   88    12  Greek + Coptic
02781 0400..052F [.][g..z][0..6] 20*7= 140  140   137  Cyrillic
02782 0530..058F [.][g..z][7..8] 20*2=  40   38     2  Armenian
02783 2160..217F [.][g..z][9]    20*1=  20   16     4  Number Forms
02784 0180..02AF [.][g..z][a..k] 28*11=220  203    17  Latin Ext B + IPA
02785 1E00..0EFF [.][g..z][l..r] 20*7= 140  136     4  Latin Additional Extended
02786 1F00..1FFF [.][g..z][s..z] 20*8= 160  144    16  Greek Extended
02787 ....  .... [.][a..f][g..z] 6*20= 120    0   120  RESERVED
02788 24B6..24E9 [.][@][a..z]           26   26     0  Enclosed Alphanumerics
02789 FF21..FF5A [.][a..z][@]           26   26     0  Full Width forms
02790 
02791 All other characters are encoded using five bytes:
02792 
02793 [.][0..9a..z][0..9a..z][0..9a..z][0..9a..z]
02794 
02795 */
02796 
02797 } /* namespace drizzled */
02798 
02799 #ifdef MY_TEST_UTF8
02800 #include <stdio.h>
02801 
02802 static void test_mb(charset_info_st *cs, unsigned char *s)
02803 {
02804   while(*s)
02805   {
02806     if (my_ismbhead_utf8(cs,*s))
02807     {
02808       uint32_t len=my_mbcharlen_utf8(cs,*s);
02809       while(len--)
02810       {
02811         printf("%c",*s);
02812         s++;
02813       }
02814       printf("\n");
02815     }
02816     else
02817     {
02818       printf("%c\n",*s);
02819       s++;
02820     }
02821   }
02822 }
02823 
02824 int main()
02825 {
02826   char str[1024]=" utf8 test проба ПЕРА по-РУССКИ";
02827   charset_info_st *cs;
02828 
02829   test_mb(cs,(unsigned char*)str);
02830 
02831   printf("orig      :'%s'\n",str);
02832 
02833   my_caseup_utf8(cs,str,15);
02834   printf("caseup    :'%s'\n",str);
02835 
02836   my_caseup_str_utf8(cs,str);
02837   printf("caseup_str:'%s'\n",str);
02838 
02839   my_casedn_utf8(cs,str,15);
02840   printf("casedn    :'%s'\n",str);
02841 
02842   my_casedn_str_utf8(cs,str);
02843   printf("casedn_str:'%s'\n",str);
02844 
02845   return 0;
02846 }
02847 
02848 #endif