diff options
Diffstat (limited to 'strings/ctype-mb.c')
-rw-r--r-- | strings/ctype-mb.c | 70 |
1 files changed, 50 insertions, 20 deletions
diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 56b3309ca10..d78e758010d 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -602,13 +602,10 @@ uint my_instr_mb(CHARSET_INFO *cs, characters having multibyte weights *equal* to their codes: cp932, euckr, gb2312, sjis, eucjpms, ujis. */ -size_t -my_strnxfrm_mb(CHARSET_INFO *cs, - uchar *dst, size_t dstlen, uint nweights, - const uchar *src, size_t srclen, uint flags) +size_t my_strnxfrm_mb_internal(CHARSET_INFO *cs, uchar *dst, uchar *de, + uint *nweights, const uchar *src, size_t srclen) { uchar *d0= dst; - uchar *de= dst + dstlen; const uchar *se= src + srclen; const uchar *sort_order= cs->sort_order; @@ -619,12 +616,12 @@ my_strnxfrm_mb(CHARSET_INFO *cs, then we can run a simplified loop - without checking "nweights" and "de". */ - if (dstlen >= srclen && nweights >= srclen) + if (de >= d0 + srclen && *nweights >= srclen) { if (sort_order) { /* Optimized version for a case insensitive collation */ - for (; src < se; nweights--) + for (; src < se; (*nweights)--) { if (*src < 128) /* quickly catch ASCII characters */ *dst++= sort_order[*src++]; @@ -635,7 +632,7 @@ my_strnxfrm_mb(CHARSET_INFO *cs, else { /* Optimized version for a case sensitive collation (no sort_order) */ - for (; src < se; nweights--) + for (; src < se; (*nweights)--) { if (*src < 128) /* quickly catch ASCII characters */ *dst++= *src++; @@ -643,14 +640,14 @@ my_strnxfrm_mb(CHARSET_INFO *cs, my_strnxfrm_mb_non_ascii_char(cs, dst, src, se); } } - goto pad; + goto end; } /* A thourough loop, checking all possible limits: "se", "nweights" and "de". */ - for (; src < se && nweights && dst < de; nweights--) + for (; src < se && *nweights && dst < de; (*nweights)--) { int chlen; if (*src < 128 || !(chlen= my_ismbchar(cs, (const char *) src, @@ -669,11 +666,36 @@ my_strnxfrm_mb(CHARSET_INFO *cs, } } -pad: +end: + return dst - d0; +} + + +size_t +my_strnxfrm_mb(CHARSET_INFO *cs, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags) +{ + uchar *de= dst + dstlen; + uchar *d0= dst; + dst= d0 + my_strnxfrm_mb_internal(cs, dst, de, &nweights, src, srclen); return my_strxfrm_pad_desc_and_reverse(cs, d0, dst, de, nweights, flags, 0); } +size_t +my_strnxfrm_mb_nopad(CHARSET_INFO *cs, + uchar *dst, size_t dstlen, uint nweights, + const uchar *src, size_t srclen, uint flags) +{ + uchar *de= dst + dstlen; + uchar *d0= dst; + dst= d0 + my_strnxfrm_mb_internal(cs, dst, de, &nweights, src, srclen); + return my_strxfrm_pad_desc_and_reverse_nopad(cs, d0, dst, de, nweights, + flags, 0); +} + + int my_strcasecmp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), const char *s, const char *t) @@ -682,18 +704,13 @@ my_strcasecmp_mb_bin(CHARSET_INFO * cs __attribute__((unused)), } + void -my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)), - const uchar *key, size_t len,ulong *nr1, ulong *nr2) +my_hash_sort_mb_nopad_bin(CHARSET_INFO *cs __attribute__((unused)), + const uchar *key, size_t len,ulong *nr1, ulong *nr2) { register ulong m1= *nr1, m2= *nr2; - - /* - Remove trailing spaces. We have to do this to be able to compare - 'A ' and 'A' as identical - */ - const uchar *end = skip_trailing_space(key, len); - + const uchar *end= key + len; for (; key < end ; key++) { MY_HASH_ADD(m1, m2, (uint)*key); @@ -703,6 +720,19 @@ my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)), } +void +my_hash_sort_mb_bin(CHARSET_INFO *cs __attribute__((unused)), + const uchar *key, size_t len,ulong *nr1, ulong *nr2) +{ + /* + Remove trailing spaces. We have to do this to be able to compare + 'A ' and 'A' as identical + */ + const uchar *end= skip_trailing_space(key, len); + my_hash_sort_mb_nopad_bin(cs, key, end - key, nr1, nr2); +} + + /* Fill the given buffer with 'maximum character' for given charset SYNOPSIS |