diff options
author | bar@eagle.intranet.mysql.r18.ru <> | 2005-03-25 16:23:16 +0400 |
---|---|---|
committer | bar@eagle.intranet.mysql.r18.ru <> | 2005-03-25 16:23:16 +0400 |
commit | e76019bc42aa723d35f21a61fb9d8b8e5b391779 (patch) | |
tree | 679a5173d3990339914ca7a833ee285dbdfb6586 /strings | |
parent | fe0b425e0a0c268da0e49fd3195bbe3f09e1dfd5 (diff) | |
parent | 70abf0a046a7b8e024d03eaf8ecf4e689bd491de (diff) | |
download | mariadb-git-e76019bc42aa723d35f21a61fb9d8b8e5b391779.tar.gz |
Merge eagle.intranet.mysql.r18.ru:/home/bar/mysql-4.1
into eagle.intranet.mysql.r18.ru:/home/bar/mysql-5.0
Diffstat (limited to 'strings')
-rw-r--r-- | strings/ctype-big5.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 793c48bb988..f5ef82a7600 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6287,6 +6287,43 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)), return 2; } + +/* + Returns a well formed length of a BIG5 string. + CP950 and HKSCS additional characters are also accepted. +*/ +static +uint my_well_formed_len_big5(CHARSET_INFO *cs __attribute__((unused)), + const char *b, const char *e, uint pos) +{ + const char *b0= b; + const char *emb= e - 1; /* Last possible end of an MB character */ + 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 ascii character */ + b++; + } + else if ((b < emb) && isbig5code((uchar)*b, (uchar)b[1])) + { + /* Double byte character */ + b+= 2; + } + else + { + /* Wrong byte sequence */ + break; + } + } + return b - b0; +} + + static MY_COLLATION_HANDLER my_collation_big5_chinese_ci_handler = { NULL, /* init */ @@ -6308,7 +6345,7 @@ static MY_CHARSET_HANDLER my_charset_big5_handler= mbcharlen_big5, my_numchars_mb, my_charpos_mb, - my_well_formed_len_mb, + my_well_formed_len_big5, my_lengthsp_8bit, my_numcells_8bit, my_mb_wc_big5, /* mb_wc */ |