mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / strings / ctype-czech.c
blobd68efc34f3dbd75b9057c657a7cb199db749b3c2
1 /* Copyright (c) 2000-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
18 /* File strings/ctype-czech.c for MySQL.
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:
26 co < hlaska < hláska < hlava < chlapec < krtek
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.
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.
45 This file also contains the ISO-Latin-2 definitions of
46 characters.
48 Author: (c) 1997--1998 Jan Pazdziora, adelton@fi.muni.cz
49 Jan Pazdziora has a shared copyright for this code
51 The original of this file can also be found at
52 http://www.fi.muni.cz/~adelton/l10n/
54 Bug reports and suggestions are always welcome.
58 * This comment is parsed by configure to create ctype.c,
59 * so don't change it unless you know what you are doing.
61 * .configure. strxfrm_multiply_czech=4
64 #define SKIP_TRAILING_SPACES 1
66 #define REAL_MYSQL
68 #ifdef REAL_MYSQL
70 #include <my_global.h>
71 #include "m_string.h"
72 #include "m_ctype.h"
74 #else
76 #include <stdio.h>
77 #define uchar unsigned char
79 #endif
81 #ifdef HAVE_CHARSET_latin2
84 These are four tables for four passes of the algorithm. Please see
85 below for what are the "special values"
88 static uchar *CZ_SORT_TABLE[] = {
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\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",
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\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",
91 (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",
92 (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",
96 These define the valuse for the double chars that need to be
97 sorted as they were single characters -- in Czech these are
98 'ch', 'Ch' and 'CH'.
101 struct wordvalue
103 const char * word;
104 uchar *outvalue;
106 static struct wordvalue doubles[] = {
107 { "ch", (uchar*) "\014\031\057\057" },
108 { "Ch", (uchar*) "\014\031\060\060" },
109 { "CH", (uchar*) "\014\031\061\061" },
110 { "c", (uchar*) "\005\012\021\021" },
111 { "C", (uchar*) "\005\012\022\022" },
115 Unformal description of the algorithm:
117 We walk the string left to right.
119 The end of the string is either passed as parameter, or is
120 *p == 0. This is hidden in the IS_END macro.
122 In the first two passes, we compare word by word. So we make
123 first and second pass on the first word, first and second pass
124 on the second word, etc. If we come to the end of the string
125 during the first pass, we need to jump to the last word of the
126 second pass.
128 End of pass is marked with value 1 on the output.
130 For each character, we read it's value from the table.
132 If the value is ignore (0), we go straight to the next character.
134 If the value is space/end of word (2) and we are in the first
135 or second pass, we skip all characters having value 0 -- 2 and
136 switch the passwd.
138 If it's the compose character (255), we check if the double
139 exists behind it, find its value.
141 We append 0 to the end.
143 Neformální popis algoritmu:
145 Procházíme øetìzec zleva doprava.
147 Konec øetìzce je pøedán buï jako parametr, nebo je to *p == 0.
148 Toto je o¹etøeno makrem IS_END.
150 Pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na
151 zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý prùchod
152 bì¾í souèasnì.
154 Konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1.
156 Pro ka¾dý znak øetìzce naèteme hodnotu z tøídící tabulky.
158 Jde-li o hodnotu ignorovat (0), skoèíme ihned na dal¹í znak..
160 Jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1,
161 pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme prùchody.
163 Jde-li o kompozitní znak (255), otestujeme, zda následuje
164 správný do dvojice, dohledáme správnou hodnotu.
166 Na konci pøipojíme znak 0
169 #define ADD_TO_RESULT(dest, len, totlen, value) \
170 if ((totlen) < (len)) { dest[totlen] = value; } (totlen++);
171 #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len))
173 #define NEXT_CMP_VALUE(src, p, store, pass, value, len) \
174 while (1) \
176 if (IS_END(p, src, len)) \
178 /* when we are at the end of string */ \
179 /* return either 0 for end of string */ \
180 /* or 1 for end of pass */ \
181 value= 0; \
182 if (pass != 3) \
184 p= (pass++ == 0) ? store : src; \
185 value = 1; \
187 break; \
189 /* not at end of string */ \
190 value = CZ_SORT_TABLE[pass][*p]; \
191 if (value == 0) \
192 { p++; continue; } /* ignore value */ \
193 if (value == 2) /* space */ \
195 const uchar *tmp; \
196 const uchar *runner = ++p; \
197 while (!(IS_END(runner, src, len)) && (CZ_SORT_TABLE[pass][*runner] == 2)) \
198 runner++; /* skip all spaces */ \
199 if (IS_END(runner, src, len) && SKIP_TRAILING_SPACES) \
200 p = runner; \
201 if ((pass <= 2) && !(IS_END(runner, src, len))) \
202 p = runner; \
203 if (IS_END(p, src, len)) \
204 continue; \
205 /* we switch passes */ \
206 if (pass > 1) \
207 break; \
208 tmp = p; \
209 pass= 1-pass; \
210 p = store; store = tmp; \
211 break; \
213 if (value == 255) \
215 int i; \
216 for (i = 0; i < (int) sizeof(doubles); i++) \
218 const char * pattern = doubles[i].word; \
219 const char * q = (const char *) p; \
220 int j = 0; \
221 while (pattern[j]) \
223 if (IS_END(q, src, len) || (*q != pattern[j])) \
224 break; \
225 j++; q++; \
227 if (!(pattern[j])) \
229 value = (int)(doubles[i].outvalue[pass]); \
230 p= (const uchar *) q - 1; \
231 break; \
235 p++; \
236 break; \
240 Function strnncoll, actually strcoll, with Czech sorting, which expect
241 the length of the strings being specified
244 static int my_strnncoll_czech(CHARSET_INFO *cs __attribute__((unused)),
245 const uchar *s1, size_t len1,
246 const uchar *s2, size_t len2,
247 my_bool s2_is_prefix)
249 int v1, v2;
250 const uchar *p1, * p2, * store1, * store2;
251 int pass1 = 0, pass2 = 0;
253 if (s2_is_prefix && len1 > len2)
254 len1=len2;
256 p1 = s1; p2 = s2;
257 store1 = s1; store2 = s2;
261 int diff;
262 NEXT_CMP_VALUE(s1, p1, store1, pass1, v1, (int)len1);
263 NEXT_CMP_VALUE(s2, p2, store2, pass2, v2, (int)len2);
264 if ((diff = v1 - v2))
265 return diff;
267 while (v1);
268 return 0;
274 TODO: Fix this one to compare strings as they are done in ctype-simple1
277 static
278 int my_strnncollsp_czech(CHARSET_INFO * cs,
279 const uchar *s, size_t slen,
280 const uchar *t, size_t tlen,
281 my_bool diff_if_only_endspace_difference
282 __attribute__((unused)))
284 for ( ; slen && s[slen-1] == ' ' ; slen--);
285 for ( ; tlen && t[tlen-1] == ' ' ; tlen--);
286 return my_strnncoll_czech(cs,s,slen,t,tlen,0);
291 Function strnxfrm, actually strxfrm, with Czech sorting, which expect
292 the length of the strings being specified
295 static size_t my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)),
296 uchar *dest, size_t len,
297 const uchar *src, size_t srclen)
299 int value;
300 const uchar *p, * store;
301 int pass = 0;
302 size_t totlen = 0;
303 p = src; store = src;
307 NEXT_CMP_VALUE(src, p, store, pass, value, (int)srclen);
308 ADD_TO_RESULT(dest, len, totlen, value);
310 while (value);
311 if (len > totlen)
312 bfill(dest + totlen, len - totlen, ' ');
313 return len;
316 #undef IS_END
320 Neformální popis algoritmu:
322 procházíme øetìzec zleva doprava
323 konec øetìzce poznáme podle *p == 0
324 pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na
325 zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý
326 prùchod bì¾í souèasnì
327 konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1
329 naèteme hodnotu z tøídící tabulky
330 jde-li o hodnotu ignorovat (0), skoèíme na dal¹í prùchod
331 jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1,
332 pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme
333 prùchody
334 jde-li o kompozitní znak (255), otestujeme, zda následuje
335 správný do dvojice, dohledáme správnou hodnotu
337 na konci pøipojíme znak 0
342 ** Calculate min_str and max_str that ranges a LIKE string.
343 ** Arguments:
344 ** ptr Pointer to LIKE string.
345 ** ptr_length Length of LIKE string.
346 ** escape Escape character in LIKE. (Normally '\').
347 ** All escape characters should be removed from min_str and max_str
348 ** res_length Length of min_str and max_str.
349 ** min_str Smallest case sensitive string that ranges LIKE.
350 ** Should be space padded to res_length.
351 ** max_str Largest case sensitive string that ranges LIKE.
352 ** Normally padded with the biggest character sort value.
354 ** The function should return 0 if ok and 1 if the LIKE string can't be
355 ** optimized !
358 #ifdef REAL_MYSQL
360 #define min_sort_char ' '
361 #define max_sort_char '9'
363 #define EXAMPLE
365 static my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)),
366 const char *ptr,size_t ptr_length,
367 pbool escape, pbool w_one, pbool w_many,
368 size_t res_length, char *min_str,
369 char *max_str,
370 size_t *min_length,size_t *max_length)
372 #ifdef EXAMPLE
373 uchar value;
374 const char *end=ptr+ptr_length;
375 char *min_org=min_str;
376 char *min_end=min_str+res_length;
378 for (; ptr != end && min_str != min_end ; ptr++)
380 if (*ptr == w_one) /* '_' in SQL */
381 { break; }
382 if (*ptr == w_many) /* '%' in SQL */
383 { break; }
385 if (*ptr == escape && ptr+1 != end)
386 { ptr++; } /* Skip escape */
388 value = CZ_SORT_TABLE[0][(int) (uchar) *ptr];
390 if (value == 0) /* Ignore in the first pass */
391 { continue; }
392 if (value <= 2) /* End of pass or end of string */
393 { break; }
394 if (value == 255) /* Double char too compicated */
395 { break; }
397 *min_str++= *max_str++ = *ptr;
400 if (cs->state & MY_CS_BINSORT)
401 *min_length= (size_t) (min_str - min_org);
402 else
404 /* 'a\0\0... is the smallest possible string */
405 *min_length= res_length;
407 /* a\ff\ff... is the biggest possible string */
408 *max_length= res_length;
410 while (min_str != min_end)
412 *min_str++ = min_sort_char; /* Because of key compression */
413 *max_str++ = max_sort_char;
415 return 0;
416 #else
417 return 1;
418 #endif
421 #endif
423 #ifdef REAL_MYSQL
424 /* This is a latin2 file */
427 * File generated by cset
428 * (C) Abandoned 1997 Zarko Mocnik <zarko.mocnik@dem.si>
430 * definition table reworked by Jaromir Dolecek <dolecek@ics.muni.cz>
432 #include <my_global.h>
433 #include "m_string.h"
435 static uchar NEAR ctype_czech[257] = {
437 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32,
438 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
439 72, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
440 132,132,132,132,132,132,132,132,132,132, 16, 16, 16, 16, 16, 16,
441 16,129,129,129,129,129,129, 1, 1, 1, 1, 1, 1, 1, 1, 1,
442 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 16, 16, 16, 16, 16,
443 16,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, 2, 2,
444 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 16, 16, 16, 16, 32,
445 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, 32,
446 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 72,
447 1, 16, 1, 16, 1, 1, 16, 0, 0, 1, 1, 1, 1, 16, 1, 1,
448 16, 2, 16, 2, 16, 2, 2, 16, 16, 2, 2, 2, 2, 16, 2, 2,
449 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
450 16, 1, 1, 1, 1, 1, 1, 16, 1, 1, 1, 1, 1, 1, 1, 16,
451 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
452 2, 2, 2, 2, 2, 2, 2, 16, 2, 2, 2, 2, 2, 2, 2, 16,
455 static uchar NEAR to_lower_czech[] = {
456 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
457 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
458 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
459 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
460 64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
461 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95,
462 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
463 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
464 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
465 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
466 177,161,179,163,181,182,166,167,168,185,186,187,188,173,190,191,
467 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
468 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
469 208,241,242,243,244,245,246,215,248,249,250,251,252,253,254,223,
470 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
471 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
474 static uchar NEAR to_upper_czech[] = {
475 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
476 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
477 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
478 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
479 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
480 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
481 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
482 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
483 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
484 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
485 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
486 176,160,178,162,180,164,165,183,184,169,170,171,172,189,174,175,
487 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
488 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
489 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
490 240,209,210,211,212,213,214,247,216,217,218,219,220,221,222,255,
493 static uchar NEAR sort_order_czech[] = {
494 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
495 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
496 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
497 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
498 64, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100,
499 105,106,107,110,114,117,122,123,124,125,127,131,132,133,134,135,
500 136, 65, 71, 72, 76, 78, 83, 84, 85, 86, 90, 91, 92, 96, 97,100,
501 105,106,107,110,114,117,122,123,124,125,127,137,138,139,140, 0,
502 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
503 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,255,
504 66,255, 93,255, 94,111,255,255,255,112,113,115,128,255,129,130,
505 255, 66,255, 93,255, 94,111,255,255,112,113,115,128,255,129,130,
506 108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 87, 77,
507 255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255,
508 108, 67, 68, 69, 70, 95, 73, 75, 74, 79, 81, 82, 80, 89, 88, 77,
509 255, 98, 99,101,102,103,104,255,109,119,118,120,121,126,116,255,
512 static uint16 tab_8859_2_uni[256]={
513 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
514 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
515 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
516 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
517 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
518 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
519 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
520 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
521 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
522 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
523 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
524 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
525 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
526 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
527 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
528 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E, 0,
529 0, 0, 0, 0, 0, 0, 0, 0,
530 0, 0, 0, 0, 0, 0, 0, 0,
531 0, 0, 0, 0, 0, 0, 0, 0,
532 0, 0, 0, 0, 0, 0, 0, 0,
533 0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7,
534 0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B,
535 0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7,
536 0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C,
537 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
538 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
539 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
540 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
541 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
542 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
543 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
544 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9
548 /* 0000-00FD , 254 chars */
549 static uchar tab_uni_8859_2_plane00[]={
550 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
551 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
552 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
553 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
554 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
555 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
556 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
557 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x00,
558 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
559 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
560 0xA0,0x00,0x00,0x00,0xA4,0x00,0x00,0xA7,0xA8,0x00,0x00,0x00,0x00,0xAD,0x00,0x00,
561 0xB0,0x00,0x00,0x00,0xB4,0x00,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
562 0x00,0xC1,0xC2,0x00,0xC4,0x00,0x00,0xC7,0x00,0xC9,0x00,0xCB,0x00,0xCD,0xCE,0x00,
563 0x00,0x00,0x00,0xD3,0xD4,0x00,0xD6,0xD7,0x00,0x00,0xDA,0x00,0xDC,0xDD,0x00,0xDF,
564 0x00,0xE1,0xE2,0x00,0xE4,0x00,0x00,0xE7,0x00,0xE9,0x00,0xEB,0x00,0xED,0xEE,0x00,
565 0x00,0x00,0x00,0xF3,0xF4,0x00,0xF6,0xF7,0x00,0x00,0xFA,0x00,0xFC,0xFD};
567 /* 0102-017E , 125 chars */
568 static uchar tab_uni_8859_2_plane01[]={
569 0xC3,0xE3,0xA1,0xB1,0xC6,0xE6,0x00,0x00,0x00,0x00,0xC8,0xE8,0xCF,0xEF,0xD0,0xF0,
570 0x00,0x00,0x00,0x00,0x00,0x00,0xCA,0xEA,0xCC,0xEC,0x00,0x00,0x00,0x00,0x00,0x00,
571 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
572 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC5,0xE5,0x00,0x00,0xA5,0xB5,0x00,0x00,0xA3,
573 0xB3,0xD1,0xF1,0x00,0x00,0xD2,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD5,0xF5,
574 0x00,0x00,0xC0,0xE0,0x00,0x00,0xD8,0xF8,0xA6,0xB6,0x00,0x00,0xAA,0xBA,0xA9,0xB9,
575 0xDE,0xFE,0xAB,0xBB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xF9,0xDB,0xFB,
576 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xBC,0xAF,0xBF,0xAE,0xBE};
578 /* 02C7-02DD , 23 chars */
579 static uchar tab_uni_8859_2_plane02[]={
580 0xB7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
581 0x00,0xA2,0xFF,0x00,0xB2,0x00,0xBD};
583 static MY_UNI_IDX idx_uni_8859_2[]={
584 {0x0000,0x00FD,tab_uni_8859_2_plane00},
585 {0x0102,0x017E,tab_uni_8859_2_plane01},
586 {0x02C7,0x02DD,tab_uni_8859_2_plane02},
587 {0,0,NULL}
591 static MY_COLLATION_HANDLER my_collation_latin2_czech_ci_handler =
593 NULL, /* init */
594 my_strnncoll_czech,
595 my_strnncollsp_czech,
596 my_strnxfrm_czech,
597 my_strnxfrmlen_simple,
598 my_like_range_czech,
599 my_wildcmp_bin,
600 my_strcasecmp_8bit,
601 my_instr_simple,
602 my_hash_sort_simple,
603 my_propagate_simple
606 CHARSET_INFO my_charset_latin2_czech_ci =
608 2,0,0, /* number */
609 MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT, /* state */
610 "latin2", /* cs name */
611 "latin2_czech_cs", /* name */
612 "", /* comment */
613 NULL, /* tailoring */
614 ctype_czech,
615 to_lower_czech,
616 to_upper_czech,
617 sort_order_czech,
618 NULL, /* contractions */
619 NULL, /* sort_order_big*/
620 tab_8859_2_uni, /* tab_to_uni */
621 idx_uni_8859_2, /* tab_from_uni */
622 my_unicase_default, /* caseinfo */
623 NULL, /* state_map */
624 NULL, /* ident_map */
625 4, /* strxfrm_multiply */
626 1, /* caseup_multiply */
627 1, /* casedn_multiply */
628 1, /* mbminlen */
629 1, /* mbmaxlen */
630 0, /* min_sort_char */
631 0, /* max_sort_char */
632 ' ', /* pad char */
633 0, /* escape_with_backslash_is_dangerous */
634 &my_charset_8bit_handler,
635 &my_collation_latin2_czech_ci_handler
639 #endif
641 #endif