summaryrefslogtreecommitdiff
path: root/vendor/nunicode/include/libnu/udb.h
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nunicode/include/libnu/udb.h')
-rw-r--r--vendor/nunicode/include/libnu/udb.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/vendor/nunicode/include/libnu/udb.h b/vendor/nunicode/include/libnu/udb.h
new file mode 100644
index 0000000000..39a785bc69
--- /dev/null
+++ b/vendor/nunicode/include/libnu/udb.h
@@ -0,0 +1,81 @@
+#ifndef NU_UDB_H
+#define NU_UDB_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <libnu/config.h>
+#include <libnu/defines.h>
+#include <libnu/mph.h>
+#include <libnu/strings.h>
+#include <libnu/utf8.h>
+
+/** @defgroup udb Unicode database
+ *
+ * Note: never use it directly, it is subject to change in next releases
+ */
+
+#if defined (__cplusplus) || defined (c_plusplus)
+extern "C" {
+#endif
+
+#ifdef NU_WITH_UDB
+
+#define NU_UDB_DECODING_FUNCTION (nu_utf8_read)
+#define nu_udb_read (nu_utf8_read)
+
+/** Lookup value in UDB
+ *
+ * Similar to nu_udb_lookup(), but doesn't look into COMBINED
+ *
+ * @ingroup udb
+ * @see nu_udb_lookup
+ * @return raw value from VALUES_I or 0 if value wasn't found
+ */
+static inline
+uint32_t nu_udb_lookup_value(uint32_t codepoint,
+ const int16_t *G, size_t G_SIZE,
+ const uint32_t *VALUES_C, const uint16_t *VALUES_I) {
+
+ uint32_t hash = nu_mph_hash(G, G_SIZE, codepoint);
+ uint32_t value = nu_mph_lookup(VALUES_C, VALUES_I, codepoint, hash);
+
+ return value;
+}
+
+/** Lookup data in UDB
+ *
+ * Returned data is encoded, therefore you need to use p = it(p, &u) to
+ * fetch it. Returned string might contain more than 1 codepoint.
+ *
+ * @ingroup udb
+ * @param codepoint unicode codepoint
+ * @param G first MPH table
+ * @param G_SIZE first table number of elements (original MPH set size)
+ * @param VALUES_C codepoints array
+ * @param VALUES_I offsets array
+ * @param COMBINED joined values addressed by index stored in VALUES
+ * @return looked up data or 0
+ */
+static inline
+const char* nu_udb_lookup(uint32_t codepoint,
+ const int16_t *G, size_t G_SIZE,
+ const uint32_t *VALUES_C, const uint16_t *VALUES_I, const uint8_t *COMBINED) {
+
+ uint32_t combined_offset = nu_udb_lookup_value(codepoint,
+ G, G_SIZE, VALUES_C, VALUES_I);
+
+ if (combined_offset == 0) {
+ return 0;
+ }
+
+ return (const char *)(COMBINED + combined_offset);
+}
+
+#endif /* NU_WITH_UDB */
+
+#if defined (__cplusplus) || defined (c_plusplus)
+}
+#endif
+
+#endif /* NU_UDB_H */