1/* Copyright (c) 2000-2007 MySQL AB
2 Copyright (c) 2009-2011, Monty Program Ab
3 Use is subject to license terms.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; version 2 of the License.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
17
18/* File strings/ctype-czech.c for MySQL.
19
20 This file implements the Czech sorting for the MySQL database
21 server (www.mysql.com). Due to some complicated rules the
22 Czech language has for sorting strings, a more complex
23 solution was needed than the one-to-one conversion table. To
24 note a few, here is an example of a Czech sorting sequence:
25
26 co < hlaska < hláska < hlava < chlapec < krtek
27
28 It because some of the rules are: double char 'ch' is sorted
29 between 'h' and 'i'. Accented character 'á' (a with acute) is
30 sorted after 'a' and before 'b', but only if the word is
31 otherwise the same. However, because 's' is sorted before 'v'
32 in hlava, the accentness of 'á' is overridden. There are many
33 more rules.
34
35 This file defines functions my_strxfrm and my_strcoll for
36 C-like zero terminated strings and my_strnxfrm and my_strnncoll
37 for strings where the length comes as an parameter. Also
38 defined here you will find function my_like_range that returns
39 index range strings for LIKE expression and the
40 MY_STRXFRM_MULTIPLY set to value 4 -- this is the ratio the
41 strings grows during my_strxfrm. The algorithm has four
42 passes, that's why we need four times more space for expanded
43 string.
44
45 This file also contains the ISO-Latin-2 definitions of
46 characters.
47
48 Author: (c) 1997--1998 Jan Pazdziora, adelton@fi.muni.cz
49 Jan Pazdziora has a shared copyright for this code
50
51 The original of this file can also be found at
52 http://www.fi.muni.cz/~adelton/l10n/
53
54 Bug reports and suggestions are always welcome.
55*/
56
57/*
58 * This comment is parsed by configure to create ctype.c,
59 * so don't change it unless you know what you are doing.
60 *
61 * .configure. strxfrm_multiply_czech=4
62 */
63
64#define SKIP_TRAILING_SPACES 1
65
66#define REAL_MYSQL
67
68#ifdef REAL_MYSQL
69
70#include "strings_def.h"
71#include <m_ctype.h>
72
73#else
74
75#include <stdio.h>
76#define uchar unsigned char
77
78#endif
79
80#ifdef HAVE_CHARSET_latin2
81
82/*
83 These are four tables for four passes of the algorithm. Please see
84 below for what are the "special values"
85*/
86
87static const uchar *const CZ_SORT_TABLE[] = {
88 (uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\043\044\045\046\047\050\051\052\053\054\000\000\000\000\000\000\000\003\004\377\007\010\011\012\013\015\016\017\020\022\023\024\025\026\027\031\033\034\035\036\037\040\041\000\000\000\000\000\000\003\004\377\007\010\011\012\013\015\016\017\020\022\023\024\025\026\027\031\033\034\035\036\037\040\041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\021\000\020\032\000\000\032\032\033\042\000\042\042\000\003\000\021\000\020\032\000\000\032\032\033\042\000\042\042\027\003\003\003\003\020\006\006\006\010\010\010\010\015\015\007\007\023\023\024\024\024\024\000\030\034\034\034\034\040\033\000\027\003\003\003\003\020\006\006\006\010\010\010\010\015\015\007\007\023\023\024\024\024\024\000\030\034\034\034\034\040\033\000",
89 (uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\106\107\110\111\112\113\114\115\116\117\000\000\000\000\000\000\000\003\011\377\016\021\026\027\030\032\035\036\037\043\044\047\054\055\056\061\065\070\075\076\077\100\102\000\000\000\000\000\000\003\011\377\016\021\026\027\030\032\035\036\037\043\044\047\054\055\056\061\065\070\075\076\077\100\102\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\042\000\041\063\000\000\062\064\066\104\000\103\105\000\010\000\042\000\041\063\000\000\062\064\066\104\000\103\105\057\004\005\007\006\040\014\015\013\022\025\024\023\033\034\017\020\046\045\050\051\053\052\000\060\072\071\074\073\101\067\000\057\004\005\007\006\040\014\015\013\022\025\024\023\033\034\017\020\046\045\050\051\053\052\000\060\072\071\074\073\101\067\000",
90(uchar*) "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\212\213\214\215\216\217\220\221\222\223\000\000\000\000\000\000\000\004\020\377\032\040\052\054\056\063\071\073\075\105\107\115\127\131\133\141\151\157\171\173\175\177\203\000\000\000\000\000\000\003\017\377\031\037\051\053\055\062\070\072\074\104\106\114\126\130\132\140\150\156\170\172\174\176\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\103\000\101\145\000\000\143\147\153\207\000\205\211\000\015\000\102\000\100\144\000\000\142\146\152\206\000\204\210\135\006\010\014\012\077\026\030\024\042\050\046\044\065\067\034\036\113\111\117\121\125\123\000\137\163\161\167\165\201\155\000\134\005\007\013\011\076\025\027\023\041\047\045\043\064\066\033\035\112\110\116\120\124\122\000\136\162\160\166\164\200\154\000",
91(uchar*) "\264\265\266\267\270\271\272\273\274\002\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\002\230\232\253\324\252\251\234\240\241\261\260\225\262\224\235\212\213\214\215\216\217\220\221\222\223\231\226\244\257\245\227\250\004\020\377\032\040\052\054\056\063\071\073\075\105\107\115\127\131\133\141\151\157\171\173\175\177\203\242\237\243\254\255\233\003\017\377\031\037\051\053\055\062\070\072\074\104\106\114\126\130\132\140\150\156\170\172\174\176\202\246\236\247\256\325\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\326\016\327\103\330\101\145\331\332\143\147\153\207\333\205\211\334\015\335\102\336\100\144\337\340\142\146\152\206\341\204\210\135\006\010\014\012\077\026\030\024\042\050\046\044\065\067\034\036\113\111\117\121\125\123\263\137\163\161\167\165\201\155\342\134\005\007\013\011\076\025\027\023\041\047\045\043\064\066\033\035\112\110\116\120\124\122\343\136\162\160\166\164\200\154\344",
92};
93
94/*
95 These define the valuse for the double chars that need to be
96 sorted as they were single characters -- in Czech these are
97 'ch', 'Ch' and 'CH'.
98*/
99
100struct wordvalue
101 {
102 const char * word;
103 const uchar *outvalue;
104 };
105static const struct wordvalue doubles[] = {
106 { "ch", (const uchar*) "\014\031\057\057" },
107 { "Ch", (const uchar*) "\014\031\060\060" },
108 { "CH", (const uchar*) "\014\031\061\061" },
109 { "c", (const uchar*) "\005\012\021\021" },
110 { "C", (const uchar*) "\005\012\022\022" },
111 };
112
113/*
114 Unformal description of the algorithm:
115
116 We walk the string left to right.
117
118 The end of the string is either passed as parameter, or is
119 *p == 0. This is hidden in the IS_END macro.
120
121 In the first two passes, we compare word by word. So we make
122 first and second pass on the first word, first and second pass
123 on the second word, etc. If we come to the end of the string
124 during the first pass, we need to jump to the last word of the
125 second pass.
126
127 End of pass is marked with value 1 on the output.
128
129 For each character, we read it's value from the table.
130
131 If the value is ignore (0), we go straight to the next character.
132
133 If the value is space/end of word (2) and we are in the first
134 or second pass, we skip all characters having value 0 -- 2 and
135 switch the passwd.
136
137 If it's the compose character (255), we check if the double
138 exists behind it, find its value.
139
140 We append 0 to the end.
141---
142 Neformální popis algoritmu:
143
144 Procházíme řetězec zleva doprava.
145
146 Konec řetězce je předán buď jako parametr, nebo je to *p == 0.
147 Toto je ošetřeno makrem IS_END.
148
149 Pokud jsme došli na konec řetězce při průchodu 0, nejdeme na
150 začátek, ale na uloženou pozici, protože první a druhý průchod
151 běží současně.
152
153 Konec vstupu (průchodu) označíme na výstupu hodnotou 1.
154
155 Pro každý znak řetězce načteme hodnotu z třídící tabulky.
156
157 Jde-li o hodnotu ignorovat (0), skočíme ihned na další znak..
158
159 Jde-li o hodnotu konec slova (2) a je to průchod 0 nebo 1,
160 přeskočíme všechny další 0 -- 2 a prohodíme průchody.
161
162 Jde-li o kompozitní znak (255), otestujeme, zda následuje
163 správný do dvojice, dohledáme správnou hodnotu.
164
165 Na konci připojíme znak 0
166 */
167
168#define ADD_TO_RESULT(dest, len, totlen, value) \
169{ if ((totlen) < (len)) { dest[totlen++]= value; } }
170#define IS_END(p, src, len) (((char *)p - (char *)src) >= (len))
171
172#define NEXT_CMP_VALUE(src, p, store, pass, value, len) \
173while (1) \
174{ \
175 if (IS_END(p, src, len)) \
176 { \
177 /* when we are at the end of string */ \
178 /* return either 0 for end of string */ \
179 /* or 1 for end of pass */ \
180 value= 0; \
181 if (pass != 3) \
182 { \
183 p= (pass++ == 0) ? store : src; \
184 value = 1; \
185 } \
186 break; \
187 } \
188 /* not at end of string */ \
189 value = CZ_SORT_TABLE[pass][*p]; \
190 if (value == 0) \
191 { p++; continue; } /* ignore value */ \
192 if (value == 2) /* space */ \
193 { \
194 const uchar *tmp; \
195 const uchar *runner = ++p; \
196 while (!(IS_END(runner, src, len)) && (CZ_SORT_TABLE[pass][*runner] == 2)) \
197 runner++; /* skip all spaces */ \
198 if (IS_END(runner, src, len) && SKIP_TRAILING_SPACES) \
199 p = runner; \
200 if ((pass <= 2) && !(IS_END(runner, src, len))) \
201 p = runner; \
202 if (IS_END(p, src, len)) \
203 continue; \
204 /* we switch passes */ \
205 if (pass > 1) \
206 break; \
207 tmp = p; \
208 pass= 1-pass; \
209 p = store; store = tmp; \
210 break; \
211 } \
212 if (value == 255) \
213 { \
214 int i; \
215 for (i = 0; i < (int) sizeof(doubles); i++) \
216 { \
217 const char * pattern = doubles[i].word; \
218 const char * q = (const char *) p; \
219 int j = 0; \
220 while (pattern[j]) \
221 { \
222 if (IS_END(q, src, len) || (*q != pattern[j])) \
223 break; \
224 j++; q++; \
225 } \
226 if (!(pattern[j])) \
227 { \
228 value = (int)(doubles[i].outvalue[pass]); \
229 p= (const uchar *) q - 1; \
230 break; \
231 } \
232 } \
233 } \
234 p++; \
235 break; \
236}
237
238/*
239 Function strnncoll, actually strcoll, with Czech sorting, which expect
240 the length of the strings being specified
241*/
242
243static int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)),
244 const uchar *s1, size_t len1,
245 const uchar *s2, size_t len2,
246 my_bool s2_is_prefix)
247{
248 int v1, v2;
249 const uchar *p1, * p2, * store1, * store2;
250 int pass1 = 0, pass2 = 0;
251
252 if (s2_is_prefix && len1 > len2)
253 len1=len2;
254
255 p1 = s1; p2 = s2;
256 store1 = s1; store2 = s2;
257
258 do
259 {
260 int diff;
261 NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, (int)len1);
262 NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, (int)len2);
263 if ((diff = v1 - v2))
264 return diff;
265 }
266 while (v1);
267 return 0;
268}
269
270
271
272/*
273 TODO: Fix this one to compare strings as they are done in ctype-simple1
274*/
275
276static
277int my_strnncollsp_czech(CHARSET_INFO * cs,
278 const uchar *s, size_t slen,
279 const uchar *t, size_t tlen)
280{
281 for ( ; slen && s[slen-1] == ' ' ; slen--);
282 for ( ; tlen && t[tlen-1] == ' ' ; tlen--);
283 return my_strnncoll_czech(cs,s,slen,t,tlen,0);
284}
285
286
287/*
288 Returns the number of bytes required for strnxfrm().
289*/
290static size_t
291my_strnxfrmlen_czech(CHARSET_INFO *cs
292 __attribute__((unused)), size_t len)
293{
294 return len * 4 + 4;
295}
296
297
298/*
299 Function strnxfrm, actually strxfrm, with Czech sorting, which expect
300 the length of the strings being specified
301*/
302
303static size_t
304my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)),
305 uchar *dest, size_t len,
306 uint nweights_arg __attribute__((unused)),
307 const uchar *src, size_t srclen, uint flags)
308{
309 int value;
310 const uchar *p, * store;
311 int pass = 0;
312 size_t totlen = 0;
313 p = src; store = src;
314
315 if (!(flags & 0x0F)) /* All levels by default */
316 flags|= 0x0F;
317
318 do
319 {
320 int add= (1 << pass) & flags; /* If this level is needed */
321 NEXT_CMP_VALUE(src, p, store, pass, value, (int)srclen);
322 if (add)
323 ADD_TO_RESULT(dest, len, totlen, value);
324 }
325 while (value);
326 if ((flags & MY_STRXFRM_PAD_TO_MAXLEN) && len > totlen)
327 {
328 memset(dest + totlen, ' ', len - totlen);
329 totlen= len;
330 }
331 return totlen;
332}
333
334#undef IS_END
335
336
337/*
338 Neformální popis algoritmu:
339
340 procházíme řetězec zleva doprava
341 konec řetězce poznáme podle *p == 0
342 pokud jsme došli na konec řetězce při průchodu 0, nejdeme na
343 začátek, ale na uloženou pozici, protože první a druhý
344 průchod běží současně
345 konec vstupu (průchodu) označíme na výstupu hodnotou 1
346
347 načteme hodnotu z třídící tabulky
348 jde-li o hodnotu ignorovat (0), skočíme na další průchod
349 jde-li o hodnotu konec slova (2) a je to průchod 0 nebo 1,
350 přeskočíme všechny další 0 -- 2 a prohodíme
351 průchody
352 jde-li o kompozitní znak (255), otestujeme, zda následuje
353 správný do dvojice, dohledáme správnou hodnotu
354
355 na konci připojíme znak 0
356 */
357
358
359/*
360** Calculate min_str and max_str that ranges a LIKE string.
361** Arguments:
362** ptr Pointer to LIKE string.
363** ptr_length Length of LIKE string.
364** escape Escape character in LIKE. (Normally '\').
365** All escape characters should be removed from min_str and max_str
366** res_length Length of min_str and max_str.
367** min_str Smallest case sensitive string that ranges LIKE.
368** Should be space padded to res_length.
369** max_str Largest case sensitive string that ranges LIKE.
370** Normally padded with the biggest character sort value.
371**
372** The function should return 0 if ok and 1 if the LIKE string can't be
373** optimized !
374*/
375
376#ifdef REAL_MYSQL
377
378#define min_sort_char ' '
379#define max_sort_char '9'
380
381#define EXAMPLE
382
383static my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)),
384 const char *ptr,size_t ptr_length,
385 pbool escape, pbool w_one, pbool w_many,
386 size_t res_length, char *min_str,
387 char *max_str,
388 size_t *min_length,size_t *max_length)
389{
390#ifdef EXAMPLE
391 uchar value;
392 const char *end=ptr+ptr_length;
393 char *min_org=min_str;
394 char *min_end=min_str+res_length;
395
396 for (; ptr != end && min_str != min_end ; ptr++)
397 {
398 if (*ptr == w_one) /* '_' in SQL */
399 { break; }
400 if (*ptr == w_many) /* '%' in SQL */
401 { break; }
402
403 if (*ptr == escape && ptr+1 != end)
404 { ptr++; } /* Skip escape */
405
406 value = CZ_SORT_TABLE[0][(int) (uchar) *ptr];
407
408 if (value == 0) /* Ignore in the first pass */
409 { continue; }
410 if (value <= 2) /* End of pass or end of string */
411 { break; }
412 if (value == 255) /* Double char too compicated */
413 { break; }
414
415 *min_str++= *max_str++ = *ptr;
416 }
417
418 if (cs->state & MY_CS_BINSORT)
419 *min_length= (size_t) (min_str - min_org);
420 else
421 {
422 /* 'a\0\0... is the smallest possible string */
423 *min_length= res_length;
424 }
425 /* a\ff\ff... is the biggest possible string */
426 *max_length= res_length;
427
428 while (min_str != min_end)
429 {
430 *min_str++ = min_sort_char; /* Because of key compression */
431 *max_str++ = max_sort_char;
432 }
433 return 0;
434#else
435 return 1;
436#endif
437}
438
439#endif
440
441#ifdef REAL_MYSQL
442/* This is a latin2 file */
443
444/*
445 * File generated by cset
446 * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si>
447 *
448 * definition table reworked by Jaromir Dolecek <dolecek@ics.muni.cz>
449 */
450#include "strings_def.h"
451
452static const uchar ctype_czech[257] = {
4530,
454 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32,
455 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
456 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
457132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16,
458 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1,
459 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16,
460 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2,
461 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32,
462 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32,
463 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72,
464 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1,
465 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2,
466 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
467 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16,
468 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
469 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16,
470};
471
472static const uchar to_lower_czech[] = {
473 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
474 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
475 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
476 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
477 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
478112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95,
479 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
480112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
481128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
482144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
483177,161,179,163,181,182,166,167,168,185,186,187,188,173,190,191,
484176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
485224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
486208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223,
487224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
488240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
489};
490
491static const uchar to_upper_czech[] = {
492 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
493 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
494 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
495 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
496 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
497 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
498 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
499 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
500128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
501144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
502160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
503176,160,178,162,180,164,165,183,184,169,170,171,172,189,174,175,
504192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
505208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
506192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
507240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255,
508};
509
510static const uchar sort_order_czech[] = {
511 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
512 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
513 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
514 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
515 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100,
516105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135,
517136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100,
518105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0,
519 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
520 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,255,
521 66,255, 93,255, 94,111,255,255,255,112,113,115,128,255,129,130,
522255, 66,255, 93,255, 94,111,255,255,112,113,115,128,255,129,130,
523108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 87, 77,
524255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255,
525108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 88, 77,
526255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255,
527};
528
529static const uint16 tab_8859_2_uni[256]={
530 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
5310x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
5320x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
5330x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
5340x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
5350x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
5360x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
5370x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
5380x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
5390x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
5400x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
5410x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
5420x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
5430x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
5440x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
5450x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0,
546 0, 0, 0, 0, 0, 0, 0, 0,
547 0, 0, 0, 0, 0, 0, 0, 0,
548 0, 0, 0, 0, 0, 0, 0, 0,
549 0, 0, 0, 0, 0, 0, 0, 0,
5500x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7,
5510x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B,
5520x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7,
5530x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C,
5540x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
5550x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
5560x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
5570x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
5580x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
5590x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
5600x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
5610x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9
562};
563
564
565/* 0000-00FD , 254 chars */
566static const uchar tab_uni_8859_2_plane00[]={
5670x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
5680x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
5690x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
5700x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
5710x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
5720x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
5730x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
5740x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00,
5750x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
5760x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
5770xA0,0x00,0x00,0x00,0xA4,0x00,0x00,0xA7,0xA8,0x00,0x00,0x00,0x00,0xAD,0x00,0x00,
5780xB0,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
5790x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00,
5800x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF,
5810x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00,
5820x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD};
583
584/* 0102-017E , 125 chars */
585static const uchar tab_uni_8859_2_plane01[]={
5860xC3,0xE3,0xA1,0xB1,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0,
5870x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00,
5880x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
5890x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xA5,0xB5,0x00,0x00,0xA3,
5900xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5,
5910x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0xA6,0xB6,0x00,0x00,0xAA,0xBA,0xA9,0xB9,
5920xDE,0xFE,0xAB,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB,
5930x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xBC,0xAF,0xBF,0xAE,0xBE};
594
595/* 02C7-02DD , 23 chars */
596static const uchar tab_uni_8859_2_plane02[]={
5970xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
5980x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD};
599
600static MY_UNI_IDX idx_uni_8859_2[]={
601 {0x0000,0x00FD,tab_uni_8859_2_plane00},
602 {0x0102,0x017E,tab_uni_8859_2_plane01},
603 {0x02C7,0x02DD,tab_uni_8859_2_plane02},
604 {0,0,NULL}
605};
606
607
608static MY_COLLATION_HANDLER my_collation_latin2_czech_ci_handler =
609{
610 NULL, /* init */
611 my_strnncoll_czech,
612 my_strnncollsp_czech,
613 my_strnxfrm_czech,
614 my_strnxfrmlen_czech,
615 my_like_range_czech,
616 my_wildcmp_bin,
617 my_strcasecmp_8bit,
618 my_instr_simple,
619 my_hash_sort_simple,
620 my_propagate_simple
621};
622
623struct charset_info_st my_charset_latin2_czech_ci =
624{
625 2,0,0, /* number */
626 MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT|
627 MY_CS_STRNXFRM_BAD_NWEIGHTS|MY_CS_NON1TO1, /* state */
628 "latin2", /* cs name */
629 "latin2_czech_cs", /* name */
630 "", /* comment */
631 NULL, /* tailoring */
632 ctype_czech,
633 to_lower_czech,
634 to_upper_czech,
635 sort_order_czech,
636 NULL, /* uca */
637 tab_8859_2_uni, /* tab_to_uni */
638 idx_uni_8859_2, /* tab_from_uni */
639 &my_unicase_default,/* caseinfo */
640 NULL, /* state_map */
641 NULL, /* ident_map */
642 4, /* strxfrm_multiply */
643 1, /* caseup_multiply */
644 1, /* casedn_multiply */
645 1, /* mbminlen */
646 1, /* mbmaxlen */
647 0, /* min_sort_char */
648 0, /* max_sort_char */
649 ' ', /* pad char */
650 0, /* escape_with_backslash_is_dangerous */
651 4, /* levels_for_order */
652 &my_charset_8bit_handler,
653 &my_collation_latin2_czech_ci_handler
654};
655
656
657#endif
658
659#endif
660