1 /* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 Without limiting anything contained in the foregoing, this file,
15 which is part of C Driver for MySQL (Connector/C), is also subject to the
16 Universal FOSS Exception, version 1.0, a copy of which can be found at
17 http://oss.oracle.com/licenses/universal-foss-exception.
18
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License, version 2.0, for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
27
28 /*
29 Shared, independent copyright: (C) 2001 Jan Pazdziora.
30
31 Development of this software was supported by Neocortex, s.r.o.
32 MySQL AB expresses its gratitude to Jan for for giving us this software.
33
34 Bug reports and suggestions are always welcome.
35
36 This file implements the collating sequence for Windows-1250
37 character set. It merely extends the binary sorting of US-ASCII
38 by adding characters with diacritical marks into proper places.
39 In addition, it sorts 'ch' between 'h' and 'i', and the sorting
40 is case sensitive, with uppercase being sorted first, in the
41 second pass.
42 */
43
44 /*
45 * This comment is parsed by configure to create ctype.c,
46 * so don't change it unless you know what you are doing.
47 *
48 * .configure. strxfrm_multiply_win1250ch=2
49 */
50
51 #include "my_global.h"
52 #include "m_string.h"
53 #include "m_ctype.h"
54
55 #ifdef HAVE_CHARSET_cp1250
56
57
58 static uint16 tab_cp1250_uni[256]={
59 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
60 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
61 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
62 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
63 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
64 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
65 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
66 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
67 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
68 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
69 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
70 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
71 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
72 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
73 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
74 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
75 0x20AC, 0,0x201A, 0,0x201E,0x2026,0x2020,0x2021,
76 0,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179,
77 0,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
78 0,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A,
79 0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7,
80 0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B,
81 0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7,
82 0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C,
83 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
84 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
85 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
86 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
87 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
88 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
89 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
90 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9
91 };
92
93
94 /* 0000-00FD , 254 chars */
95 static const uchar tab_uni_cp1250_plane00[]={
96 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
97 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
98 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
99 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
100 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
101 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
102 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
103 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
104 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
105 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
106 0xA0,0x00,0x00,0x00,0xA4,0x00,0xA6,0xA7,0xA8,0xA9,0x00,0xAB,0xAC,0xAD,0xAE,0x00,
107 0xB0,0xB1,0x00,0x00,0xB4,0xB5,0xB6,0xB7,0xB8,0x00,0x00,0xBB,0x00,0x00,0x00,0x00,
108 0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00,
109 0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF,
110 0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00,
111 0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD};
112
113 /* 0102-017E , 125 chars */
114 static const uchar tab_uni_cp1250_plane01[]={
115 0xC3,0xE3,0xA5,0xB9,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0,
116 0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00,
117 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
118 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xBC,0xBE,0x00,0x00,0xA3,
119 0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5,
120 0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0x8C,0x9C,0x00,0x00,0xAA,0xBA,0x8A,0x9A,
121 0xDE,0xFE,0x8D,0x9D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB,
122 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8F,0x9F,0xAF,0xBF,0x8E,0x9E};
123
124 /* 2013-20AC , 154 chars */
125 static const uchar tab_uni_cp1250_plane20[]={
126 0x96,0x97,0x00,0x00,0x00,0x91,0x92,0x82,0x00,0x93,0x94,0x84,0x00,0x86,0x87,0x95,
127 0x00,0x00,0x00,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x89,0x00,0x00,
128 0x00,0x00,0x00,0x00,0x00,0x00,0x8B,0x9B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
129 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
130 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
131 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
132 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
133 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
134 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
135 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80};
136
137 /* 02C7-02DD , 23 chars */
138 static const uchar tab_uni_cp1250_plane02[]={
139 0xA1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
140 0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD};
141
142 /* 2122-2122 , 1 chars */
143 static const uchar tab_uni_cp1250_plane21[]={
144 0x99};
145
146
147 static MY_UNI_IDX idx_uni_cp1250[]={
148 {0x0000,0x00FD,tab_uni_cp1250_plane00},
149 {0x0102,0x017E,tab_uni_cp1250_plane01},
150 {0x2013,0x20AC,tab_uni_cp1250_plane20},
151 {0x02C7,0x02DD,tab_uni_cp1250_plane02},
152 {0x2122,0x2122,tab_uni_cp1250_plane21},
153 {0,0,NULL}
154 };
155
156
157 static const uchar ctype_win1250ch[] = {
158 0x00,
159 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
160 0x20, 0x28, 0x28, 0x28, 0x28, 0x28, 0x20, 0x20,
161 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
162 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
163 0x48, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
164 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
165 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84,
166 0x84, 0x84, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
167 0x10, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01,
168 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
169 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
170 0x01, 0x01, 0x01, 0x10, 0x10, 0x10, 0x10, 0x10,
171 0x10, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x02,
172 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
173 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
174 0x02, 0x02, 0x02, 0x10, 0x10, 0x10, 0x10, 0x20,
175 0x20, 0x20, 0x10, 0x20, 0x10, 0x10, 0x10, 0x10,
176 0x20, 0x10, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01,
177 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
178 0x20, 0x10, 0x02, 0x10, 0x02, 0x02, 0x02, 0x02,
179 0x48, 0x10, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
180 0x10, 0x10, 0x01, 0x10, 0x10, 0x10, 0x10, 0x01,
181 0x10, 0x10, 0x10, 0x02, 0x10, 0x10, 0x10, 0x10,
182 0x10, 0x02, 0x02, 0x10, 0x01, 0x10, 0x02, 0x02,
183 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
184 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
185 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x10,
186 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
187 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
188 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
189 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10,
190 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x10
191 };
192
193 static const uchar to_lower_win1250ch[] = {
194 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
195 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
196 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
197 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
198 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
199 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
200 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
201 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
202 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
203 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
204 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
205 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
206 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
207 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
208 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
209 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
210 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
211 0x88, 0x89, 0x9a, 0x8b, 0x9c, 0x9d, 0x9e, 0x9f,
212 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
213 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
214 0xa0, 0xa1, 0xa2, 0xb3, 0xa4, 0xb9, 0xa6, 0xdf,
215 0xa8, 0xa9, 0xba, 0xab, 0xac, 0xad, 0xae, 0xbf,
216 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
217 0xb8, 0xb9, 0xba, 0xbb, 0xbe, 0xbd, 0xbe, 0xbf,
218 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
219 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
220 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7,
221 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf,
222 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
223 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
224 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
225 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
226 };
227
228 static const uchar to_upper_win1250ch[] = {
229 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
230 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
231 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
232 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
233 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
234 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
235 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
236 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
237 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
238 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
239 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
240 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
241 0x60, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
242 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
243 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
244 0x58, 0x59, 0x5a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
245 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
246 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
247 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
248 0x98, 0x99, 0x8a, 0x9b, 0x8c, 0x8d, 0x8e, 0x8f,
249 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
250 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
251 0xb0, 0xb1, 0xb2, 0xa3, 0xb4, 0xb5, 0xb6, 0xb7,
252 0xb8, 0xa5, 0xaa, 0xbb, 0xbc, 0xbd, 0xbc, 0xaf,
253 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
254 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
255 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
256 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xa7,
257 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
258 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
259 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7,
260 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff
261 };
262
263
264
265 static const uchar sort_order_win1250ch[] = {
266 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
267 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
268 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
269 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
270 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
271 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
272 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
273 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
274 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
275 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
276 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
277 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
278 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
279 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
280 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
281 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255
282 };
283
284 static const uchar _sort_order_win1250ch1[] = {
285 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
286 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
287 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
288 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
289 /* space ord 32 0x20 */
290 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
291 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91,
292 /* 0 ord 48 0x30 */
293 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
294 0x9a, 0x9b,
295 /* colon ord 58 0x3a */
296 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
297 0xa2,
298 /* A ord 65 0x41 */
299 0xa4, 0xa5,
300 /* C ord 67 0x43 */
301 0xff, 0xa8, 0xa9, 0xaa, 0xab,
302 0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
303 0xb5, 0xb6,
304 /* R ord 82 0x52 */
305 0xb7,
306 /* S ord 83 0x53 */
307 0xb9, 0xbc, 0xbd, 0xbe, 0xbf,
308 0xc0, 0xc1, 0xc2,
309 /* [ ord 91 0x5b */
310 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
311 0xc9,
312 /* a ord 97 0x61 */
313 0xa4, 0xa5, 0xff, 0xa8, 0xa9, 0xaa, 0xab,
314 0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
315 0xb5, 0xb6, 0xb7, 0xb9, 0xbc, 0xbd, 0xbe, 0xbf,
316 0xc0, 0xc1, 0xc2,
317 /* { ord 123 0x7b */
318 0xca, 0xcb, 0xcc, 0xcd, 0x81,
319 0x81, 0x81, 0xce, 0x81, 0xcf, 0xd0, 0xd1, 0xd2,
320 0x81, 0xd3,
321 /* Scaron ord 138 0x8a */
322 0xba, 0xd4, 0xb9, 0xbc, 0xc3, 0xc2,
323 0x81, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb,
324 0x81, 0xdc, 0xba, 0xdd, 0xb9, 0xbc, 0xc3, 0xc2,
325 /* nobreakspace ord 160 0xa0 */
326 0x82, 0xde, 0xdf, 0xb1, 0xe0, 0xa4, 0xe1, 0xe2,
327 0xe3, 0xe4, 0xb9, 0xe5, 0xe6, 0xe7, 0xe8, 0xc2,
328 0xe9, 0xea, 0xeb, 0xb1, 0xed, 0xee, 0x81, 0xef,
329 /* cedilla ord 183 0xb8 */
330 0xf0, 0xa4, 0xb9, 0xf1, 0xb1, 0xf2, 0xb1, 0xc2,
331 0xb7, 0xa4, 0xa4, 0xa4, 0xa4, 0xb1, 0xa6, 0xa6,
332 0xa7, 0xa9, 0xa9, 0xa9, 0xa9, 0xae, 0xae, 0xa8,
333 /* Eth ord 208 0xd0 */
334 0xa8, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xf3,
335 0xb8, 0xbd, 0xbd, 0xbd, 0xbd, 0xc1, 0xbc, 0xbb,
336 /* racute ord 224 0xe0 */
337 0xb7, 0xa4, 0xa4, 0xa4, 0xa4, 0xb1, 0xa6, 0xa6,
338 0xa7, 0xa9, 0xa9, 0xa9, 0xa9, 0xae, 0xae, 0xa8,
339 /* eth ord 240 0xf0 */
340 0xa8, 0xb3, 0xb3, 0xb4, 0xb4, 0xb4, 0xb4, 0xf4,
341 0xb8, 0xbd, 0xbd, 0xbd, 0xbd, 0xc1, 0xbc, 0xf5
342 };
343
344 static const uchar _sort_order_win1250ch2[] = {
345 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
346 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
347 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
348 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
349 /* space ord 32 0x20 */
350 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
351 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
352 /* 0 ord 48 0x30 */
353 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
354 0x01, 0x01,
355 /* colon ord 58 0x3a */
356 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
357 0x01,
358 /* A ord 65 0x41 */
359 0x01, 0x01,
360 /* C ord 67 0x43 */
361 0xff, 0x01, 0x01, 0x01, 0x01,
362 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
363 0x01, 0x01,
364 /* R ord 82 0x52 */
365 0x01,
366 /* S ord 83 0x53 */
367 0x01, 0x01, 0x01, 0x01, 0x01,
368 0x01, 0x01, 0x01,
369 /* [ ord 91 0x5b */
370 0x01, 0x01, 0x01, 0x01, 0x01,
371 0x01,
372 /* a ord 97 0x61 */
373 0x02, 0x02, 0xff, 0x02, 0x02, 0x02, 0x02,
374 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
375 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
376 0x02, 0x02, 0x02,
377 /* { ord 123 0x7b */
378 0x01, 0x01, 0x01, 0x01, 0x22,
379 0x23, 0x24, 0x01, 0x25, 0x01, 0x01, 0x01, 0x01,
380 0x26, 0x01,
381 /* Scaron ord 138 0x8a */
382 0x01, 0x01, 0x03, 0x03, 0x01, 0x05,
383 0x27, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
384 0x28, 0x01, 0x02, 0x01, 0x04, 0x04, 0x02, 0x06,
385 /* nobreakspace ord 160 0xa0 */
386 0x02, 0x01, 0x01, 0x07, 0x01, 0x11, 0x01, 0x01,
387 0x01, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x03,
388 0x01, 0x01, 0x01, 0x08, 0x01, 0x01, 0x29, 0x01,
389 /* cedilla ord 184 0xb8 */
390 0x01, 0x12, 0x06, 0x01, 0x05, 0x01, 0x06, 0x04,
391 0x03, 0x03, 0x05, 0x07, 0x09, 0x03, 0x03, 0x05,
392 0x01, 0x03, 0x09, 0x07, 0x05, 0x03, 0x05, 0x03,
393 /* Eth ord 208 0xd0 */
394 0x05, 0x03, 0x05, 0x03, 0x05, 0x09, 0x07, 0x01,
395 0x01, 0x05, 0x03, 0x09, 0x07, 0x03, 0x05, 0x01,
396 /* racute ord 224 0xe0 */
397 0x04, 0x04, 0x06, 0x08, 0x0a, 0x04, 0x04, 0x06,
398 0x02, 0x04, 0x0a, 0x08, 0x06, 0x04, 0x06, 0x04,
399 /* eth ord 240 0xf0 */
400 0x06, 0x04, 0x06, 0x04, 0x06, 0x0a, 0x08, 0x01,
401 0x02, 0x06, 0x04, 0x0a, 0x08, 0x04, 0x06, 0x01
402 };
403
404 struct wordvalue {
405 const uchar *word;
406 uchar pass1;
407 uchar pass2;
408 };
409 static struct wordvalue doubles[] = {
410 { (uchar*) "ch", 0xad, 0x03 },
411 { (uchar*) "c", 0xa6, 0x02 },
412 { (uchar*) "Ch", 0xad, 0x02 },
413 { (uchar*) "CH", 0xad, 0x01 },
414 { (uchar*) "C", 0xa6, 0x01 },
415 };
416
417 #define NEXT_CMP_VALUE(src, p, pass, value, len) \
418 while (1) { \
419 if (IS_END(p, src, len)) { \
420 if (pass == 0 && len > 0) { p= src; pass++; } \
421 else { value = 0; break; } \
422 } \
423 value = ((pass == 0) ? _sort_order_win1250ch1[*p] \
424 : _sort_order_win1250ch2[*p]); \
425 if (value == 0xff) { \
426 int i; \
427 for (i = 0; i < (int) sizeof(doubles); i++) { \
428 const uchar *patt = doubles[i].word; \
429 const uchar *q = (const uchar *) p; \
430 while (*patt \
431 && !(IS_END(q, src, len)) \
432 && (*patt == *q)) { \
433 patt++; q++; \
434 } \
435 if (!(*patt)) { \
436 value = (int)((pass == 0) \
437 ? doubles[i].pass1 \
438 : doubles[i].pass2); \
439 p = (const uchar *) q - 1; \
440 break; \
441 } \
442 } \
443 } \
444 p++; \
445 break; \
446 }
447
448 #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len))
449
my_strnncoll_win1250ch(const CHARSET_INFO * cs MY_ATTRIBUTE ((unused)),const uchar * s1,size_t len1,const uchar * s2,size_t len2,my_bool s2_is_prefix)450 static int my_strnncoll_win1250ch(const CHARSET_INFO *cs
451 MY_ATTRIBUTE((unused)),
452 const uchar *s1, size_t len1,
453 const uchar *s2, size_t len2,
454 my_bool s2_is_prefix)
455 {
456 int v1, v2;
457 const uchar *p1, * p2;
458 int pass1 = 0, pass2 = 0;
459 int diff;
460
461 if (s2_is_prefix && len1 > len2)
462 len1=len2;
463
464 p1 = s1; p2 = s2;
465
466 do
467 {
468 NEXT_CMP_VALUE(s1, p1, pass1, v1, (int)len1);
469 NEXT_CMP_VALUE(s2, p2, pass2, v2, (int)len2);
470 if ((diff = v1 - v2))
471 return diff;
472 } while (v1);
473 return 0;
474 }
475
476
477 /*
478 TODO: Has to be fixed as strnncollsp in ctype-simple
479 */
480
481 static
my_strnncollsp_win1250ch(const CHARSET_INFO * cs,const uchar * s,size_t slen,const uchar * t,size_t tlen,my_bool diff_if_only_endspace_difference MY_ATTRIBUTE ((unused)))482 int my_strnncollsp_win1250ch(const CHARSET_INFO *cs,
483 const uchar *s, size_t slen,
484 const uchar *t, size_t tlen,
485 my_bool diff_if_only_endspace_difference
486 MY_ATTRIBUTE((unused)))
487 {
488 for ( ; slen && s[slen-1] == ' ' ; slen--);
489 for ( ; tlen && t[tlen-1] == ' ' ; tlen--);
490 return my_strnncoll_win1250ch(cs,s,slen,t,tlen,0);
491 }
492
493
494 static size_t
my_strnxfrm_win1250ch(const CHARSET_INFO * cs MY_ATTRIBUTE ((unused)),uchar * dest,size_t len,uint nweights_arg MY_ATTRIBUTE ((unused)),const uchar * src,size_t srclen,uint flags)495 my_strnxfrm_win1250ch(const CHARSET_INFO *cs MY_ATTRIBUTE((unused)),
496 uchar *dest, size_t len,
497 uint nweights_arg MY_ATTRIBUTE((unused)),
498 const uchar *src, size_t srclen, uint flags)
499 {
500 int value;
501 const uchar *p;
502 int pass = 0;
503 size_t totlen = 0;
504 p = src;
505
506 if (!(flags & 0x0F)) /* All levels by default */
507 flags|= 0x0F;
508
509 for (; totlen < len;)
510 {
511 NEXT_CMP_VALUE(src, p, pass, value, (int)srclen);
512 if (!value)
513 break;
514 if (((1 << pass) & flags))
515 dest[totlen++] = value;
516 }
517 if ((flags & MY_STRXFRM_PAD_TO_MAXLEN) && len > totlen)
518 {
519 memset(dest + totlen, 0x00, len - totlen);
520 totlen= len;
521 }
522 return totlen;
523 }
524
525 #undef IS_END
526
527
528 static const uchar like_range_prefix_min_win1250ch[]=
529 {
530 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
531 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
532 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
533 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
534 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
535 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
536 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
537 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
538 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
539 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
540 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
541 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
542 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
543 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
544 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
545 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
546 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
547 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
548 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
549 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
550 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
551 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
552 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
553 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
554 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
555 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
556 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
557 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
558 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
559 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
560 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
561 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
562 };
563
564 /*
565 The letter "C" is a special case:
566 "CH" is sorted between "H" and "I".
567 prefix_max for "C" is "I": prefix_max[0x43] == 0x49
568 prefix_max for "c" is "i": prefix_max[0x63] == 0x69
569 For all other characters: prefix_max[i] == i
570 */
571
572 static const uchar like_range_prefix_max_win1250ch[]=
573 {
574 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
575 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
576 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
577 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
578 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
579 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
580 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
581 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
582 0x40, 0x41, 0x42, 0x49, 0x44, 0x45, 0x46, 0x47,
583 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
584 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
585 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
586 0x60, 0x61, 0x62, 0x69, 0x64, 0x65, 0x66, 0x67,
587 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
588 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
589 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
590 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
591 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
592 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
593 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
594 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
595 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
596 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
597 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
598 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
599 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
600 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
601 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
602 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
603 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
604 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
605 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
606 };
607
608 #define min_sort_char '\x20'
609 #define max_sort_char '\xff'
610
611 /*
612 ** Calculate min_str and max_str that ranges a LIKE string.
613 ** Arguments:
614 ** ptr Pointer to LIKE string.
615 ** ptr_length Length of LIKE string.
616 ** escape Escape character in LIKE. (Normally '\').
617 ** All escape characters should be removed from min_str and max_str
618 ** res_length Length of min_str and max_str.
619 ** min_str Smallest case sensitive string that ranges LIKE.
620 ** Should be space padded to res_length.
621 ** max_str Largest case sensitive string that ranges LIKE.
622 ** Normally padded with the biggest character sort value.
623 **
624 ** The function should return 0 if ok and 1 if the LIKE string can't be
625 ** optimized !
626 */
627
628 static my_bool
my_like_range_win1250ch(const CHARSET_INFO * cs MY_ATTRIBUTE ((unused)),const char * ptr,size_t ptr_length,pbool escape,pbool w_one,pbool w_many,size_t res_length,char * min_str,char * max_str,size_t * min_length,size_t * max_length)629 my_like_range_win1250ch(const CHARSET_INFO *cs MY_ATTRIBUTE((unused)),
630 const char *ptr, size_t ptr_length,
631 pbool escape, pbool w_one, pbool w_many,
632 size_t res_length,
633 char *min_str, char *max_str,
634 size_t *min_length, size_t *max_length)
635 {
636
637 int only_min_found= 1;
638 const char *end = ptr + ptr_length;
639 char *min_org = min_str;
640 char *min_end = min_str + res_length;
641
642 /* return 1; */
643
644 for (; ptr != end && min_str != min_end ; ptr++)
645 {
646 if (*ptr == escape && ptr+1 != end)
647 ptr++; /* Skip escape */
648 else if (*ptr == w_one || *ptr == w_many) /* '_' or '%' in SQL */
649 break;
650 *min_str= like_range_prefix_min_win1250ch[(uint) (uchar) (*ptr)];
651 if (*min_str != min_sort_char)
652 only_min_found= 0;
653 min_str++;
654 *max_str++= like_range_prefix_max_win1250ch[(uint) (uchar) (*ptr)];
655 }
656
657 if (cs->state & MY_CS_BINSORT)
658 *min_length= (size_t) (min_str - min_org);
659 else
660 {
661 /* 'a\0\0... is the smallest possible string */
662 *min_length= res_length;
663 }
664 /* a\ff\ff... is the biggest possible string */
665 *max_length= res_length;
666
667 while (min_str != min_end)
668 {
669 *min_str++ = min_sort_char;
670 *max_str++ = max_sort_char;
671 }
672 return (only_min_found);
673 }
674
675
676 static MY_COLLATION_HANDLER my_collation_czech_ci_handler =
677 {
678 NULL, /* init */
679 my_strnncoll_win1250ch,
680 my_strnncollsp_win1250ch,
681 my_strnxfrm_win1250ch,
682 my_strnxfrmlen_simple,
683 my_like_range_win1250ch,
684 my_wildcmp_8bit,
685 my_strcasecmp_8bit,
686 my_instr_simple,
687 my_hash_sort_simple,
688 my_propagate_simple
689 };
690
691
692 CHARSET_INFO my_charset_cp1250_czech_ci =
693 {
694 34,0,0, /* number */
695 MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT, /* state */
696 "cp1250", /* cs name */
697 "cp1250_czech_cs", /* name */
698 "", /* comment */
699 NULL, /* tailoring */
700 ctype_win1250ch,
701 to_lower_win1250ch,
702 to_upper_win1250ch,
703 sort_order_win1250ch,
704 NULL, /* uca */
705 tab_cp1250_uni, /* tab_to_uni */
706 idx_uni_cp1250, /* tab_from_uni */
707 &my_unicase_default, /* caseinfo */
708 NULL, /* state_map */
709 NULL, /* ident_map */
710 2, /* strxfrm_multiply */
711 1, /* caseup_multiply */
712 1, /* casedn_multiply */
713 1, /* mbminlen */
714 1, /* mbmaxlen */
715 1, /* mbmaxlenlen */
716 0, /* min_sort_char */
717 0, /* max_sort_char */
718 ' ', /* pad char */
719 0, /* escape_with_backslash_is_dangerous */
720 2, /* levels_for_compare */
721 2, /* levels_for_order */
722 &my_charset_8bit_handler,
723 &my_collation_czech_ci_handler
724 };
725
726
727 #endif /* HAVE_CHARSET_cp1250 */
728