diff options
author | unknown <monty@mysql.com> | 2004-02-16 10:31:05 +0200 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-02-16 10:31:05 +0200 |
commit | cad7f2a155c26fe2477a104284a4db59470ae694 (patch) | |
tree | e792af64f95eba198633387e3b36f50f096c3001 /strings | |
parent | 571c901008730a10013d7e1ac84534e7d83914bc (diff) | |
parent | ebac2d25bcdcc74bf153a6a3568bfde5f1b17a8b (diff) | |
download | mariadb-git-cad7f2a155c26fe2477a104284a4db59470ae694.tar.gz |
Merge with public tree
client/mysqldump.c:
Auto merged
configure.in:
Auto merged
include/m_ctype.h:
Auto merged
include/m_string.h:
Auto merged
include/my_global.h:
Auto merged
mysql-test/r/ctype_utf8.result:
Auto merged
mysql-test/r/fulltext.result:
Auto merged
mysql-test/r/subselect.result:
Auto merged
mysql-test/t/fulltext.test:
Auto merged
mysql-test/t/grant.test:
Auto merged
mysql-test/t/subselect.test:
Auto merged
mysql-test/t/union.test:
Auto merged
sql/field.cc:
Auto merged
sql/field.h:
Auto merged
sql/item.cc:
Auto merged
sql/item_func.cc:
Auto merged
sql/item_strfunc.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/set_var.cc:
Auto merged
sql/sql_acl.cc:
Auto merged
sql/sql_class.h:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/share/english/errmsg.txt:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_show.cc:
Auto merged
sql/sql_string.cc:
Auto merged
sql/sql_table.cc:
Auto merged
sql/sql_yacc.yy:
Auto merged
strings/ctype-mb.c:
Auto merged
strings/ctype-simple.c:
Auto merged
mysql-test/r/warnings.result:
Fix error numbers after merge
sql/share/czech/errmsg.txt:
Add missing ',' and fix typo
sql/share/danish/errmsg.txt:
Add missing ',' and fix typo
sql/share/dutch/errmsg.txt:
Add missing ',' and fix typo
sql/share/estonian/errmsg.txt:
Add missing ',' and fix typo
sql/share/french/errmsg.txt:
Add missing ',' and fix typo
sql/share/german/errmsg.txt:
Add missing ',' and fix typo
sql/share/greek/errmsg.txt:
Add missing ',' and fix typo
sql/share/hungarian/errmsg.txt:
Add missing ',' and fix typo
sql/share/italian/errmsg.txt:
Add missing ',' and fix typo
sql/share/japanese/errmsg.txt:
Add missing ',' and fix typo
sql/share/korean/errmsg.txt:
Add missing ',' and fix typo
sql/share/norwegian-ny/errmsg.txt:
Add missing ',' and fix typo
sql/share/norwegian/errmsg.txt:
Add missing ',' and fix typo
sql/share/polish/errmsg.txt:
Add missing ',' and fix typo
sql/share/portuguese/errmsg.txt:
Add missing ',' and fix typo
sql/share/romanian/errmsg.txt:
Add missing ',' and fix typo
sql/share/russian/errmsg.txt:
Add missing ',' and fix typo
sql/share/slovak/errmsg.txt:
Add missing ',' and fix typo
sql/share/spanish/errmsg.txt:
Add missing ',' and fix typo
sql/share/swedish/errmsg.txt:
Add missing ',' and fix typo
sql/share/ukrainian/errmsg.txt:
Add missing ',' and fix typo
Diffstat (limited to 'strings')
-rw-r--r-- | strings/ctype-big5.c | 12 | ||||
-rw-r--r-- | strings/ctype-bin.c | 154 | ||||
-rw-r--r-- | strings/ctype-czech.c | 13 | ||||
-rw-r--r-- | strings/ctype-gbk.c | 6 | ||||
-rw-r--r-- | strings/ctype-latin1.c | 4 | ||||
-rw-r--r-- | strings/ctype-mb.c | 10 | ||||
-rw-r--r-- | strings/ctype-simple.c | 65 | ||||
-rw-r--r-- | strings/ctype-sjis.c | 12 | ||||
-rw-r--r-- | strings/ctype-tis620.c | 224 | ||||
-rw-r--r-- | strings/ctype-utf8.c | 4 | ||||
-rw-r--r-- | strings/ctype-win1250ch.c | 254 | ||||
-rw-r--r-- | strings/strto.c | 2 |
12 files changed, 337 insertions, 423 deletions
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 574156a99ed..1b0a235ed57 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -247,8 +247,8 @@ int my_strnncollsp_big5(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_big5(cs,s,slen,t,tlen); } @@ -343,10 +343,10 @@ static int my_strxfrm_big5(uchar * dest, const uchar * src, int len) #define max_sort_char ((char) 255) static my_bool my_like_range_big5(CHARSET_INFO *cs __attribute__((unused)), - const char *ptr,uint ptr_length, - int escape, int w_one, int w_many, - uint res_length, char *min_str,char *max_str, - uint *min_length,uint *max_length) + const char *ptr,uint ptr_length, + pbool escape, pbool w_one, pbool w_many, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) { const char *end=ptr+ptr_length; char *min_org=min_str; diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index fc22938d46e..35382b05c88 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -67,6 +67,28 @@ static uchar bin_char_array[] = }; + +/* + Compare two strings. Result is sign(first_argument - second_argument) + + SYNOPSIS + my_strnncoll_binary() + cs Chararacter set + s String to compare + slen Length of 's' + t String to compare + tlen Length of 't' + + NOTE + This is used also when comparing with end space removal, as end space + is significant for binary strings + + RETURN + < 0 s < t + 0 s == t + > 0 s > t +*/ + static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)), const uchar *s, uint slen, const uchar *t, uint tlen) @@ -75,59 +97,39 @@ static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)), return cmp ? cmp : (int) (slen - tlen); } -static int my_strnncollsp_binary(CHARSET_INFO * cs, - const uchar *s, uint slen, - const uchar *t, uint tlen) -{ - int len, cmp; - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); +/* This function is used for all conversion functions */ - len = ( slen > tlen ) ? tlen : slen; - - cmp= memcmp(s,t,len); - return cmp ? cmp : (int) (slen - tlen); -} - -static void my_caseup_str_bin(CHARSET_INFO *cs __attribute__((unused)), - char *str __attribute__((unused))) +static void my_case_str_bin(CHARSET_INFO *cs __attribute__((unused)), + char *str __attribute__((unused))) { } -static void my_casedn_str_bin(CHARSET_INFO * cs __attribute__((unused)), - char *str __attribute__((unused))) +static void my_case_bin(CHARSET_INFO *cs __attribute__((unused)), + char *str __attribute__((unused)), + uint length __attribute__((unused))) { } -static void my_caseup_bin(CHARSET_INFO * cs __attribute__((unused)), - char *str __attribute__((unused)), - uint length __attribute__((unused))) -{ -} - -static void my_casedn_bin(CHARSET_INFO * cs __attribute__((unused)), - char *str __attribute__((unused)), - uint length __attribute__((unused))) -{ -} static int my_strcasecmp_bin(CHARSET_INFO * cs __attribute__((unused)), - const char *s, const char *t) + const char *s, const char *t) { return strcmp(s,t); } + int my_mbcharlen_8bit(CHARSET_INFO *cs __attribute__((unused)), - uint c __attribute__((unused))) + uint c __attribute__((unused))) { return 1; } + static int my_mb_wc_bin(CHARSET_INFO *cs __attribute__((unused)), - my_wc_t *wc, - const unsigned char *str, - const unsigned char *end __attribute__((unused))) + my_wc_t *wc, + const unsigned char *str, + const unsigned char *end __attribute__((unused))) { if (str >= end) return MY_CS_TOOFEW(0); @@ -136,10 +138,11 @@ static int my_mb_wc_bin(CHARSET_INFO *cs __attribute__((unused)), return 1; } + static int my_wc_mb_bin(CHARSET_INFO *cs __attribute__((unused)), - my_wc_t wc, - unsigned char *s, - unsigned char *e __attribute__((unused))) + my_wc_t wc, + unsigned char *s, + unsigned char *e __attribute__((unused))) { if (s >= e) return MY_CS_TOOSMALL; @@ -169,12 +172,21 @@ void my_hash_sort_bin(CHARSET_INFO *cs __attribute__((unused)), } +/* + The following defines is here to keep the following code identical to + the one in ctype-simple.c +*/ + +#define likeconv(s,A) (A) +#define INC_PTR(cs,A,B) (A)++ + + static int my_wildcmp_bin(CHARSET_INFO *cs, const char *str,const char *str_end, const char *wildstr,const char *wildend, int escape, int w_one, int w_many) { - int result= -1; /* Not found, using wildcards */ + int result= -1; /* Not found, using wildcards */ while (wildstr != wildend) { @@ -182,31 +194,26 @@ static int my_wildcmp_bin(CHARSET_INFO *cs, { if (*wildstr == escape && wildstr+1 != wildend) wildstr++; - if (str == str_end || *wildstr++ != *str++) - { - return(1); - } + if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++)) + return(1); /* No match */ if (wildstr == wildend) - { - return(str != str_end); /* Match if both are at end */ - } - result=1; /* Found an anchor char */ + return(str != str_end); /* Match if both are at end */ + result=1; /* Found an anchor char */ } if (*wildstr == w_one) { do { - if (str == str_end) /* Skip one char if possible */ + if (str == str_end) /* Skip one char if possible */ return(result); - str++; - } while (*++wildstr == w_one && wildstr != wildend); + INC_PTR(cs,str,str_end); + } while (++wildstr < wildend && *wildstr == w_one); if (wildstr == wildend) break; } if (*wildstr == w_many) - { /* Found w_many */ - char cmp; - + { /* Found w_many */ + uchar cmp; wildstr++; /* Remove any '%' and '_' from the wild search string */ for (; wildstr != wildend ; wildstr++) @@ -216,40 +223,33 @@ static int my_wildcmp_bin(CHARSET_INFO *cs, if (*wildstr == w_one) { if (str == str_end) - { return(-1); - } - str++; + INC_PTR(cs,str,str_end); continue; } - break; /* Not a wild character */ + break; /* Not a wild character */ } if (wildstr == wildend) - { - return(0); /* Ok if w_many is last */ - } + return(0); /* match if w_many is last */ if (str == str_end) - { return(-1); - } if ((cmp= *wildstr) == escape && wildstr+1 != wildend) cmp= *++wildstr; - wildstr++; /* This is compared trough cmp */ + + INC_PTR(cs,wildstr,wildend); /* This is compared through cmp */ + cmp=likeconv(cs,cmp); do { - while (str != str_end && *str != cmp) + while (str != str_end && (uchar) likeconv(cs,*str) != cmp) str++; if (str++ == str_end) - { return(-1); - } { - int tmp=my_wildcmp_bin(cs,str,str_end,wildstr,wildend,escape,w_one,w_many); + int tmp=my_wildcmp_bin(cs,str,str_end,wildstr,wildend,escape,w_one, + w_many); if (tmp <= 0) - { return(tmp); - } } } while (str != str_end && wildstr[0] != w_many); return(-1); @@ -258,6 +258,7 @@ static int my_wildcmp_bin(CHARSET_INFO *cs, return(str != str_end ? 1 : 0); } + static int my_strnxfrm_bin(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar *src, @@ -268,11 +269,12 @@ static int my_strnxfrm_bin(CHARSET_INFO *cs __attribute__((unused)), return len; } + static uint my_instr_bin(CHARSET_INFO *cs __attribute__((unused)), - const char *b, uint b_length, - const char *s, uint s_length, - my_match_t *match, uint nmatch) + const char *b, uint b_length, + const char *s, uint s_length, + my_match_t *match, uint nmatch) { register const uchar *str, *search, *end, *search_end; @@ -332,7 +334,7 @@ skip: MY_COLLATION_HANDLER my_collation_8bit_bin_handler = { my_strnncoll_binary, - my_strnncollsp_binary, + my_strnncoll_binary, my_strnxfrm_bin, my_like_range_simple, my_wildcmp_bin, @@ -341,6 +343,7 @@ MY_COLLATION_HANDLER my_collation_8bit_bin_handler = my_hash_sort_bin }; + static MY_CHARSET_HANDLER my_charset_handler= { NULL, /* ismbchar */ @@ -351,10 +354,10 @@ static MY_CHARSET_HANDLER my_charset_handler= my_lengthsp_8bit, my_mb_wc_bin, my_wc_mb_bin, - my_caseup_str_bin, - my_casedn_str_bin, - my_caseup_bin, - my_casedn_bin, + my_case_str_bin, + my_case_str_bin, + my_case_bin, + my_case_bin, my_snprintf_8bit, my_long10_to_str_8bit, my_longlong10_to_str_8bit, @@ -367,6 +370,7 @@ static MY_CHARSET_HANDLER my_charset_handler= my_scan_8bit }; + CHARSET_INFO my_charset_bin = { 63,0,0, /* number */ diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 1a07a5eba7e..8aea7358a9c 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -379,10 +379,11 @@ static int my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), #define EXAMPLE static my_bool my_like_range_czech(CHARSET_INFO *cs __attribute__((unused)), - const char *ptr,uint ptr_length, - int escape, int w_one, int w_many, - uint res_length, char *min_str,char *max_str, - uint *min_length,uint *max_length) + const char *ptr,uint ptr_length, + pbool escape, pbool w_one, pbool w_many, + uint res_length, char *min_str, + char *max_str, + uint *min_length,uint *max_length) { #ifdef EXAMPLE uchar value; @@ -599,8 +600,8 @@ int my_strnncollsp_czech(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_czech(cs,s,slen,t,tlen); } diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index 9e71a18e531..2ebf145f840 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -2613,8 +2613,8 @@ int my_strnncollsp_gbk(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_gbk(cs,s,slen,t,tlen); } @@ -2663,7 +2663,7 @@ static int my_strnxfrm_gbk(CHARSET_INFO *cs __attribute__((unused)), static my_bool my_like_range_gbk(CHARSET_INFO *cs __attribute__((unused)), const char *ptr,uint ptr_length, - int escape, int w_one, int w_many, + pbool escape, pbool w_one, pbool w_many, uint res_length, char *min_str,char *max_str, uint *min_length,uint *max_length) { diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index 933737b5f61..00d49f40ee4 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -360,8 +360,8 @@ static int my_strnncollsp_latin1_de(CHARSET_INFO *cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_latin1_de(cs,s,slen,t,tlen); } diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 46f3e2f4fc3..b35162c8fb6 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -357,14 +357,14 @@ static int my_strnncoll_mb_bin(CHARSET_INFO * cs __attribute__((unused)), return cmp ? cmp : (int) (slen - tlen); } -static int my_strnncollsp_mb_bin(CHARSET_INFO * cs, - const uchar *s, uint slen, - const uchar *t, uint tlen) +static int my_strnncollsp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), + const uchar *s, uint slen, + const uchar *t, uint tlen) { int len, cmp; - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); len = ( slen > tlen ) ? tlen : slen; diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index e4435d1222d..baefe17c32f 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -66,8 +66,8 @@ int my_strnncollsp_simple(CHARSET_INFO * cs, const uchar *s, uint slen, uchar *map= cs->sort_order; int len; - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); len = ( slen > tlen ) ? tlen : slen; @@ -186,9 +186,9 @@ void my_hash_sort_simple(CHARSET_INFO *cs, } -long my_strntol_8bit(CHARSET_INFO *cs, - const char *nptr, uint l, int base, - char **endptr, int *err) +long my_strntol_8bit(CHARSET_INFO *cs, + const char *nptr, uint l, int base, + char **endptr, int *err) { int negative; register ulong cutoff; @@ -309,9 +309,9 @@ noconv: } -ulong my_strntoul_8bit(CHARSET_INFO *cs, - const char *nptr, uint l, int base, - char **endptr, int *err) +ulong my_strntoul_8bit(CHARSET_INFO *cs, + const char *nptr, uint l, int base, + char **endptr, int *err) { int negative; register ulong cutoff; @@ -423,9 +423,9 @@ noconv: } -longlong my_strntoll_8bit(CHARSET_INFO *cs __attribute__((unused)), - const char *nptr, uint l, int base, - char **endptr,int *err) +longlong my_strntoll_8bit(CHARSET_INFO *cs __attribute__((unused)), + const char *nptr, uint l, int base, + char **endptr,int *err) { int negative; register ulonglong cutoff; @@ -825,7 +825,7 @@ cnv: #define likeconv(s,A) (uchar) (s)->sort_order[(uchar) (A)] #endif -#define INC_PTR(cs,A,B) A++ +#define INC_PTR(cs,A,B) (A)++ int my_wildcmp_8bit(CHARSET_INFO *cs, @@ -833,7 +833,7 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, const char *wildstr,const char *wildend, int escape, int w_one, int w_many) { - int result= -1; /* Not found, using wildcards */ + int result= -1; /* Not found, using wildcards */ while (wildstr != wildend) { @@ -845,7 +845,7 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, if (str == str_end || likeconv(cs,*wildstr++) != likeconv(cs,*str++)) return(1); /* No match */ if (wildstr == wildend) - return (str != str_end); /* Match if both are at end */ + return(str != str_end); /* Match if both are at end */ result=1; /* Found an anchor char */ } if (*wildstr == w_one) @@ -853,7 +853,7 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, do { if (str == str_end) /* Skip one char if possible */ - return (result); + return(result); INC_PTR(cs,str,str_end); } while (++wildstr < wildend && *wildstr == w_one); if (wildstr == wildend) @@ -872,7 +872,7 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, if (*wildstr == w_one) { if (str == str_end) - return (-1); + return(-1); INC_PTR(cs,str,str_end); continue; } @@ -881,28 +881,29 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, if (wildstr == wildend) return(0); /* Ok if w_many is last */ if (str == str_end) - return -1; + return(-1); if ((cmp= *wildstr) == escape && wildstr+1 != wildend) cmp= *++wildstr; - INC_PTR(cs,wildstr,wildend); /* This is compared trough cmp */ - cmp=likeconv(cs,cmp); + INC_PTR(cs,wildstr,wildend); /* This is compared trough cmp */ + cmp=likeconv(cs,cmp); do { - while (str != str_end && likeconv(cs,*str) != cmp) - str++; - if (str++ == str_end) return (-1); + while (str != str_end && (uchar) likeconv(cs,*str) != cmp) + str++; + if (str++ == str_end) return(-1); { - int tmp=my_wildcmp_8bit(cs,str,str_end,wildstr,wildend,escape,w_one,w_many); + int tmp=my_wildcmp_8bit(cs,str,str_end,wildstr,wildend,escape,w_one, + w_many); if (tmp <= 0) - return (tmp); + return(tmp); } } while (str != str_end && wildstr[0] != w_many); return(-1); } } - return (str != str_end ? 1 : 0); + return(str != str_end ? 1 : 0); } @@ -924,11 +925,11 @@ int my_wildcmp_8bit(CHARSET_INFO *cs, */ my_bool my_like_range_simple(CHARSET_INFO *cs, - const char *ptr,uint ptr_length, - int escape, int w_one, int w_many, - uint res_length, - char *min_str,char *max_str, - uint *min_length,uint *max_length) + const char *ptr,uint ptr_length, + pbool escape, pbool w_one, pbool w_many, + uint res_length, + char *min_str,char *max_str, + uint *min_length,uint *max_length) { const char *end=ptr+ptr_length; char *min_org=min_str; @@ -953,7 +954,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs, *min_length= (uint) (min_str - min_org); *max_length=res_length; do { - *min_str++ = ' '; /* Because if key compression */ + *min_str++ = ' '; /* Because if key compression */ *max_str++ = cs->max_sort_char; } while (min_str != min_end); return 0; @@ -970,7 +971,7 @@ my_bool my_like_range_simple(CHARSET_INFO *cs, } while (min_str != min_end) - *min_str++ = *max_str++ = ' '; /* Because if key compression */ + *min_str++ = *max_str++ = ' '; /* Because if key compression */ return 0; } diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index feff0fff227..09bd12dcdeb 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -227,8 +227,8 @@ int my_strnncollsp_sjis(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_sjis(cs,s,slen,t,tlen); } @@ -270,10 +270,10 @@ static int my_strnxfrm_sjis(CHARSET_INFO *cs __attribute__((unused)), #define max_sort_char ((char) 255) static my_bool my_like_range_sjis(CHARSET_INFO *cs __attribute__((unused)), - const char *ptr,uint ptr_length, - int escape, int w_one, int w_many, - uint res_length, char *min_str,char *max_str, - uint *min_length,uint *max_length) + const char *ptr,uint ptr_length, + pbool escape, pbool w_one, pbool w_many, + uint res_length, char *min_str,char *max_str, + uint *min_length,uint *max_length) { const char *end=ptr+ptr_length; char *min_org=min_str; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index d577b964405..b9856799add 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -15,6 +15,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* + Copyright (C) 2003 by Sathit Jittanupat + <jsat66@hotmail.com,jsat66@yahoo.com> + * solving bug crash with long text field string + * sorting with different number of space or sign char. within string + Copyright (C) 2001 by Korakot Chaovavanich <korakot@iname.com> and Apisilp Trunganont <apisilp@pantip.inet.co.th> Copyright (C) 1998, 1999 by Pruet Boonma <pruet@eng.cmu.ac.th> @@ -448,6 +453,7 @@ uchar NEAR sort_order_tis620[]= (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377', }; + /* Convert thai string to "Standard C String Function" sortable string @@ -455,94 +461,61 @@ uchar NEAR sort_order_tis620[]= thai2sortable() tstr String to convert. Does not have to end with \0 len Length of tstr - out_length Will contain length of sortable string - - NOTE - We use only 3 levels (neglect capitalization). - - OPTIMIZE SUGGESTION - Should be faster to alloc buffer in calling function. - - RETURN - Pointer to sortable string. Should be freed with 'free' */ -static uchar *thai2sortable(const uchar *tstr, uint len, uint *out_length) +static uint thai2sortable(uchar *tstr, uint len) { - const uchar *p= tstr; - uchar *outBuf; - uchar *pRight1, *pRight2, *pRight3; - uchar *pLeft2, *pLeft3; - uint bufSize; - uint RightSize; - - bufSize= (uint) (len + 1) * BUFFER_MULTIPLY; - RightSize= sizeof(uchar) * (len + 1); - if (!(outBuf= pRight1= - (uchar *)malloc(sizeof(uchar) * bufSize + RightSize*2))) - { - /* - Can't allocate buffer; Use original string for sorting - This is not perfect, but better than nothing... - */ - *out_length= len; - return (uchar*) tstr; - } - pLeft2= pRight2= pRight1 + sizeof(uchar) * bufSize; - pLeft3= pRight3= pRight2 + RightSize; + uchar *p; + int tlen; + uchar l2bias; - while ((int) --len > 0) + tlen= len; + l2bias= 256 - 8; + for (p= tstr; tlen > 0; p++, tlen--) { - int *t_ctype0= t_ctype[p[0]]; - if (isldvowel(*p) && isconsnt(p[1])) + uchar c= *p; + + if (isthai(c)) { - int *t_ctype1= t_ctype[p[1]]; - *pRight1++= t_ctype1[0]; - *pRight2++= t_ctype1[1]; - *pRight3++= t_ctype1[2]; - *pRight1++= t_ctype0[0]; - *pRight2++= t_ctype0[1]; - *pRight3++= t_ctype0[2]; - p+= 2; - len--; + int *t_ctype0= t_ctype[c]; + + if (isconsnt(c)) + l2bias -= 8; + if (isldvowel(c) && tlen != 1 && isconsnt(p[1])) + { + /* simply swap between leading-vowel and consonant */ + *p= p[1]; + p[1]= c; + tlen--; + p++; + continue; + } + + /* if found level 2 char (L2_GARAN,L2_TONE*,L2_TYKHU) move to last */ + if (t_ctype0[1] >= L2_GARAN) + { + /* + l2bias use to control position weight of l2char + example (*=l2char) XX*X must come before X*XX + */ + memcpy_overlap(p, p+1, tlen-1); + tstr[len-1]= l2bias + t_ctype0[1]- L2_GARAN +1; + p--; + continue; + } } else { - *pRight1= t_ctype0[0]; - if(*pRight1 != IGNORE) - pRight1++; - *pRight2= t_ctype0[1]; - if (*pRight2 != IGNORE) - pRight2++; - *pRight3= t_ctype0[2]; - if(*pRight3 != IGNORE) - pRight3++; - p++; + l2bias-= 8; + *p= to_lower_tis620[c]; } } - if (!len) /* If last was not double byte */ - { - int *t_ctype0= t_ctype[p[0]]; - if ((*pRight1= t_ctype0[0] != IGNORE)) - pRight1++; - if ((*pRight2= t_ctype0[1]) != IGNORE) - pRight2++; - if ((*pRight3= t_ctype0[2]) != IGNORE) - pRight3++; - } - *pRight1++= L2_BLANK; - *pRight2++= L3_BLANK; - *pRight3++= '\0'; - memcpy(pRight1, pLeft2, pRight2 - pLeft2); - pRight1+= pRight2 - pLeft2; - memcpy(pRight1, pLeft3, pRight3 - pLeft3); - *out_length= (uint) ((pRight1+ (uint) (pRight3 - pLeft3)) - outBuf); - return outBuf; + return len; } /* - strncoll() replacement, compare 2 string, both are conveted to sortable + strncoll() replacement, compare 2 string, both are converted to sortable string Arg: 2 Strings and it compare length @@ -553,21 +526,27 @@ int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)), const uchar * s1, uint len1, const uchar * s2, uint len2) { + uchar buf[80] ; uchar *tc1, *tc2; - uint tc1_length, tc2_length, length; - int res; - - tc1= thai2sortable(s1, len1, &tc1_length); - tc2= thai2sortable(s2, len2, &tc2_length); - length= min(tc1_length, tc2_length); - - res= memcmp((char*)tc1, (char*) tc2, length); - if (tc1 != s1) + int i; + + /* Cut strings at end \0 */ + len1= (int) strnlen((char*) s1,len1); + len2= (int) strnlen((char*) s2,len2); + tc1= buf; + if ((len1 + len2 +2) > (int) sizeof(buf)) + tc1= (uchar*) malloc(len1+len2); + tc2= tc1 + len1+1; + memcpy((char*) tc1, (char*) s1, len1); + tc1[len1]= 0; /* if length(s1)> len1, need to put 'end of string' */ + memcpy((char *)tc2, (char *)s2, len2); + tc2[len2]= 0; /* put end of string */ + thai2sortable(tc1, len1); + thai2sortable(tc2, len2); + i= strcmp((char*)tc1, (char*)tc2); + if (tc1 != buf) free(tc1); - if (tc2 != s2) - free(tc2); - return (res || tc1_length == tc2_length ? res : - (tc1_length < tc2_length ? -1 : 1)); + return i; } @@ -576,34 +555,33 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_tis620(cs,s,slen,t,tlen); } -/* strnxfrm replacment, convert Thai string to sortable string - Arg: Destination buffer, source string, dest length and source length - Ret: Conveted string size +/* + strnxfrm replacment, convert Thai string to sortable string + + Arg: Destination buffer, source string, dest length and source length + Ret: Conveted string size */ + int my_strnxfrm_tis620(CHARSET_INFO *cs __attribute__((unused)), uchar * dest, uint len, const uchar * src, uint srclen) { - uint out_length; - uchar *tmp= thai2sortable(src, srclen, &out_length); - - set_if_smaller(out_length, len); - memcpy(dest, tmp, out_length); - if (tmp != src) - free(tmp); - return (int) out_length; + len= (uint) (strmake((char*) dest, (char*) src, min(len, srclen)) - + (char*) dest); + return (int) thai2sortable(dest, len); } -/* strcoll replacment, compare 2 strings - Arg: 2 strings - Ret: memcmp result +/* + strcoll replacment, compare 2 strings + Arg: 2 strings + Ret: strcmp result */ int my_strcoll_tis620(const uchar * s1, const uchar * s2) @@ -616,6 +594,10 @@ int my_strcoll_tis620(const uchar * s1, const uchar * s2) /* Convert SQL LIKE string to C string + Arg: String, its length, escape character, resource length, + minimal string and maximum string + Ret: Always 0 + IMPLEMENTATION We just copy this function from opt_range.cc. No need to convert to thai2sortable string. min_str and max_str will be use for comparison and @@ -629,7 +611,7 @@ int my_strcoll_tis620(const uchar * s1, const uchar * s2) my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)), const char *ptr, uint ptr_length, - int escape, int w_one, int w_many, + pbool escape, pbool w_one, pbool w_many, uint res_length, char *min_str, char *max_str, uint *min_length, uint *max_length) { @@ -656,7 +638,7 @@ my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)), *min_length= (uint) (min_str - min_org); *max_length=res_length; do { - *min_str++ = ' '; /* For key compression */ + *min_str++ = ' '; /* Because of key compression */ *max_str++ = max_sort_chr; } while (min_str != min_end); return 0; @@ -666,40 +648,10 @@ my_bool my_like_range_tis620(CHARSET_INFO *cs __attribute__((unused)), *min_length= *max_length = (uint) (min_str - min_org); while (min_str != min_end) - *min_str++ = *max_str++ = ' '; /* For key compression */ + *min_str++ = *max_str++ = ' '; /* Because of key compression */ return 0; } -#ifdef NOT_NEEDED - -/* - Thai normalization for input sub system - Arg: Buffer, 's length, String, 'length - Ret: Void -*/ - -void ThNormalize(uchar* ptr, uint field_length, const uchar* from, uint length) -{ - const uchar* fr= from; - uchar* p= ptr; - - if (length > field_length) - length= field_length; - - while (length--) - if ((istone(*fr) || isdiacrt1(*fr)) && - (islwrvowel(fr[1]) || isuprvowel(fr[1]))) - { - *p= fr[1]; - p[1]= *fr; - fr+= 2; - p+= 2; - length--; - } - else - *p++ = *fr++; -} -#endif /* NOT_NEEDED */ static unsigned short cs_to_uni[256]={ 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, @@ -911,7 +863,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler = my_like_range_tis620, my_wildcmp_8bit, /* wildcmp */ my_strcasecmp_8bit, - NULL, + my_instr_simple, /* QQ: To be fixed */ my_hash_sort_simple, }; diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index ef9719bf040..64956c872aa 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1840,8 +1840,8 @@ int my_strnncollsp_utf8(CHARSET_INFO * cs, const uchar *s, uint slen, const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_utf8(cs,s,slen,t,tlen); } diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index d3b5c9d1796..889cf2d2dae 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -38,7 +38,6 @@ */ #define REAL_MYSQL - #ifdef REAL_MYSQL #include "my_global.h" @@ -445,103 +444,65 @@ static struct wordvalue doubles[] = { break; \ } -#define IS_END(p, src, len) (!(*p)) - -#if UNUSED -static int my_strcoll_win1250ch(const uchar * s1, const uchar * s2) { - int v1, v2; - const uchar * p1, * p2; - int pass1 = 0, pass2 = 0; - int diff; - - p1 = s1; p2 = s2; - - do { - NEXT_CMP_VALUE(s1, p1, pass1, v1, 0); - NEXT_CMP_VALUE(s2, p2, pass2, v2, 0); - diff = v1 - v2; - if (diff != 0) return diff; - } while (v1); - return 0; -} -#endif - -#ifdef UNUSED -static int my_strxfrm_win1250ch(uchar * dest, const uchar * src, int len) { - int value; - const uchar * p; - int pass = 0; - int totlen = 0; - p = src; - - do { - NEXT_CMP_VALUE(src, p, pass, value, 0); - if (totlen <= len) - dest[totlen] = value; - totlen++; - } while (value); - return totlen; -} -#endif - -#undef IS_END - #define IS_END(p, src, len) (((char *)p - (char *)src) >= (len)) static int my_strnncoll_win1250ch(CHARSET_INFO *cs __attribute__((unused)), - const uchar * s1, uint len1, - const uchar * s2, uint len2) { - int v1, v2; - const uchar * p1, * p2; - int pass1 = 0, pass2 = 0; - int diff; - - p1 = s1; p2 = s2; - - do { - NEXT_CMP_VALUE(s1, p1, pass1, v1, (int)len1); - NEXT_CMP_VALUE(s2, p2, pass2, v2, (int)len2); - diff = v1 - v2; - if (diff != 0) return diff; - } while (v1); - return 0; + const uchar * s1, uint len1, + const uchar * s2, uint len2) +{ + int v1, v2; + const uchar * p1, * p2; + int pass1 = 0, pass2 = 0; + int diff; + + p1 = s1; p2 = s2; + + do { + NEXT_CMP_VALUE(s1, p1, pass1, v1, (int)len1); + NEXT_CMP_VALUE(s2, p2, pass2, v2, (int)len2); + diff = v1 - v2; + if (diff != 0) return diff; + } while (v1); + return 0; } + static int my_strnncollsp_win1250ch(CHARSET_INFO * cs, - const uchar *s, uint slen, - const uchar *t, uint tlen) + const uchar *s, uint slen, + const uchar *t, uint tlen) { - for ( ; slen && my_isspace(cs, s[slen-1]) ; slen--); - for ( ; tlen && my_isspace(cs, t[tlen-1]) ; tlen--); + for ( ; slen && s[slen-1] == ' ' ; slen--); + for ( ; tlen && t[tlen-1] == ' ' ; tlen--); return my_strnncoll_win1250ch(cs,s,slen,t,tlen); } static int my_strnxfrm_win1250ch(CHARSET_INFO * cs __attribute__((unused)), - uchar * dest, uint len, - const uchar * src, uint srclen) { - int value; - const uchar * p; - int pass = 0; - uint totlen = 0; - p = src; - - do { - NEXT_CMP_VALUE(src, p, pass, value, (int)srclen); - if (totlen <= len) - dest[totlen] = value; - totlen++; - } while (value) ; - return totlen; + uchar * dest, uint len, + const uchar * src, uint srclen) +{ + int value; + const uchar * p; + int pass = 0; + uint totlen = 0; + p = src; + + do { + NEXT_CMP_VALUE(src, p, pass, value, (int)srclen); + if (totlen <= len) + dest[totlen] = value; + totlen++; + } while (value) ; + return totlen; } #undef IS_END - #ifdef REAL_MYSQL -static uchar NEAR like_range_prefix_min_win1250ch[] = { +static uchar NEAR like_range_prefix_min_win1250ch[] = +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, @@ -598,87 +559,82 @@ static uchar NEAR like_range_prefix_max_win1250ch[] = { ** optimized ! */ -static my_bool my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), - const char *ptr, uint ptr_length, - int escape, int w_one, int w_many, - uint res_length, - char *min_str, char *max_str, - uint *min_length, uint *max_length) { - - int was_other_than_min = 0; - const char *end = ptr + ptr_length; - char *min_org = min_str; - char *min_end = min_str + res_length; - - /* return 1; */ - - for (; ptr != end && min_str != min_end ; ptr++) { - if (*ptr == w_one) { /* '_' in SQL */ - break; - } - if (*ptr == w_many) { /* '%' in SQL */ - break; - } - if (*ptr == escape && ptr + 1 != end) { /* Skip escape */ - ptr++; - } - *min_str = like_range_prefix_min_win1250ch[(uint)(*ptr)]; - if (*min_str != min_sort_char) { - was_other_than_min = 1; - } - min_str++; - *max_str++ = like_range_prefix_max_win1250ch[(uint)(*ptr)]; - } - - *min_length = (uint) (min_str - min_org); - *max_length = res_length; - while (min_str != min_end) { - *min_str++ = min_sort_char; - *max_str++ = max_sort_char; - } - if (! was_other_than_min) { - return 1; - } +static my_bool +my_like_range_win1250ch(CHARSET_INFO *cs __attribute__((unused)), + const char *ptr, uint ptr_length, + pbool escape, pbool w_one, pbool w_many, + uint res_length, + char *min_str, char *max_str, + uint *min_length, uint *max_length) +{ - return 0; + int only_min_found= 1; + const char *end = ptr + ptr_length; + char *min_org = min_str; + char *min_end = min_str + res_length; + + /* return 1; */ + + for (; ptr != end && min_str != min_end ; ptr++) + { + if (*ptr == escape && ptr+1 != end) + ptr++; /* Skip escape */ + else if (*ptr == w_one || *ptr == w_many) /* '_' or '%' in SQL */ + break; + *min_str = like_range_prefix_min_win1250ch[(uint)(*ptr)]; + if (*min_str != min_sort_char) + only_min_found= 0; + min_str++; + *max_str++ = like_range_prefix_max_win1250ch[(uint)(*ptr)]; + } + + *min_length = (uint) (min_str - min_org); + *max_length = res_length; + while (min_str != min_end) + { + *min_str++ = min_sort_char; + *max_str++ = max_sort_char; + } + return (only_min_found); } static MY_COLLATION_HANDLER my_collation_czech_ci_handler = { - my_strnncoll_win1250ch, - my_strnncollsp_win1250ch, - my_strnxfrm_win1250ch, - my_like_range_win1250ch, - my_wildcmp_8bit, - my_strcasecmp_8bit, - my_instr_simple, - my_hash_sort_simple + my_strnncoll_win1250ch, + my_strnncollsp_win1250ch, + my_strnxfrm_win1250ch, + my_like_range_win1250ch, + my_wildcmp_8bit, + my_strcasecmp_8bit, + my_instr_simple, + my_hash_sort_simple }; + CHARSET_INFO my_charset_cp1250_czech_ci = { - 34,0,0, /* number */ - MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */ - "cp1250", /* cs name */ - "cp1250_czech_ci", /* name */ - "", /* comment */ - ctype_win1250ch, - to_lower_win1250ch, - to_upper_win1250ch, - sort_order_win1250ch, - tab_cp1250_uni, /* tab_to_uni */ - idx_uni_cp1250, /* tab_from_uni */ - "","", - 2, /* strxfrm_multiply */ - 1, /* mbminlen */ - 1, /* mbmaxlen */ - 0, - &my_charset_8bit_handler, - &my_collation_czech_ci_handler + 34,0,0, /* number */ + MY_CS_COMPILED|MY_CS_STRNXFRM, /* state */ + "cp1250", /* cs name */ + "cp1250_czech_ci", /* name */ + "", /* comment */ + ctype_win1250ch, + to_lower_win1250ch, + to_upper_win1250ch, + sort_order_win1250ch, + tab_cp1250_uni, /* tab_to_uni */ + idx_uni_cp1250, /* tab_from_uni */ + "","", + 2, /* strxfrm_multiply */ + 1, /* mbminlen */ + 1, /* mbmaxlen */ + 0, + &my_charset_8bit_handler, + &my_collation_czech_ci_handler }; -#endif +#endif /* REAL_MYSQL */ -#endif +#endif /* HAVE_CHARSET_cp1250 */ diff --git a/strings/strto.c b/strings/strto.c index 6f12656cb20..52efec6e087 100644 --- a/strings/strto.c +++ b/strings/strto.c @@ -95,7 +95,7 @@ function (const char *nptr,char **endptr,int base) s = nptr; /* Skip white space. */ - while (my_isspace (&my_charset_latin1, *s)) + while (my_isspace(&my_charset_latin1, *s)) ++s; if (*s == '\0') { |