Allow cp932 characters to be stored in a SJIS column

This commit is contained in:
unknown 2004-10-21 12:17:59 +05:00
commit 8f82360081
4 changed files with 57 additions and 3 deletions

View file

@ -4563,6 +4563,40 @@ uint my_numcells_sjis(CHARSET_INFO *cs __attribute__((unused)),
return clen;
}
/*
Returns a well formed length of a SJIS string.
CP932 additional characters are also accepted.
*/
static
uint my_well_formed_len_sjis(CHARSET_INFO *cs __attribute__((unused)),
const char *b, const char *e, uint pos)
{
const char *b0= b;
while (pos && b < e)
{
/*
Cast to int8 for extra safety.
"char" can be unsigned by default
on some platforms.
*/
if (((int8)b[0]) >= 0)
{
/* Single byte character */
b+= 1;
}
else if (issjishead((uchar)*b) && (e-b)>1 && issjistail((uchar)b[1]))
{
/* Double byte character */
b+= 2;
}
else
{
/* Wrong byte sequence */
break;
}
}
return b - b0;
}
static MY_COLLATION_HANDLER my_collation_ci_handler =
@ -4586,7 +4620,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
mbcharlen_sjis,
my_numchars_mb,
my_charpos_mb,
my_well_formed_len_mb,
my_well_formed_len_sjis,
my_lengthsp_8bit,
my_numcells_sjis,
my_mb_wc_sjis, /* mb_wc */

View file

@ -2126,8 +2126,13 @@ int my_strcasecmp_utf8(CHARSET_INFO *cs, const char *s, const char *t)
while (s[0] && t[0])
{
my_wc_t s_wc,t_wc;
if (s[0] >= 0)
/*
Cast to int8 for extra safety.
char can be unsigned by default
on some platforms.
*/
if (((int8)s[0]) >= 0)
{
/*
s[0] is between 0 and 127.