diff options
Diffstat (limited to 'vendor/nunicode/include/libnu/udb.h')
-rw-r--r-- | vendor/nunicode/include/libnu/udb.h | 81 |
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 */ |