diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-05-03 10:33:37 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-06-10 14:00:34 +1000 |
commit | e434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4 (patch) | |
tree | 00c726f3ae45ddc2e63990ce9b3f15cd6a40ea9f /utf8.c | |
parent | 382a35e21340439b0c2557cc125fb12ac5d135e3 (diff) | |
download | jimtcl-e434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4.zip jimtcl-e434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4.tar.gz jimtcl-e434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4.tar.bz2 |
Small optimisation for utf8 case mapping
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'utf8.c')
-rw-r--r-- | utf8.c | 36 |
1 files changed, 13 insertions, 23 deletions
@@ -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 |