Merge branch 'debian'
[hcoop/debian/courier-authlib.git] / libs / unicode / unicode_tablookup.c
diff --git a/libs/unicode/unicode_tablookup.c b/libs/unicode/unicode_tablookup.c
new file mode 100644 (file)
index 0000000..c61526d
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+** Copyright 2011 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+*/
+
+#include       "unicode_config.h"
+#include       "unicode.h"
+
+#define BLOCK_SIZE     256
+
+uint8_t unicode_tab_lookup(unicode_char ch,
+                          const size_t *unicode_indextab,
+                          size_t unicode_indextab_sizeof,
+                          const uint8_t (*unicode_rangetab)[2],
+                          const uint8_t *unicode_classtab,
+                          uint8_t uclass)
+{
+       size_t cl=ch / BLOCK_SIZE;
+
+       if (cl < unicode_indextab_sizeof-1)
+       {
+               const size_t start_pos=unicode_indextab[cl];
+               const uint8_t (*p)[2]=unicode_rangetab + start_pos;
+               size_t b=0, e=unicode_indextab[cl+1] - start_pos;
+               uint8_t chmodcl= ch & (BLOCK_SIZE-1);
+
+               while (b < e)
+               {
+                       size_t n=b + (e-b)/2;
+
+                       if (chmodcl >= p[n][0])
+                       {
+                               if (chmodcl <= p[n][1])
+                               {
+                                       uclass=unicode_classtab[start_pos+n];
+                                       break;
+                               }
+                               b=n+1;
+                       }
+                       else
+                       {
+                               e=n;
+                       }
+               }
+       }
+
+       return uclass;
+}