summaryrefslogtreecommitdiffstats
path: root/unicode/unicode_canonical.c
diff options
context:
space:
mode:
Diffstat (limited to 'unicode/unicode_canonical.c')
-rw-r--r--unicode/unicode_canonical.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/unicode/unicode_canonical.c b/unicode/unicode_canonical.c
new file mode 100644
index 0000000..3f6773f
--- /dev/null
+++ b/unicode/unicode_canonical.c
@@ -0,0 +1,57 @@
+/*
+** Copyright 2020 Double Precision, Inc.
+** See COPYING for distribution information.
+**
+*/
+
+#include "unicode_config.h"
+#include "courier-unicode.h"
+#include <string.h>
+
+struct canon_map_table {
+ char32_t lookup_char;
+ unsigned char fmt_flag_v;
+ unsigned char n_chars;
+ unsigned short offset;
+};
+
+#include "canonicalmappings.h"
+
+unicode_canonical_t unicode_canonical(char32_t c)
+{
+ size_t i=canon_map_hash[c % HASH_SIZE]
+ +
+ /* Compile-time sanity check */
+ sizeof(char[ sizeof(canon_map_hash)/
+ sizeof(canon_map_hash[0]) == HASH_SIZE
+ ? 1:-1])*0;
+
+ while (i < sizeof(canon_map_lookup)/sizeof(canon_map_lookup[0]))
+ {
+ if (canon_map_lookup[i].lookup_char == c)
+ {
+ unicode_canonical_t ret;
+
+ ret.canonical_chars=
+ canon_map_values+canon_map_lookup[i].offset;
+ ret.n_canonical_chars=
+ canon_map_lookup[i].n_chars;
+ ret.format=
+ (unicode_canonical_fmt_t)
+ canon_map_lookup[i].fmt_flag_v;
+
+ return ret;
+ }
+
+ if ((canon_map_lookup[i].lookup_char % HASH_SIZE) !=
+ (c % HASH_SIZE))
+ break;
+ ++i;
+ }
+
+ unicode_canonical_t ret;
+
+ memset(&ret, 0, sizeof(ret));
+
+ return ret;
+}