aboutsummaryrefslogtreecommitdiff
path: root/lib/unicode/prop/uprop_get_uc.c
blob: d3ab2748d14c04ab2335c6739fc024d4e5a8592e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "__bsearch.h"
#include "macros.h"
#include "rune.h"
#include "unicode/prop.h"

#define M(...) ((struct rview)_(__VA_ARGS__))
#define _(...) \
	{(const rune []){__VA_ARGS__}, lengthof(((const rune []){__VA_ARGS__}))}

static const struct {
	rune k;
	struct rview v;
} lookup[] = {
	{0x0149, /* ʼn */ _(U'ʼ', 'N')},
	{0x01F0, /* ǰ */ _('J', 0x30C)},
	{0x0390, /* ΐ */ _(U'Ι', 0x308, 0x301)},
	{0x03B0, /* ΰ */ _(U'Υ', 0x308, 0x301)},
	{0x0587, /* և */ _(U'Ե', U'Ւ')},
	{0x1E96, /* ẖ */ _('H', 0x331)},
	{0x1E97, /* ẗ */ _('T', 0x308)},
	{0x1E98, /* ẘ */ _('W', 0x30A)},
	{0x1E99, /* ẙ */ _('Y', 0x30A)},
	{0x1E9A, /* ẚ */ _('A', U'ʾ')},
	{0x1F50, /* ὐ */ _(U'Υ', 0x313)},
	{0x1F52, /* ὒ */ _(U'Υ', 0x313, 0x300)},
	{0x1F54, /* ὔ */ _(U'Υ', 0x313, 0x301)},
	{0x1F56, /* ὖ */ _(U'Υ', 0x313, 0x342)},
	{0x1F80, /* ᾀ */ _(U'Ἀ', U'Ι')},
	{0x1F81, /* ᾁ */ _(U'Ἁ', U'Ι')},
	{0x1F82, /* ᾂ */ _(U'Ἂ', U'Ι')},
	{0x1F83, /* ᾃ */ _(U'Ἃ', U'Ι')},
	{0x1F84, /* ᾄ */ _(U'Ἄ', U'Ι')},
	{0x1F85, /* ᾅ */ _(U'Ἅ', U'Ι')},
	{0x1F86, /* ᾆ */ _(U'Ἆ', U'Ι')},
	{0x1F87, /* ᾇ */ _(U'Ἇ', U'Ι')},
	{0x1F88, /* ᾈ */ _(U'Ἀ', U'Ι')},
	{0x1F89, /* ᾉ */ _(U'Ἁ', U'Ι')},
	{0x1F8A, /* ᾊ */ _(U'Ἂ', U'Ι')},
	{0x1F8B, /* ᾋ */ _(U'Ἃ', U'Ι')},
	{0x1F8C, /* ᾌ */ _(U'Ἄ', U'Ι')},
	{0x1F8D, /* ᾍ */ _(U'Ἅ', U'Ι')},
	{0x1F8E, /* ᾎ */ _(U'Ἆ', U'Ι')},
	{0x1F8F, /* ᾏ */ _(U'Ἇ', U'Ι')},
	{0x1F90, /* ᾐ */ _(U'Ἠ', U'Ι')},
	{0x1F91, /* ᾑ */ _(U'Ἡ', U'Ι')},
	{0x1F92, /* ᾒ */ _(U'Ἢ', U'Ι')},
	{0x1F93, /* ᾓ */ _(U'Ἣ', U'Ι')},
	{0x1F94, /* ᾔ */ _(U'Ἤ', U'Ι')},
	{0x1F95, /* ᾕ */ _(U'Ἥ', U'Ι')},
	{0x1F96, /* ᾖ */ _(U'Ἦ', U'Ι')},
	{0x1F97, /* ᾗ */ _(U'Ἧ', U'Ι')},
	{0x1F98, /* ᾘ */ _(U'Ἠ', U'Ι')},
	{0x1F99, /* ᾙ */ _(U'Ἡ', U'Ι')},
	{0x1F9A, /* ᾚ */ _(U'Ἢ', U'Ι')},
	{0x1F9B, /* ᾛ */ _(U'Ἣ', U'Ι')},
	{0x1F9C, /* ᾜ */ _(U'Ἤ', U'Ι')},
	{0x1F9D, /* ᾝ */ _(U'Ἥ', U'Ι')},
	{0x1F9E, /* ᾞ */ _(U'Ἦ', U'Ι')},
	{0x1F9F, /* ᾟ */ _(U'Ἧ', U'Ι')},
	{0x1FA0, /* ᾠ */ _(U'Ὠ', U'Ι')},
	{0x1FA1, /* ᾡ */ _(U'Ὡ', U'Ι')},
	{0x1FA2, /* ᾢ */ _(U'Ὢ', U'Ι')},
	{0x1FA3, /* ᾣ */ _(U'Ὣ', U'Ι')},
	{0x1FA4, /* ᾤ */ _(U'Ὤ', U'Ι')},
	{0x1FA5, /* ᾥ */ _(U'Ὥ', U'Ι')},
	{0x1FA6, /* ᾦ */ _(U'Ὦ', U'Ι')},
	{0x1FA7, /* ᾧ */ _(U'Ὧ', U'Ι')},
	{0x1FA8, /* ᾨ */ _(U'Ὠ', U'Ι')},
	{0x1FA9, /* ᾩ */ _(U'Ὡ', U'Ι')},
	{0x1FAA, /* ᾪ */ _(U'Ὢ', U'Ι')},
	{0x1FAB, /* ᾫ */ _(U'Ὣ', U'Ι')},
	{0x1FAC, /* ᾬ */ _(U'Ὤ', U'Ι')},
	{0x1FAD, /* ᾭ */ _(U'Ὥ', U'Ι')},
	{0x1FAE, /* ᾮ */ _(U'Ὦ', U'Ι')},
	{0x1FAF, /* ᾯ */ _(U'Ὧ', U'Ι')},
	{0x1FB2, /* ᾲ */ _(U'Ὰ', U'Ι')},
	{0x1FB3, /* ᾳ */ _(U'Α', U'Ι')},
	{0x1FB4, /* ᾴ */ _(U'Ά', U'Ι')},
	{0x1FB6, /* ᾶ */ _(U'Α', 0x342)},
	{0x1FB7, /* ᾷ */ _(U'Α', 0x342, U'Ι')},
	{0x1FBC, /* ᾼ */ _(U'Α', U'Ι')},
	{0x1FC2, /* ῂ */ _(U'Ὴ', U'Ι')},
	{0x1FC3, /* ῃ */ _(U'Η', U'Ι')},
	{0x1FC4, /* ῄ */ _(U'Ή', U'Ι')},
	{0x1FC6, /* ῆ */ _(U'Η', 0x342)},
	{0x1FC7, /* ῇ */ _(U'Η', 0x342, U'Ι')},
	{0x1FCC, /* ῌ */ _(U'Η', U'Ι')},
	{0x1FD2, /* ῒ */ _(U'Ι', 0x308, 0x300)},
	{0x1FD3, /* ΐ */ _(U'Ι', 0x308, 0x301)},
	{0x1FD6, /* ῖ */ _(U'Ι', 0x342)},
	{0x1FD7, /* ῗ */ _(U'Ι', 0x308, 0x342)},
	{0x1FE2, /* ῢ */ _(U'Υ', 0x308, 0x300)},
	{0x1FE3, /* ΰ */ _(U'Υ', 0x308, 0x301)},
	{0x1FE4, /* ῤ */ _(U'Ρ', 0x313)},
	{0x1FE6, /* ῦ */ _(U'Υ', 0x342)},
	{0x1FE7, /* ῧ */ _(U'Υ', 0x308, 0x342)},
	{0x1FF2, /* ῲ */ _(U'Ὼ', U'Ι')},
	{0x1FF3, /* ῳ */ _(U'Ω', U'Ι')},
	{0x1FF4, /* ῴ */ _(U'Ώ', U'Ι')},
	{0x1FF6, /* ῶ */ _(U'Ω', 0x342)},
	{0x1FF7, /* ῷ */ _(U'Ω', 0x342, U'Ι')},
	{0x1FFC, /* ῼ */ _(U'Ω', U'Ι')},
	{0xFB00, /* ff */ _('F', 'F')},
	{0xFB01, /* fi */ _('F', 'I')},
	{0xFB02, /* fl */ _('F', 'L')},
	{0xFB03, /* ffi */ _('F', 'F', 'I')},
	{0xFB04, /* ffl */ _('F', 'F', 'L')},
	{0xFB05, /* ſt */ _('S', 'T')},
	{0xFB06, /* st */ _('S', 'T')},
	{0xFB13, /* ﬓ */ _(U'Մ', U'Ն')},
	{0xFB14, /* ﬔ */ _(U'Մ', U'Ե')},
	{0xFB15, /* ﬕ */ _(U'Մ', U'Ի')},
	{0xFB16, /* ﬖ */ _(U'Վ', U'Ն')},
	{0xFB17, /* ﬗ */ _(U'Մ', U'Խ')},
};

__MLIB_DEFINE_BSEARCH_KV(struct rview, lookup, M(ch))

struct rview
uprop_get_uc(rune ch, struct ucctx ctx)
{
	if (ch == U'ß')
		return ctx.cap_eszett ? M(U'ẞ') : M('S', 'S');
	if (ch == 'i' && ctx.az_or_tr)
		return M(U'İ');
	if (ch == 0x307 && ctx.lt_after_i)
		return M();

	rune CH = uprop_get_suc(ch);
	return ch != CH ? M(CH) : mlib_lookup_kv(ch);
}