summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-02-16 10:31:05 +0200
committerunknown <monty@mysql.com>2004-02-16 10:31:05 +0200
commitcad7f2a155c26fe2477a104284a4db59470ae694 (patch)
treee792af64f95eba198633387e3b36f50f096c3001 /strings
parent571c901008730a10013d7e1ac84534e7d83914bc (diff)
parentebac2d25bcdcc74bf153a6a3568bfde5f1b17a8b (diff)
downloadmariadb-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.c12
-rw-r--r--strings/ctype-bin.c154
-rw-r--r--strings/ctype-czech.c13
-rw-r--r--strings/ctype-gbk.c6
-rw-r--r--strings/ctype-latin1.c4
-rw-r--r--strings/ctype-mb.c10
-rw-r--r--strings/ctype-simple.c65
-rw-r--r--strings/ctype-sjis.c12
-rw-r--r--strings/ctype-tis620.c224
-rw-r--r--strings/ctype-utf8.c4
-rw-r--r--strings/ctype-win1250ch.c254
-rw-r--r--strings/strto.c2
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')
{