aboutsummaryrefslogtreecommitdiff
path: root/utf8.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-05-03 10:33:37 +1000
committerSteve Bennett <steveb@workware.net.au>2011-06-10 14:00:34 +1000
commite434119c8fc0b85f98f3b194bd5fbfc8dfbb06f4 (patch)
tree00c726f3ae45ddc2e63990ce9b3f15cd6a40ea9f /utf8.c
parent382a35e21340439b0c2557cc125fb12ac5d135e3 (diff)
downloadjimtcl-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.c36
1 files 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