From 5cd8e9069a5e78a45932055678eae77a1de4fd66 Mon Sep 17 00:00:00 2001 From: Thomas Voss Date: Sat, 13 Apr 2024 00:37:32 +0200 Subject: Add uprop_get_lc() --- lib/unicode/prop/uprop_get_lc.c | 45 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 lib/unicode/prop/uprop_get_lc.c (limited to 'lib/unicode/prop') 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); +} -- cgit v1.2.3