16 #include <my_global.h>
23 size_t my_caseup_str_mb(
const CHARSET_INFO *cs,
char *str)
26 register uchar *map= cs->to_upper;
32 if ((l= my_ismbchar(cs, str, str + cs->mbmaxlen)))
36 *str= (char) map[(uchar)*str];
40 return (
size_t) (str - str_orig);
44 size_t my_casedn_str_mb(
const CHARSET_INFO *cs,
char *str)
47 register uchar *map= cs->to_lower;
53 if ((l= my_ismbchar(cs, str, str + cs->mbmaxlen)))
57 *str= (char) map[(uchar)*str];
61 return (
size_t) (str - str_orig);
69 return cs->caseinfo ? ((p= cs->caseinfo->page[
page]) ? &p[offs] : NULL) : NULL;
76 size_t my_caseup_mb(
const CHARSET_INFO *cs,
char *src,
size_t srclen,
77 char *dst __attribute__((unused)),
78 size_t dstlen __attribute__((unused)))
81 register char *srcend= src + srclen;
82 register uchar *map= cs->to_upper;
84 DBUG_ASSERT(cs->caseup_multiply == 1);
85 DBUG_ASSERT(src == dst && srclen == dstlen);
86 DBUG_ASSERT(cs->mbmaxlen == 2);
90 if ((l=my_ismbchar(cs, src, srcend)))
93 if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
95 *src++= ch->toupper >> 8;
96 *src++= ch->toupper & 0xFF;
103 *src=(char) map[(uchar) *src];
111 size_t my_casedn_mb(
const CHARSET_INFO *cs,
char *src,
size_t srclen,
112 char *dst __attribute__((unused)),
113 size_t dstlen __attribute__((unused)))
116 register char *srcend= src + srclen;
117 register uchar *map=cs->to_lower;
119 DBUG_ASSERT(cs->casedn_multiply == 1);
120 DBUG_ASSERT(src == dst && srclen == dstlen);
121 DBUG_ASSERT(cs->mbmaxlen == 2);
125 if ((l= my_ismbchar(cs, src, srcend)))
128 if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
130 *src++= ch->tolower >> 8;
131 *src++= ch->tolower & 0xFF;
138 *src= (char) map[(uchar)*src];
157 char *src,
size_t srclen,
158 char *dst,
size_t dstlen __attribute__((unused)),
162 char *srcend= src + srclen, *dst0= dst;
164 DBUG_ASSERT(cs->mbmaxlen == 2);
168 size_t mblen= my_ismbchar(cs, src, srcend);
172 if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
174 int code= is_upper ? ch->toupper : ch->tolower;
188 *dst++= (char) map[(uchar) *src++];
191 return (
size_t) (dst - dst0);
196 my_casedn_mb_varlen(
const CHARSET_INFO *cs,
char *src,
size_t srclen,
197 char *dst,
size_t dstlen)
199 DBUG_ASSERT(dstlen >= srclen * cs->casedn_multiply);
200 DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
201 return my_casefold_mb_varlen(cs, src, srclen, dst, dstlen, cs->to_lower, 0);
206 my_caseup_mb_varlen(
const CHARSET_INFO *cs,
char *src,
size_t srclen,
207 char *dst,
size_t dstlen)
209 DBUG_ASSERT(dstlen >= srclen * cs->caseup_multiply);
210 DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
211 return my_casefold_mb_varlen(cs, src, srclen, dst, dstlen, cs->to_upper, 1);
219 int my_strcasecmp_mb(
const CHARSET_INFO *cs,
const char *s,
const char *t)
222 register uchar *map=cs->to_upper;
227 if ((l=my_ismbchar(cs, s, s + cs->mbmaxlen)))
233 else if (my_mbcharlen(cs, *t) > 1)
235 else if (map[(uchar) *s++] != map[(uchar) *t++])
250 #define INC_PTR(cs,A,B) A+=(my_ismbchar(cs,A,B) ? my_ismbchar(cs,A,B) : 1)
252 #define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)]
256 const char *str,
const char *str_end,
257 const char *wildstr,
const char *wildend,
258 int escape,
int w_one,
int w_many,
int recurse_level)
262 if (my_string_stack_guard && my_string_stack_guard(recurse_level))
264 while (wildstr != wildend)
266 while (*wildstr != w_many && *wildstr != w_one)
269 if (*wildstr == escape && wildstr+1 != wildend)
271 if ((l = my_ismbchar(cs, wildstr, wildend)))
273 if (str+l > str_end || memcmp(str, wildstr, l) != 0)
279 if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++))
281 if (wildstr == wildend)
282 return (str != str_end);
285 if (*wildstr == w_one)
291 INC_PTR(cs,str,str_end);
292 }
while (++wildstr < wildend && *wildstr == w_one);
293 if (wildstr == wildend)
296 if (*wildstr == w_many)
299 const char* mb = wildstr;
304 for (; wildstr != wildend ; wildstr++)
306 if (*wildstr == w_many)
308 if (*wildstr == w_one)
312 INC_PTR(cs,str,str_end);
317 if (wildstr == wildend)
322 if ((cmp= *wildstr) == escape && wildstr+1 != wildend)
326 mb_len= my_ismbchar(cs, wildstr, wildend);
327 INC_PTR(cs,wildstr,wildend);
328 cmp=likeconv(cs,cmp);
337 if (str+mb_len <= str_end && memcmp(str, mb, mb_len) == 0)
343 else if (!my_ismbchar(cs, str, str_end) &&
344 likeconv(cs,*str) == cmp)
349 INC_PTR(cs,str, str_end);
352 int tmp=my_wildcmp_mb_impl(cs,str,str_end,
353 wildstr,wildend,escape,w_one,
354 w_many, recurse_level + 1);
358 }
while (str != str_end && wildstr[0] != w_many);
362 return (str != str_end ? 1 : 0);
366 const char *str,
const char *str_end,
367 const char *wildstr,
const char *wildend,
368 int escape,
int w_one,
int w_many)
370 return my_wildcmp_mb_impl(cs, str, str_end,
372 escape, w_one, w_many, 1);
376 size_t my_numchars_mb(
const CHARSET_INFO *cs __attribute__((unused)),
377 const char *pos,
const char *end)
379 register size_t count= 0;
383 pos+= (mb_len= my_ismbchar(cs,pos,end)) ? mb_len : 1;
390 size_t my_charpos_mb(
const CHARSET_INFO *cs __attribute__((unused)),
391 const char *pos,
const char *end,
size_t length)
393 const char *start= pos;
395 while (length && pos < end)
398 pos+= (mb_len= my_ismbchar(cs, pos, end)) ? mb_len : 1;
401 return (
size_t) (length ? end+2-start : pos-start);
405 size_t my_well_formed_len_mb(
const CHARSET_INFO *cs,
const char *b,
406 const char *e,
size_t pos,
int *error)
408 const char *b_start= b;
415 if ((mb_len= cs->cset->mb_wc(cs, &wc, (uchar*) b, (uchar*) e)) <= 0)
417 *error= b < e ? 1 : 0;
423 return (
size_t) (b - b_start);
428 const char *b,
size_t b_length,
429 const char *s,
size_t s_length,
432 register const char *end, *b0;
435 if (s_length <= b_length)
449 end= b+b_length-s_length+1;
455 if (!cs->coll->strnncoll(cs, (uchar*) b, s_length,
456 (uchar*) s, s_length, 0))
461 match[0].end= (size_t) (b-b0);
462 match[0].mb_len= res;
465 match[1].beg= match[0].end;
466 match[1].end= match[0].end+s_length;
472 mb_len= (mb_len= my_ismbchar(cs, b, end)) ? mb_len : 1;
485 my_strnncoll_mb_bin(
const CHARSET_INFO *cs __attribute__((unused)),
486 const uchar *s,
size_t slen,
487 const uchar *t,
size_t tlen,
490 size_t len= MY_MIN(slen,tlen);
491 int cmp= memcmp(s,t,len);
492 return cmp ? cmp : (int) ((t_is_prefix ? len : slen) - tlen);
522 my_strnncollsp_mb_bin(
const CHARSET_INFO *cs __attribute__((unused)),
523 const uchar *a,
size_t a_length,
524 const uchar *b,
size_t b_length,
525 my_bool diff_if_only_endspace_difference)
531 #ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
532 diff_if_only_endspace_difference= 0;
535 end= a + (length= MY_MIN(a_length, b_length));
539 return ((
int) a[-1] - (int) b[-1]);
542 if (a_length != b_length)
545 if (diff_if_only_endspace_difference)
551 if (a_length < b_length)
559 for (end= a + a_length-length; a < end ; a++)
562 return (*a <
' ') ? -swap : swap;
577 #define my_strnxfrm_mb_non_ascii_char(cs, dst, src, se) \
579 switch (cs->cset->ismbchar(cs, (const char*) src, (const char*) se)) { \
602 uchar *dst,
size_t dstlen, uint nweights,
603 const uchar *src,
size_t srclen, uint
flags)
606 uchar *de= dst + dstlen;
607 const uchar *se= src + srclen;
608 const uchar *sort_order= cs->sort_order;
610 DBUG_ASSERT(cs->mbmaxlen <= 4);
617 if (dstlen >= srclen && nweights >= srclen)
622 for (; src < se; nweights--)
625 *dst++= sort_order[*src++];
627 my_strnxfrm_mb_non_ascii_char(cs, dst, src, se);
633 for (; src < se; nweights--)
638 my_strnxfrm_mb_non_ascii_char(cs, dst, src, se);
648 for (; src < se && nweights && dst < de; nweights--)
652 !(chlen= cs->cset->ismbchar(cs, (
const char*) src, (
const char*) se)))
655 *dst++= sort_order ? sort_order[*src++] : *src++;
660 int len= (dst + chlen <= de) ? chlen : de - dst;
661 memcpy(dst, src, len);
668 return my_strxfrm_pad_desc_and_reverse(cs, d0, dst, de, nweights, flags, 0);
673 my_strcasecmp_mb_bin(
const CHARSET_INFO *cs __attribute__((unused)),
674 const char *s,
const char *t)
681 my_hash_sort_mb_bin(
const CHARSET_INFO *cs __attribute__((unused)),
682 const uchar *key,
size_t len,ulong *nr1, ulong *nr2)
684 const uchar *pos = key;
690 key= skip_trailing_space(key, len);
692 for (; pos < (uchar*) key ; pos++)
694 nr1[0]^=(ulong) ((((uint) nr1[0] & 63)+nr2[0]) *
695 ((uint)*pos)) + (nr1[0] << 8);
719 static void pad_max_char(
const CHARSET_INFO *cs,
char *str,
char *end)
724 if (!(cs->state & MY_CS_UNICODE))
726 if (cs->max_sort_char <= 255)
728 memset(str, cs->max_sort_char, end - str);
731 buf[0]= cs->max_sort_char >> 8;
732 buf[1]= cs->max_sort_char & 0xFF;
737 buflen= cs->cset->wc_mb(cs, cs->max_sort_char, (uchar*) buf,
738 (uchar*) buf +
sizeof(buf));
741 DBUG_ASSERT(buflen > 0);
744 if ((str + buflen) <= end)
747 memcpy(str, buf, buflen);
779 const char *ptr,
size_t ptr_length,
780 pbool escape, pbool w_one, pbool w_many,
782 char *min_str,
char *max_str,
783 size_t *min_length,
size_t *max_length)
786 const char *end= ptr + ptr_length;
787 char *min_org= min_str;
788 char *min_end= min_str + res_length;
789 char *max_end= max_str + res_length;
790 size_t maxcharlen= res_length / cs->mbmaxlen;
791 const MY_CONTRACTIONS *contractions= my_charset_get_contractions(cs, 0);
793 for (; ptr != end && min_str != min_end && maxcharlen ; maxcharlen--)
796 if (*ptr == escape && ptr+1 != end)
798 else if (*ptr == w_one || *ptr == w_many)
806 *min_length= ((cs->state & MY_CS_BINSORT) ? (
size_t) (min_str - min_org) :
808 *max_length= res_length;
812 *min_str++= (char) cs->min_sort_char;
813 }
while (min_str != min_end);
820 *max_length= res_length;
821 pad_max_char(cs, max_str, max_end);
824 if ((mb_len= my_ismbchar(cs, ptr, end)) > 1)
826 if (ptr+mb_len > end || min_str+mb_len > min_end)
829 *min_str++= *max_str++= *ptr++;
859 if (contractions && ptr + 1 < end &&
860 my_uca_can_be_contraction_head(contractions, (uchar) *ptr))
864 if (ptr[1] == w_one || ptr[1] == w_many)
867 goto fill_max_and_min;
882 if (my_uca_can_be_contraction_tail(contractions, (uchar) ptr[1]) &&
883 my_uca_contraction2_weight(contractions, (uchar) ptr[0], ptr[1]))
886 if (maxcharlen == 1 || min_str + 1 >= min_end)
889 goto fill_max_and_min;
893 *min_str++= *max_str++= *ptr++;
898 *min_str++= *max_str++= *ptr++;
902 *min_length= *max_length = (size_t) (min_str - min_org);
903 while (min_str != min_end)
904 *min_str++= *max_str++=
' ';
935 const char *ptr,
size_t ptr_length,
936 pbool escape, pbool w_one, pbool w_many,
938 char *min_str,
char *max_str,
939 size_t *min_length,
size_t *max_length)
941 const char *end= ptr + ptr_length;
942 const char *min_org= min_str;
943 const char *max_org= max_str;
944 char *min_end= min_str + res_length;
945 char *max_end= max_str + res_length;
946 size_t charlen= res_length / cs->mbmaxlen;
947 size_t res_length_diff;
948 const MY_CONTRACTIONS *contractions= my_charset_get_contractions(cs, 0);
950 for ( ; charlen > 0; charlen--)
954 if ((res= cs->cset->mb_wc(cs, &wc, (uchar*) ptr, (uchar*) end)) <= 0)
956 if (res == MY_CS_ILSEQ)
962 if (wc == (my_wc_t) escape)
964 if ((res= cs->cset->mb_wc(cs, &wc, (uchar*) ptr, (uchar*) end)) <= 0)
966 if (res == MY_CS_ILSEQ)
978 if ((res= cs->cset->wc_mb(cs, wc,
979 (uchar*) min_str, (uchar*) min_end)) <= 0)
980 goto pad_set_lengths;
983 if ((res= cs->cset->wc_mb(cs, wc,
984 (uchar*) max_str, (uchar*) max_end)) <= 0)
985 goto pad_set_lengths;
989 else if (wc == (my_wc_t) w_one)
991 if ((res= cs->cset->wc_mb(cs, cs->min_sort_char,
992 (uchar*) min_str, (uchar*) min_end)) <= 0)
993 goto pad_set_lengths;
996 if ((res= cs->cset->wc_mb(cs, cs->max_sort_char,
997 (uchar*) max_str, (uchar*) max_end)) <= 0)
998 goto pad_set_lengths;
1002 else if (wc == (my_wc_t) w_many)
1009 *min_length= ((cs->state & MY_CS_BINSORT) ?
1010 (
size_t) (min_str - min_org) :
1012 *max_length= res_length;
1017 my_uca_can_be_contraction_head(contractions, wc) &&
1018 (res= cs->cset->mb_wc(cs, &wc2, (uchar*) ptr, (uchar*) end)) > 0)
1021 if ((wc2 == (my_wc_t) w_one || wc2 == (my_wc_t) w_many))
1024 *min_length= *max_length= res_length;
1028 if (my_uca_can_be_contraction_tail(contractions, wc2) &&
1029 (weight= my_uca_contraction2_weight(contractions, wc, wc2)) && weight[0])
1035 *min_length= *max_length= res_length;
1043 if ((res= cs->cset->wc_mb(cs, wc,
1044 (uchar*) min_str, (uchar*) min_end)) <= 0)
1045 goto pad_set_lengths;
1048 if ((res= cs->cset->wc_mb(cs, wc,
1049 (uchar*) max_str, (uchar*) max_end)) <= 0)
1050 goto pad_set_lengths;
1057 if ((res= cs->cset->wc_mb(cs, wc,
1058 (uchar*) min_str, (uchar*) min_end)) <= 0)
1059 goto pad_set_lengths;
1061 if ((res= cs->cset->wc_mb(cs, wc,
1062 (uchar*) max_str, (uchar*) max_end)) <= 0)
1063 goto pad_set_lengths;
1068 *min_length= (size_t) (min_str - min_org);
1069 *max_length= (size_t) (max_str - max_org);
1078 res_length_diff= res_length % cs->mbminlen;
1079 cs->cset->fill(cs, min_str, min_end - min_str - res_length_diff,
1081 cs->cset->fill(cs, max_str, max_end - max_str - res_length_diff,
1085 if (res_length_diff)
1088 memset(min_end - res_length_diff, 0, res_length_diff);
1089 memset(max_end - res_length_diff, 0, res_length_diff);
1098 const char *str,
const char *str_end,
1099 const char *wildstr,
const char *wildend,
1100 int escape,
int w_one,
int w_many,
int recurse_level)
1104 if (my_string_stack_guard && my_string_stack_guard(recurse_level))
1106 while (wildstr != wildend)
1108 while (*wildstr != w_many && *wildstr != w_one)
1111 if (*wildstr == escape && wildstr+1 != wildend)
1113 if ((l = my_ismbchar(cs, wildstr, wildend)))
1115 if (str+l > str_end || memcmp(str, wildstr, l) != 0)
1121 if (str == str_end || *wildstr++ != *str++)
1123 if (wildstr == wildend)
1124 return (str != str_end);
1127 if (*wildstr == w_one)
1133 INC_PTR(cs,str,str_end);
1134 }
while (++wildstr < wildend && *wildstr == w_one);
1135 if (wildstr == wildend)
1138 if (*wildstr == w_many)
1141 const char* mb = wildstr;
1146 for (; wildstr != wildend ; wildstr++)
1148 if (*wildstr == w_many)
1150 if (*wildstr == w_one)
1154 INC_PTR(cs,str,str_end);
1159 if (wildstr == wildend)
1164 if ((cmp= *wildstr) == escape && wildstr+1 != wildend)
1168 mb_len= my_ismbchar(cs, wildstr, wildend);
1169 INC_PTR(cs,wildstr,wildend);
1178 if (str+mb_len <= str_end && memcmp(str, mb, mb_len) == 0)
1184 else if (!my_ismbchar(cs, str, str_end) && *str == cmp)
1189 INC_PTR(cs,str, str_end);
1192 int tmp=my_wildcmp_mb_bin_impl(cs,str,str_end,
1193 wildstr,wildend,escape,
1194 w_one,w_many, recurse_level + 1);
1198 }
while (str != str_end && wildstr[0] != w_many);
1202 return (str != str_end ? 1 : 0);
1207 const char *str,
const char *str_end,
1208 const char *wildstr,
const char *wildend,
1209 int escape,
int w_one,
int w_many)
1211 return my_wildcmp_mb_bin_impl(cs, str, str_end,
1213 escape, w_one, w_many, 1);
1221 static char pg11[256]=
1223 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1224 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1225 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,
1226 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1227 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1228 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1229 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1230 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1233 static char pg23[256]=
1235 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1236 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1237 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1238 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1239 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1240 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1241 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1242 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1245 static char pg2E[256]=
1247 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1248 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1249 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1250 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1251 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
1252 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1253 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1254 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0
1257 static char pg2F[256]=
1259 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1260 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1261 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1262 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1263 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1264 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1265 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
1266 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0
1269 static char pg30[256]=
1271 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1272 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1273 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1274 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1275 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,
1276 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1277 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1278 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1281 static char pg31[256]=
1283 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1284 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1285 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1286 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1287 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1288 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
1289 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1290 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
1293 static char pg32[256]=
1295 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1296 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1297 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1298 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,
1299 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1300 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1301 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1302 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
1305 static char pg4D[256]=
1307 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1308 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1309 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1310 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1311 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1312 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
1313 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1314 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1317 static char pg9F[256]=
1319 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1320 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1321 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1322 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1323 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1324 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1325 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1326 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1329 static char pgA4[256]=
1331 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1332 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1333 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1334 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1335 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1336 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1337 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1338 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1341 static char pgD7[256]=
1343 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1344 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1345 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1346 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1347 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1348 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1349 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1350 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1353 static char pgFA[256]=
1355 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1356 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1357 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1358 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1359 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1360 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1361 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1362 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1365 static char pgFE[256]=
1367 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1368 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1369 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,
1370 1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1371 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1372 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1373 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1374 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1377 static char pgFF[256]=
1379 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1380 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1381 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1382 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1383 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1384 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1385 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1386 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1389 static struct {
int page;
char *p;} utr11_data[256]=
1391 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1392 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1393 {0,NULL},{0,pg11},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1394 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1395 {0,NULL},{0,NULL},{0,NULL},{0,pg23},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1396 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,pg2E},{0,pg2F},
1397 {0,pg30},{0,pg31},{0,pg32},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1398 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1399 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1400 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{0,pg4D},{1,NULL},{1,NULL},
1401 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1402 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1403 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1404 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1405 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1406 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1407 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1408 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1409 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1410 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{0,pg9F},
1411 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{0,pgA4},{0,NULL},{0,NULL},{0,NULL},
1412 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1413 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1414 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1415 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1416 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},
1417 {1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{1,NULL},{0,pgD7},
1418 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1419 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1420 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1421 {0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},{0,NULL},
1422 {0,NULL},{1,NULL},{0,pgFA},{0,NULL},{0,NULL},{0,NULL},{0,pgFE},{0,pgFF}
1426 size_t my_numcells_mb(
const CHARSET_INFO *cs,
const char *b,
const char *e)
1435 if ((mb_len= cs->cset->mb_wc(cs, &wc, (uchar*) b, (uchar*) e)) <= 0 ||
1449 if (wc >= 0x20000 && wc <= 0x3FFFD)
1454 pg= (wc >> 8) & 0xFF;
1455 clen+= utr11_data[pg].p ? utr11_data[pg].p[wc & 0xFF] : utr11_data[pg].page;
1464 const uchar *s,
const uchar *e)
1467 int res= cs->cset->mb_wc(cs, &wc, s, e);
1468 if (res <= 0 || wc > 0xFFFF)
1471 *ctype= my_uni_ctype[wc>>8].ctype ?
1472 my_uni_ctype[wc>>8].ctype[wc&0xFF] :
1473 my_uni_ctype[wc>>8].pctype;
1481 my_strnncoll_mb_bin,
1482 my_strnncollsp_mb_bin,
1484 my_strnxfrmlen_simple,
1487 my_strcasecmp_mb_bin,
1489 my_hash_sort_mb_bin,