~drizzle-trunk/drizzle/development

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