aboutsummaryrefslogtreecommitdiff
path: root/lib/unicode/prop
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicode/prop')
-rw-r--r--lib/unicode/prop/uprop_get_lc.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/unicode/prop/uprop_get_lc.c b/lib/unicode/prop/uprop_get_lc.c
new file mode 100644
index 0000000..4bbdc12
--- /dev/null
+++ b/lib/unicode/prop/uprop_get_lc.c
@@ -0,0 +1,45 @@
+#include "macros.h"
+#include "unicode/prop.h"
+
+#define M(...) ((struct rview)_(__VA_ARGS__))
+#define _(...) \
+ {(const rune[]){__VA_ARGS__}, lengthof(((const rune[]){__VA_ARGS__}))}
+
+struct rview
+uprop_get_lc(rune ch, struct lcctx ctx)
+{
+ if (ch == U'Σ')
+ return ctx.eow ? M(U'ς') : M(U'σ');
+ if (ch == U'İ')
+ return ctx.az_or_tr ? M('i') : M('i', 0x307);
+
+ if (ctx.lt_acc_after) {
+ switch (ch) {
+ case 'I':
+ return M('i', 0x307);
+ case 'J':
+ return M('j', 0x307);
+ case U'Į':
+ return M(U'į', 0x307);
+ }
+ }
+
+ if (ctx.lt) {
+ switch (ch) {
+ case U'Ì':
+ return M('i', 0x307, 0x300);
+ case U'Í':
+ return M('i', 0x307, 0x301);
+ case U'Ĩ':
+ return M('i', 0x307, 0x303);
+ }
+ }
+
+ if (ch == 0x307 && ctx.az_tr_after_I)
+ return M();
+ if (ch == 'I' && ctx.az_tr_not_before_dot)
+ return M(U'ı');
+
+ ch = uprop_get_slc(ch);
+ return M(ch);
+}