summaryrefslogtreecommitdiffstats
path: root/unicode/unicode_ultcase.c
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /unicode/unicode_ultcase.c
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'unicode/unicode_ultcase.c')
-rw-r--r--unicode/unicode_ultcase.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/unicode/unicode_ultcase.c b/unicode/unicode_ultcase.c
new file mode 100644
index 0000000..e0c339e
--- /dev/null
+++ b/unicode/unicode_ultcase.c
@@ -0,0 +1,57 @@
+/*
+** Copyright 2000-2003 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+*/
+
+#include "unicode_config.h"
+#include "unicode.h"
+
+extern const unsigned unicode_case_hash;
+extern const unicode_char unicode_case_tab[][4];
+extern const unsigned unicode_case_offset[];
+
+static unsigned find_case(unicode_char c)
+{
+ unsigned idx= c % unicode_case_hash;
+
+ unsigned i=unicode_case_offset[idx];
+
+ unicode_char uc;
+
+ --i;
+
+ do
+ {
+ uc=unicode_case_tab[++i][0];
+ if (uc == c)
+ return (i);
+ } while ( (uc % unicode_case_hash) == idx);
+
+ return (0);
+}
+
+unicode_char unicode_uc(unicode_char c)
+{
+ unsigned i=find_case(c);
+
+ return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][1]);
+}
+
+unicode_char unicode_lc(unicode_char c)
+{
+ unsigned i=find_case(c);
+
+ return (unicode_case_tab[i][0] != c ? c:unicode_case_tab[i][2]);
+}
+
+unicode_char unicode_tc(unicode_char c)
+{
+ unsigned i;
+ unicode_char oc=c;
+
+ c=unicode_lc(c);
+ i=find_case(c);
+
+ return (unicode_case_tab[i][0] != c ? oc:unicode_case_tab[i][3]);
+}