summaryrefslogtreecommitdiff
path: root/vendor/nunicode/src/libnu/tolower.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/nunicode/src/libnu/tolower.c')
-rw-r--r--vendor/nunicode/src/libnu/tolower.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/vendor/nunicode/src/libnu/tolower.c b/vendor/nunicode/src/libnu/tolower.c
new file mode 100644
index 0000000000..1ce229d370
--- /dev/null
+++ b/vendor/nunicode/src/libnu/tolower.c
@@ -0,0 +1,58 @@
+#include <assert.h>
+
+#include <libnu/casemap.h>
+
+#ifdef NU_WITH_TOLOWER
+
+#include <libnu/casemap_internal.h>
+#include "gen/_tolower.c"
+
+/* in nu_casemap_read (UTF-8), zero-terminated */
+static const char *__nu_final_sigma = "ς";
+
+const char* nu_tolower(uint32_t codepoint) {
+ return _nu_to_something(codepoint, NU_TOLOWER_G, NU_TOLOWER_G_SIZE,
+ NU_TOLOWER_VALUES_C, NU_TOLOWER_VALUES_I, NU_TOLOWER_COMBINED);
+}
+
+const char* _nu_tolower(const char *encoded, const char *limit, nu_read_iterator_t read,
+ uint32_t *u, const char **transform,
+ void *context) {
+
+ (void)(context);
+
+ uint32_t _u = 0;
+ const char *np = read(encoded, &_u);
+
+ if (u != 0) {
+ *u = _u;
+ }
+
+ /* handling of 0x03A3 ('Σ')
+ *
+ * this is the only language-independent exception described in
+ * SpecialCasing.txt (Unicode 7.0) */
+
+ assert(nu_casemap_read == nu_utf8_read);
+
+ if (_u == 0x03A3) {
+ if (np >= limit) {
+ *transform = __nu_final_sigma;
+ return np;
+ }
+
+ uint32_t nu = 0;
+ read(np, &nu);
+
+ if (nu == 0) {
+ *transform = __nu_final_sigma;
+ return np;
+ }
+ }
+
+ *transform = nu_tolower(_u);
+
+ return np;
+}
+
+#endif /* NU_WITH_TOLOWER */