diff options
author | unknown <bar@mysql.com> | 2004-10-21 12:17:59 +0500 |
---|---|---|
committer | unknown <bar@mysql.com> | 2004-10-21 12:17:59 +0500 |
commit | 8f8236008193394ea2785c0095adf02839cde83a (patch) | |
tree | da7ea10d906d7cb39018bfc8fe3fc10f160850d1 /strings/ctype-sjis.c | |
parent | ffd77c4679615ba3e4dd7614dadc735af5d4aa9c (diff) | |
download | mariadb-git-8f8236008193394ea2785c0095adf02839cde83a.tar.gz |
Allow cp932 characters to be stored in a SJIS column
Diffstat (limited to 'strings/ctype-sjis.c')
-rw-r--r-- | strings/ctype-sjis.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index 55ff8ac28fe..4176ff2e538 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -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 */ |