1 /* Copyright (c) 2002-2007 MySQL AB
2 Use is subject to license terms.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; version 2 of the License.
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 Shared, independent copyright: (C) 2001 Jan Pazdziora.
21 Development of this software was supported by Neocortex, s.r.o.
22 MySQL AB expresses its gratitude to Jan for for giving us this software.
24 Bug reports and suggestions are always welcome.
26 This file implements the collating sequence for Windows-1250
27 character set. It merely extends the binary sorting of US-ASCII
28 by adding characters with diacritical marks into proper places.
29 In addition, it sorts 'ch' between 'h' and 'i', and the sorting
30 is case sensitive, with uppercase being sorted first, in the
35 * This comment is parsed by configure to create ctype.c,
36 * so don't change it unless you know what you are doing.
38 * .configure. strxfrm_multiply_win1250ch=2
44 #include "my_global.h"
51 #define uchar unsigned char
55 #ifdef HAVE_CHARSET_cp1250
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
94 /* 0000-00FD , 254 chars */
95 static 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};
113 /* 0102-017E , 125 chars */
114 static 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};
124 /* 2013-20AC , 154 chars */
125 static 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};
137 /* 02C7-02DD , 23 chars */
138 static 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};
142 /* 2122-2122 , 1 chars */
143 static uchar tab_uni_cp1250_plane21
[]={
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
},
157 static uchar NEAR ctype_win1250ch
[] = {
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
193 static uchar NEAR 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
228 static uchar NEAR 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
265 static uchar NEAR 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
284 static uchar NEAR _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,
293 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
295 /* colon ord 58 0x3a */
296 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
301 0xff, 0xa8, 0xa9, 0xaa, 0xab,
302 0xac, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
307 0xb9, 0xbc, 0xbd, 0xbe, 0xbf,
310 0xc4, 0xc5, 0xc6, 0xc7, 0xc8,
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,
318 0xca, 0xcb, 0xcc, 0xcd, 0x81,
319 0x81, 0x81, 0xce, 0x81, 0xcf, 0xd0, 0xd1, 0xd2,
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
344 static uchar NEAR _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,
353 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
355 /* colon ord 58 0x3a */
356 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
361 0xff, 0x01, 0x01, 0x01, 0x01,
362 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
367 0x01, 0x01, 0x01, 0x01, 0x01,
370 0x01, 0x01, 0x01, 0x01, 0x01,
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,
378 0x01, 0x01, 0x01, 0x01, 0x22,
379 0x23, 0x24, 0x01, 0x25, 0x01, 0x01, 0x01, 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
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 },
417 #define NEXT_CMP_VALUE(src, p, pass, value, len) \
419 if (IS_END(p, src, len)) { \
420 if (pass == 0 && len > 0) { p= src; pass++; } \
421 else { value = 0; break; } \
423 value = ((pass == 0) ? _sort_order_win1250ch1[*p] \
424 : _sort_order_win1250ch2[*p]); \
425 if (value == 0xff) { \
427 for (i = 0; i < (int) sizeof(doubles); i++) { \
428 const uchar *patt = doubles[i].word; \
429 const uchar *q = (const uchar *) p; \
431 && !(IS_END(q, src, len)) \
432 && (*patt == *q)) { \
436 value = (int)((pass == 0) \
438 : doubles[i].pass2); \
439 p = (const uchar *) q - 1; \
448 #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len))
450 static int my_strnncoll_win1250ch(CHARSET_INFO
*cs
__attribute__((unused
)),
451 const uchar
*s1
, size_t len1
,
452 const uchar
*s2
, size_t len2
,
453 my_bool s2_is_prefix
)
456 const uchar
*p1
, * p2
;
457 int pass1
= 0, pass2
= 0;
460 if (s2_is_prefix
&& len1
> len2
)
467 NEXT_CMP_VALUE(s1
, p1
, pass1
, v1
, (int)len1
);
468 NEXT_CMP_VALUE(s2
, p2
, pass2
, v2
, (int)len2
);
469 if ((diff
= v1
- v2
))
477 TODO: Has to be fixed as strnncollsp in ctype-simple
481 int my_strnncollsp_win1250ch(CHARSET_INFO
* cs
,
482 const uchar
*s
, size_t slen
,
483 const uchar
*t
, size_t tlen
,
484 my_bool diff_if_only_endspace_difference
485 __attribute__((unused
)))
487 for ( ; slen
&& s
[slen
-1] == ' ' ; slen
--);
488 for ( ; tlen
&& t
[tlen
-1] == ' ' ; tlen
--);
489 return my_strnncoll_win1250ch(cs
,s
,slen
,t
,tlen
,0);
493 static size_t my_strnxfrm_win1250ch(CHARSET_INFO
* cs
__attribute__((unused
)),
494 uchar
*dest
, size_t len
,
495 const uchar
*src
, size_t srclen
)
504 NEXT_CMP_VALUE(src
, p
, pass
, value
, (int)srclen
);
506 dest
[totlen
] = value
;
510 bfill(dest
+ totlen
, len
- totlen
, ' ');
518 static uchar NEAR like_range_prefix_min_win1250ch
[]=
520 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
521 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
522 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
523 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
524 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
525 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
526 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
527 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
528 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
529 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
530 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
531 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
532 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
533 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
534 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
535 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
536 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
537 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
538 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
539 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
540 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
541 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
542 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
543 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
544 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
545 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
546 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
547 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
548 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
549 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
550 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
551 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
555 The letter "C" is a special case:
556 "CH" is sorted between "H" and "I".
557 prefix_max for "C" is "I": prefix_max[0x43] == 0x49
558 prefix_max for "c" is "i": prefix_max[0x63] == 0x69
559 For all other characters: prefix_max[i] == i
562 static uchar NEAR like_range_prefix_max_win1250ch
[]=
564 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
565 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
566 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
567 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
568 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
569 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
570 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
571 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
572 0x40, 0x41, 0x42, 0x49, 0x44, 0x45, 0x46, 0x47,
573 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
574 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
575 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
576 0x60, 0x61, 0x62, 0x69, 0x64, 0x65, 0x66, 0x67,
577 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
578 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
579 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
580 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
581 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
582 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
583 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
584 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
585 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
586 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
587 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
588 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
589 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
590 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
591 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
592 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
593 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
594 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
595 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
598 #define min_sort_char '\x20'
599 #define max_sort_char '\xff'
602 ** Calculate min_str and max_str that ranges a LIKE string.
604 ** ptr Pointer to LIKE string.
605 ** ptr_length Length of LIKE string.
606 ** escape Escape character in LIKE. (Normally '\').
607 ** All escape characters should be removed from min_str and max_str
608 ** res_length Length of min_str and max_str.
609 ** min_str Smallest case sensitive string that ranges LIKE.
610 ** Should be space padded to res_length.
611 ** max_str Largest case sensitive string that ranges LIKE.
612 ** Normally padded with the biggest character sort value.
614 ** The function should return 0 if ok and 1 if the LIKE string can't be
619 my_like_range_win1250ch(CHARSET_INFO
*cs
__attribute__((unused
)),
620 const char *ptr
, size_t ptr_length
,
621 pbool escape
, pbool w_one
, pbool w_many
,
623 char *min_str
, char *max_str
,
624 size_t *min_length
, size_t *max_length
)
627 int only_min_found
= 1;
628 const char *end
= ptr
+ ptr_length
;
629 char *min_org
= min_str
;
630 char *min_end
= min_str
+ res_length
;
634 for (; ptr
!= end
&& min_str
!= min_end
; ptr
++)
636 if (*ptr
== escape
&& ptr
+1 != end
)
637 ptr
++; /* Skip escape */
638 else if (*ptr
== w_one
|| *ptr
== w_many
) /* '_' or '%' in SQL */
640 *min_str
= like_range_prefix_min_win1250ch
[(uint
) (uchar
) (*ptr
)];
641 if (*min_str
!= min_sort_char
)
644 *max_str
++= like_range_prefix_max_win1250ch
[(uint
) (uchar
) (*ptr
)];
647 if (cs
->state
& MY_CS_BINSORT
)
648 *min_length
= (size_t) (min_str
- min_org
);
651 /* 'a\0\0... is the smallest possible string */
652 *min_length
= res_length
;
654 /* a\ff\ff... is the biggest possible string */
655 *max_length
= res_length
;
657 while (min_str
!= min_end
)
659 *min_str
++ = min_sort_char
;
660 *max_str
++ = max_sort_char
;
662 return (only_min_found
);
666 static MY_COLLATION_HANDLER my_collation_czech_ci_handler
=
669 my_strnncoll_win1250ch
,
670 my_strnncollsp_win1250ch
,
671 my_strnxfrm_win1250ch
,
672 my_strnxfrmlen_simple
,
673 my_like_range_win1250ch
,
682 CHARSET_INFO my_charset_cp1250_czech_ci
=
685 MY_CS_COMPILED
|MY_CS_STRNXFRM
|MY_CS_CSSORT
, /* state */
686 "cp1250", /* cs name */
687 "cp1250_czech_cs", /* name */
689 NULL
, /* tailoring */
693 sort_order_win1250ch
,
694 NULL
, /* contractions */
695 NULL
, /* sort_order_big*/
696 tab_cp1250_uni
, /* tab_to_uni */
697 idx_uni_cp1250
, /* tab_from_uni */
698 my_unicase_default
, /* caseinfo */
699 NULL
, /* state_map */
700 NULL
, /* ident_map */
701 2, /* strxfrm_multiply */
702 1, /* caseup_multiply */
703 1, /* casedn_multiply */
706 0, /* min_sort_char */
707 0, /* max_sort_char */
709 0, /* escape_with_backslash_is_dangerous */
710 &my_charset_8bit_handler
,
711 &my_collation_czech_ci_handler
715 #endif /* REAL_MYSQL */
717 #endif /* HAVE_CHARSET_cp1250 */