From e434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Tue, 3 May 2011 10:33:37 +1000 Subject: Small optimisation for utf8 case mapping Signed-off-by: Steve Bennett --- utf8.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/utf8.c b/utf8.c index 3b32a7f..f980987 100644 --- a/utf8.c +++ b/utf8.c @@ -157,46 +157,36 @@ static int cmp_casemap(const void *key, const void *cm) return *(int *)key - (int)((const struct casemap *)cm)->code; } -int utf8_upper(int uc) +static int utf8_map_case(int uc, int upper) { - const struct casemap *cm; - - if (isascii(uc)) { - return toupper(uc); - } - - cm = bsearch(&uc, unicode_case_mapping, NUMCASEMAP, sizeof(*unicode_case_mapping), cmp_casemap); + const struct casemap *cm = bsearch(&uc, unicode_case_mapping, NUMCASEMAP, sizeof(*unicode_case_mapping), cmp_casemap); if (cm) { if (cm->lowerdelta == -128) { - uc = unicode_extmap[cm->upperdelta].upper; + uc = upper ? unicode_extmap[cm->upperdelta].upper : unicode_extmap[cm->upperdelta].lower; } else { - uc += cm->upperdelta; + uc += upper ? cm->upperdelta : cm->lowerdelta; } } return uc; } -int utf8_lower(int uc) +int utf8_upper(int uc) { - const struct casemap *cm; + if (isascii(uc)) { + return toupper(uc); + } + return utf8_map_case(uc, 1); +} +int utf8_lower(int uc) +{ if (isascii(uc)) { return tolower(uc); } - cm = bsearch(&uc, unicode_case_mapping, NUMCASEMAP, sizeof(*unicode_case_mapping), cmp_casemap); - - if (cm) { - if (cm->lowerdelta == -128) { - uc = unicode_extmap[cm->upperdelta].lower; - } - else { - uc += cm->lowerdelta; - } - } - return uc; + return utf8_map_case(uc, 0); } #endif -- cgit v1.1