MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ctype-win1250ch.c
1 /* Copyright (c) 2002, 2011, 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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  const uchar *word;
394  uchar pass1;
395  uchar pass2;
396 };
397 static struct wordvalue doubles[] = {
398  { (uchar*) "ch", 0xad, 0x03 },
399  { (uchar*) "c", 0xa6, 0x02 },
400  { (uchar*) "Ch", 0xad, 0x02 },
401  { (uchar*) "CH", 0xad, 0x01 },
402  { (uchar*) "C", 0xa6, 0x01 },
403 };
404 
405 #define NEXT_CMP_VALUE(src, p, pass, value, len) \
406  while (1) { \
407  if (IS_END(p, src, len)) { \
408  if (pass == 0 && len > 0) { p= src; pass++; } \
409  else { value = 0; break; } \
410  } \
411  value = ((pass == 0) ? _sort_order_win1250ch1[*p] \
412  : _sort_order_win1250ch2[*p]); \
413  if (value == 0xff) { \
414  int i; \
415  for (i = 0; i < (int) sizeof(doubles); i++) { \
416  const uchar *patt = doubles[i].word; \
417  const uchar *q = (const uchar *) p; \
418  while (*patt \
419  && !(IS_END(q, src, len)) \
420  && (*patt == *q)) { \
421  patt++; q++; \
422  } \
423  if (!(*patt)) { \
424  value = (int)((pass == 0) \
425  ? doubles[i].pass1 \
426  : doubles[i].pass2); \
427  p = (const uchar *) q - 1; \
428  break; \
429  } \
430  } \
431  } \
432  p++; \
433  break; \
434  }
435 
436 #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len))
437 
438 static int my_strnncoll_win1250ch(const CHARSET_INFO *cs
439  __attribute__((unused)),
440  const uchar *s1, size_t len1,
441  const uchar *s2, size_t len2,
442  my_bool s2_is_prefix)
443 {
444  int v1, v2;
445  const uchar *p1, * p2;
446  int pass1 = 0, pass2 = 0;
447  int diff;
448 
449  if (s2_is_prefix && len1 > len2)
450  len1=len2;
451 
452  p1 = s1; p2 = s2;
453 
454  do
455  {
456  NEXT_CMP_VALUE(s1, p1, pass1, v1, (int)len1);
457  NEXT_CMP_VALUE(s2, p2, pass2, v2, (int)len2);
458  if ((diff = v1 - v2))
459  return diff;
460  } while (v1);
461  return 0;
462 }
463 
464 
465 /*
466  TODO: Has to be fixed as strnncollsp in ctype-simple
467 */
468 
469 static
470 int my_strnncollsp_win1250ch(const CHARSET_INFO *cs,
471  const uchar *s, size_t slen,
472  const uchar *t, size_t tlen,
473  my_bool diff_if_only_endspace_difference
474  __attribute__((unused)))
475 {
476  for ( ; slen && s[slen-1] == ' ' ; slen--);
477  for ( ; tlen && t[tlen-1] == ' ' ; tlen--);
478  return my_strnncoll_win1250ch(cs,s,slen,t,tlen,0);
479 }
480 
481 
482 static size_t
483 my_strnxfrm_win1250ch(const CHARSET_INFO *cs __attribute__((unused)),
484  uchar *dest, size_t len,
485  uint nweights_arg __attribute__((unused)),
486  const uchar *src, size_t srclen, uint flags)
487 {
488  int value;
489  const uchar *p;
490  int pass = 0;
491  size_t totlen = 0;
492  p = src;
493 
494  if (!(flags & 0x0F)) /* All levels by default */
495  flags|= 0x0F;
496 
497  for (;;)
498  {
499  NEXT_CMP_VALUE(src, p, pass, value, (int)srclen);
500  if (!value)
501  break;
502  if (totlen <= len && ((1 << pass) & flags))
503  dest[totlen++] = value;
504  }
505  if ((flags & MY_STRXFRM_PAD_TO_MAXLEN) && len > totlen)
506  {
507  memset(dest + totlen, 0x00, len - totlen);
508  totlen= len;
509  }
510  return totlen;
511 }
512 
513 #undef IS_END
514 
515 
516 static uchar like_range_prefix_min_win1250ch[]=
517 {
518  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
519  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
520  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
521  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
522  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
523  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
524  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
525  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
526  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
527  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
528  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
529  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
530  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
531  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
532  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
533  0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
534  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
535  0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
536  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
537  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
538  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
539  0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
540  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
541  0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
542  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
543  0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
544  0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
545  0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
546  0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
547  0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
548  0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
549  0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
550 };
551 
552 /*
553  The letter "C" is a special case:
554  "CH" is sorted between "H" and "I".
555  prefix_max for "C" is "I": prefix_max[0x43] == 0x49
556  prefix_max for "c" is "i": prefix_max[0x63] == 0x69
557  For all other characters: prefix_max[i] == i
558 */
559 
560 static uchar like_range_prefix_max_win1250ch[]=
561 {
562  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
563  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
564  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
565  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
566  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
567  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
568  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
569  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
570  0x40, 0x41, 0x42, 0x49, 0x44, 0x45, 0x46, 0x47,
571  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
572  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
573  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
574  0x60, 0x61, 0x62, 0x69, 0x64, 0x65, 0x66, 0x67,
575  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
576  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
577  0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
578  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
579  0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
580  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
581  0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
582  0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
583  0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
584  0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
585  0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
586  0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
587  0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
588  0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
589  0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
590  0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
591  0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
592  0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
593  0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
594 };
595 
596 #define min_sort_char '\x20'
597 #define max_sort_char '\xff'
598 
599 /*
600 ** Calculate min_str and max_str that ranges a LIKE string.
601 ** Arguments:
602 ** ptr Pointer to LIKE string.
603 ** ptr_length Length of LIKE string.
604 ** escape Escape character in LIKE. (Normally '\').
605 ** All escape characters should be removed from min_str and max_str
606 ** res_length Length of min_str and max_str.
607 ** min_str Smallest case sensitive string that ranges LIKE.
608 ** Should be space padded to res_length.
609 ** max_str Largest case sensitive string that ranges LIKE.
610 ** Normally padded with the biggest character sort value.
611 **
612 ** The function should return 0 if ok and 1 if the LIKE string can't be
613 ** optimized !
614 */
615 
616 static my_bool
617 my_like_range_win1250ch(const CHARSET_INFO *cs __attribute__((unused)),
618  const char *ptr, size_t ptr_length,
619  pbool escape, pbool w_one, pbool w_many,
620  size_t res_length,
621  char *min_str, char *max_str,
622  size_t *min_length, size_t *max_length)
623 {
624 
625  int only_min_found= 1;
626  const char *end = ptr + ptr_length;
627  char *min_org = min_str;
628  char *min_end = min_str + res_length;
629 
630  /* return 1; */
631 
632  for (; ptr != end && min_str != min_end ; ptr++)
633  {
634  if (*ptr == escape && ptr+1 != end)
635  ptr++; /* Skip escape */
636  else if (*ptr == w_one || *ptr == w_many) /* '_' or '%' in SQL */
637  break;
638  *min_str= like_range_prefix_min_win1250ch[(uint) (uchar) (*ptr)];
639  if (*min_str != min_sort_char)
640  only_min_found= 0;
641  min_str++;
642  *max_str++= like_range_prefix_max_win1250ch[(uint) (uchar) (*ptr)];
643  }
644 
645  if (cs->state & MY_CS_BINSORT)
646  *min_length= (size_t) (min_str - min_org);
647  else
648  {
649  /* 'a\0\0... is the smallest possible string */
650  *min_length= res_length;
651  }
652  /* a\ff\ff... is the biggest possible string */
653  *max_length= res_length;
654 
655  while (min_str != min_end)
656  {
657  *min_str++ = min_sort_char;
658  *max_str++ = max_sort_char;
659  }
660  return (only_min_found);
661 }
662 
663 
664 static MY_COLLATION_HANDLER my_collation_czech_ci_handler =
665 {
666  NULL, /* init */
667  my_strnncoll_win1250ch,
668  my_strnncollsp_win1250ch,
669  my_strnxfrm_win1250ch,
670  my_strnxfrmlen_simple,
671  my_like_range_win1250ch,
672  my_wildcmp_8bit,
673  my_strcasecmp_8bit,
674  my_instr_simple,
675  my_hash_sort_simple,
676  my_propagate_simple
677 };
678 
679 
680 CHARSET_INFO my_charset_cp1250_czech_ci =
681 {
682  34,0,0, /* number */
683  MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT, /* state */
684  "cp1250", /* cs name */
685  "cp1250_czech_cs", /* name */
686  "", /* comment */
687  NULL, /* tailoring */
688  ctype_win1250ch,
689  to_lower_win1250ch,
690  to_upper_win1250ch,
691  sort_order_win1250ch,
692  NULL, /* uca */
693  tab_cp1250_uni, /* tab_to_uni */
694  idx_uni_cp1250, /* tab_from_uni */
695  &my_unicase_default, /* caseinfo */
696  NULL, /* state_map */
697  NULL, /* ident_map */
698  2, /* strxfrm_multiply */
699  1, /* caseup_multiply */
700  1, /* casedn_multiply */
701  1, /* mbminlen */
702  1, /* mbmaxlen */
703  0, /* min_sort_char */
704  0, /* max_sort_char */
705  ' ', /* pad char */
706  0, /* escape_with_backslash_is_dangerous */
707  2, /* levels_for_compare */
708  2, /* levels_for_order */
709  &my_charset_8bit_handler,
710  &my_collation_czech_ci_handler
711 };
712 
713 
714 #endif /* HAVE_CHARSET_cp1250 */