diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/diacritic.c | 471 |
1 files changed, 162 insertions, 309 deletions
diff --git a/firmware/drivers/diacritic.c b/firmware/drivers/diacritic.c index 576fe174e6..ff40b195c7 100644 --- a/firmware/drivers/diacritic.c +++ b/firmware/drivers/diacritic.c | |||
@@ -26,319 +26,166 @@ | |||
26 | #include "diacritic.h" | 26 | #include "diacritic.h" |
27 | #include "system.h" | 27 | #include "system.h" |
28 | 28 | ||
29 | #define DIAC_FLAG_NONE 0 | ||
30 | #define DIAC_FLAG_DIACRITIC (1 << 0) | ||
31 | #define DIAC_FLAG_RTL (1 << 1) | ||
32 | |||
33 | #define DIAC_VAL(i) (diac_ranges[(i)].last) | ||
34 | #define DIAC_IS_DIACRITIC(i) (diac_ranges[(i)].flags & DIAC_FLAG_DIACRITIC) | ||
35 | #define DIAC_IS_RTL(i) (diac_ranges[(i)].flags & DIAC_FLAG_RTL) | ||
36 | #define DIAC_NUM_RANGES (ARRAYLEN(diac_ranges)) | 29 | #define DIAC_NUM_RANGES (ARRAYLEN(diac_ranges)) |
37 | 30 | ||
31 | /* Each diac_range_ struct defines a Unicode range that begins with | ||
32 | * N diacritic characters, and continues with non-diacritic characters up to the | ||
33 | * base of the next item in the array */ | ||
38 | struct diac_range | 34 | struct diac_range |
39 | { | 35 | { |
40 | unsigned short last; | 36 | unsigned base : 16; |
41 | unsigned char flags; | 37 | unsigned num_diacritics : 7; |
38 | unsigned is_rtl : 1; | ||
42 | }; | 39 | }; |
43 | 40 | ||
41 | #define DIAC_RANGE_ENTRY(first_diac, first_non_diac, is_rtl) \ | ||
42 | { first_diac, first_non_diac - first_diac, is_rtl } | ||
43 | |||
44 | /* Sorted by Unicode value */ | 44 | /* Sorted by Unicode value */ |
45 | static const struct diac_range diac_ranges[] = | 45 | static const struct diac_range diac_ranges[] = |
46 | { | 46 | { |
47 | { 0x0000, DIAC_FLAG_NONE }, | 47 | DIAC_RANGE_ENTRY(0x0000, 0x0000, 0), |
48 | { 0x02ff, DIAC_FLAG_NONE }, | 48 | DIAC_RANGE_ENTRY(0x0300, 0x0370, 0), |
49 | { 0x036f, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks */ | 49 | DIAC_RANGE_ENTRY(0x0483, 0x048a, 0), |
50 | { 0x0482, DIAC_FLAG_NONE }, | 50 | DIAC_RANGE_ENTRY(0x0591, 0x05be, 1), |
51 | { 0x0489, DIAC_FLAG_DIACRITIC }, /* Cyrillic */ | 51 | DIAC_RANGE_ENTRY(0x05bf, 0x05c0, 1), |
52 | { 0x0590, DIAC_FLAG_NONE }, | 52 | DIAC_RANGE_ENTRY(0x05c1, 0x05c3, 1), |
53 | { 0x05bd, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */ | 53 | DIAC_RANGE_ENTRY(0x05c4, 0x05c6, 1), |
54 | { 0x05be, DIAC_FLAG_RTL }, | 54 | DIAC_RANGE_ENTRY(0x05c7, 0x05c8, 1), |
55 | { 0x05bf, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */ | 55 | DIAC_RANGE_ENTRY(0x0610, 0x061b, 1), |
56 | { 0x05c0, DIAC_FLAG_RTL }, | 56 | DIAC_RANGE_ENTRY(0x064b, 0x065f, 1), |
57 | { 0x05c2, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */ | 57 | DIAC_RANGE_ENTRY(0x0670, 0x0671, 1), |
58 | { 0x05c3, DIAC_FLAG_RTL }, | 58 | DIAC_RANGE_ENTRY(0x06d6, 0x06dd, 1), |
59 | { 0x05c5, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */ | 59 | DIAC_RANGE_ENTRY(0x06df, 0x06e5, 1), |
60 | { 0x05c6, DIAC_FLAG_RTL }, | 60 | DIAC_RANGE_ENTRY(0x06e7, 0x06e9, 1), |
61 | { 0x05c7, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */ | 61 | DIAC_RANGE_ENTRY(0x06ea, 0x06ee, 1), |
62 | { 0x060f, DIAC_FLAG_RTL }, | 62 | DIAC_RANGE_ENTRY(0x0711, 0x0712, 1), |
63 | { 0x061a, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 63 | DIAC_RANGE_ENTRY(0x0730, 0x074b, 1), |
64 | { 0x064a, DIAC_FLAG_RTL }, | 64 | DIAC_RANGE_ENTRY(0x07a6, 0x07b1, 1), |
65 | { 0x065e, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 65 | DIAC_RANGE_ENTRY(0x07bf, 0x07c0, 0), |
66 | { 0x066f, DIAC_FLAG_RTL }, | 66 | DIAC_RANGE_ENTRY(0x07eb, 0x07f4, 0), |
67 | { 0x0670, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 67 | DIAC_RANGE_ENTRY(0x0816, 0x081a, 0), |
68 | { 0x06d5, DIAC_FLAG_RTL }, | 68 | DIAC_RANGE_ENTRY(0x081b, 0x0824, 0), |
69 | { 0x06dc, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 69 | DIAC_RANGE_ENTRY(0x0825, 0x0828, 0), |
70 | { 0x06de, DIAC_FLAG_RTL }, | 70 | DIAC_RANGE_ENTRY(0x0829, 0x082e, 0), |
71 | { 0x06e4, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 71 | DIAC_RANGE_ENTRY(0x0900, 0x0904, 0), |
72 | { 0x06e6, DIAC_FLAG_RTL }, | 72 | DIAC_RANGE_ENTRY(0x093c, 0x093d, 0), |
73 | { 0x06e8, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 73 | DIAC_RANGE_ENTRY(0x093e, 0x094f, 0), |
74 | { 0x06e9, DIAC_FLAG_RTL }, | 74 | DIAC_RANGE_ENTRY(0x0951, 0x0956, 0), |
75 | { 0x06ed, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */ | 75 | DIAC_RANGE_ENTRY(0x0962, 0x0964, 0), |
76 | { 0x0710, DIAC_FLAG_RTL }, | 76 | DIAC_RANGE_ENTRY(0x0981, 0x0984, 0), |
77 | { 0x0711, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Syriac */ | 77 | DIAC_RANGE_ENTRY(0x09bc, 0x09bd, 0), |
78 | { 0x072f, DIAC_FLAG_RTL }, | 78 | DIAC_RANGE_ENTRY(0x09be, 0x09ce, 0), |
79 | { 0x074a, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Syriac */ | 79 | DIAC_RANGE_ENTRY(0x09d7, 0x09d8, 0), |
80 | { 0x07a5, DIAC_FLAG_RTL }, | 80 | DIAC_RANGE_ENTRY(0x09e2, 0x09e4, 0), |
81 | { 0x07b0, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Thaana */ | 81 | DIAC_RANGE_ENTRY(0x0a01, 0x0a04, 0), |
82 | { 0x07c0, DIAC_FLAG_RTL }, | 82 | DIAC_RANGE_ENTRY(0x0a3c, 0x0a52, 0), |
83 | { 0x07ea, DIAC_FLAG_NONE }, | 83 | DIAC_RANGE_ENTRY(0x0a70, 0x0a72, 0), |
84 | { 0x07f3, DIAC_FLAG_DIACRITIC }, /* NKo */ | 84 | DIAC_RANGE_ENTRY(0x0a75, 0x0a76, 0), |
85 | { 0x0815, DIAC_FLAG_NONE }, | 85 | DIAC_RANGE_ENTRY(0x0a81, 0x0a84, 0), |
86 | { 0x0819, DIAC_FLAG_DIACRITIC }, /* Samaritan */ | 86 | DIAC_RANGE_ENTRY(0x0abc, 0x0abd, 0), |
87 | { 0x081a, DIAC_FLAG_NONE }, | 87 | DIAC_RANGE_ENTRY(0x0abe, 0x0ace, 0), |
88 | { 0x0823, DIAC_FLAG_DIACRITIC }, /* Samaritan */ | 88 | DIAC_RANGE_ENTRY(0x0ae2, 0x0ae4, 0), |
89 | { 0x0824, DIAC_FLAG_NONE }, | 89 | DIAC_RANGE_ENTRY(0x0b01, 0x0b04, 0), |
90 | { 0x0827, DIAC_FLAG_DIACRITIC }, /* Samaritan */ | 90 | DIAC_RANGE_ENTRY(0x0b3c, 0x0b3d, 0), |
91 | { 0x0828, DIAC_FLAG_NONE }, | 91 | DIAC_RANGE_ENTRY(0x0b3e, 0x0b58, 0), |
92 | { 0x082d, DIAC_FLAG_DIACRITIC }, /* Samaritan */ | 92 | DIAC_RANGE_ENTRY(0x0b82, 0x0b83, 0), |
93 | { 0x08ff, DIAC_FLAG_NONE }, | 93 | DIAC_RANGE_ENTRY(0x0bbe, 0x0bce, 0), |
94 | { 0x0903, DIAC_FLAG_DIACRITIC }, /* Devanagari */ | 94 | DIAC_RANGE_ENTRY(0x0bd7, 0x0bd8, 0), |
95 | { 0x093b, DIAC_FLAG_NONE }, | 95 | DIAC_RANGE_ENTRY(0x0c01, 0x0c04, 0), |
96 | { 0x093c, DIAC_FLAG_DIACRITIC }, /* Devanagari */ | 96 | DIAC_RANGE_ENTRY(0x0c3e, 0x0c57, 0), |
97 | { 0x093d, DIAC_FLAG_NONE }, | 97 | DIAC_RANGE_ENTRY(0x0c62, 0x0c64, 0), |
98 | { 0x094e, DIAC_FLAG_DIACRITIC }, /* Devanagari */ | 98 | DIAC_RANGE_ENTRY(0x0c82, 0x0c84, 0), |
99 | { 0x0950, DIAC_FLAG_NONE }, | 99 | DIAC_RANGE_ENTRY(0x0cbc, 0x0cbd, 0), |
100 | { 0x0955, DIAC_FLAG_DIACRITIC }, /* Devanagari */ | 100 | DIAC_RANGE_ENTRY(0x0cbe, 0x0cd7, 0), |
101 | { 0x0961, DIAC_FLAG_NONE }, | 101 | DIAC_RANGE_ENTRY(0x0ce2, 0x0ce4, 0), |
102 | { 0x0963, DIAC_FLAG_DIACRITIC }, /* Devanagari */ | 102 | DIAC_RANGE_ENTRY(0x0d02, 0x0d04, 0), |
103 | { 0x0980, DIAC_FLAG_NONE }, | 103 | DIAC_RANGE_ENTRY(0x0d3e, 0x0d58, 0), |
104 | { 0x0983, DIAC_FLAG_DIACRITIC }, /* Bengali */ | 104 | DIAC_RANGE_ENTRY(0x0d62, 0x0d64, 0), |
105 | { 0x09bb, DIAC_FLAG_NONE }, | 105 | DIAC_RANGE_ENTRY(0x0d82, 0x0d84, 0), |
106 | { 0x09bc, DIAC_FLAG_DIACRITIC }, /* Bengali */ | 106 | DIAC_RANGE_ENTRY(0x0dca, 0x0df4, 0), |
107 | { 0x09bd, DIAC_FLAG_NONE }, | 107 | DIAC_RANGE_ENTRY(0x0e31, 0x0e32, 0), |
108 | { 0x09cd, DIAC_FLAG_DIACRITIC }, /* Bengali */ | 108 | DIAC_RANGE_ENTRY(0x0e34, 0x0e3b, 0), |
109 | { 0x09d6, DIAC_FLAG_NONE }, | 109 | DIAC_RANGE_ENTRY(0x0e47, 0x0e4f, 0), |
110 | { 0x09d7, DIAC_FLAG_DIACRITIC }, /* Bengali */ | 110 | DIAC_RANGE_ENTRY(0x0eb1, 0x0eb2, 0), |
111 | { 0x09e1, DIAC_FLAG_NONE }, | 111 | DIAC_RANGE_ENTRY(0x0eb4, 0x0ebd, 0), |
112 | { 0x09e3, DIAC_FLAG_DIACRITIC }, /* Bengali */ | 112 | DIAC_RANGE_ENTRY(0x0ec8, 0x0ece, 0), |
113 | { 0x0a00, DIAC_FLAG_NONE }, | 113 | DIAC_RANGE_ENTRY(0x0f18, 0x0f1a, 0), |
114 | { 0x0a03, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */ | 114 | DIAC_RANGE_ENTRY(0x0f35, 0x0f36, 0), |
115 | { 0x0a3b, DIAC_FLAG_NONE }, | 115 | DIAC_RANGE_ENTRY(0x0f37, 0x0f38, 0), |
116 | { 0x0a51, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */ | 116 | DIAC_RANGE_ENTRY(0x0f39, 0x0f3a, 0), |
117 | { 0x0a6f, DIAC_FLAG_NONE }, | 117 | DIAC_RANGE_ENTRY(0x0f3e, 0x0f40, 0), |
118 | { 0x0a71, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */ | 118 | DIAC_RANGE_ENTRY(0x0f71, 0x0f85, 0), |
119 | { 0x0a74, DIAC_FLAG_NONE }, | 119 | DIAC_RANGE_ENTRY(0x0f86, 0x0f88, 0), |
120 | { 0x0a75, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */ | 120 | DIAC_RANGE_ENTRY(0x0f90, 0x0fbd, 0), |
121 | { 0x0a80, DIAC_FLAG_NONE }, | 121 | DIAC_RANGE_ENTRY(0x102b, 0x103f, 0), |
122 | { 0x0a83, DIAC_FLAG_DIACRITIC }, /* Gujarati */ | 122 | DIAC_RANGE_ENTRY(0x1056, 0x105a, 0), |
123 | { 0x0abb, DIAC_FLAG_NONE }, | 123 | DIAC_RANGE_ENTRY(0x105e, 0x1061, 0), |
124 | { 0x0abc, DIAC_FLAG_DIACRITIC }, /* Gujarati */ | 124 | DIAC_RANGE_ENTRY(0x1062, 0x1065, 0), |
125 | { 0x0abd, DIAC_FLAG_NONE }, | 125 | DIAC_RANGE_ENTRY(0x1067, 0x106e, 0), |
126 | { 0x0acd, DIAC_FLAG_DIACRITIC }, /* Gujarati */ | 126 | DIAC_RANGE_ENTRY(0x1071, 0x1075, 0), |
127 | { 0x0ae1, DIAC_FLAG_NONE }, | 127 | DIAC_RANGE_ENTRY(0x1082, 0x108e, 0), |
128 | { 0x0ae3, DIAC_FLAG_DIACRITIC }, /* Gujarati */ | 128 | DIAC_RANGE_ENTRY(0x108f, 0x1090, 0), |
129 | { 0x0b00, DIAC_FLAG_NONE }, | 129 | DIAC_RANGE_ENTRY(0x109a, 0x109e, 0), |
130 | { 0x0b03, DIAC_FLAG_DIACRITIC }, /* Oriya */ | 130 | DIAC_RANGE_ENTRY(0x135f, 0x1360, 0), |
131 | { 0x0b3b, DIAC_FLAG_NONE }, | 131 | DIAC_RANGE_ENTRY(0x1712, 0x1715, 0), |
132 | { 0x0b3c, DIAC_FLAG_DIACRITIC }, /* Oriya */ | 132 | DIAC_RANGE_ENTRY(0x1732, 0x1735, 0), |
133 | { 0x0b3d, DIAC_FLAG_NONE }, | 133 | DIAC_RANGE_ENTRY(0x1752, 0x1754, 0), |
134 | { 0x0b57, DIAC_FLAG_DIACRITIC }, /* Oriya */ | 134 | DIAC_RANGE_ENTRY(0x1772, 0x1774, 0), |
135 | { 0x0b81, DIAC_FLAG_NONE }, | 135 | DIAC_RANGE_ENTRY(0x17b6, 0x17d4, 0), |
136 | { 0x0b82, DIAC_FLAG_DIACRITIC }, /* Tamil */ | 136 | DIAC_RANGE_ENTRY(0x17dd, 0x17de, 0), |
137 | { 0x0bbd, DIAC_FLAG_NONE }, | 137 | DIAC_RANGE_ENTRY(0x18a9, 0x18aa, 0), |
138 | { 0x0bcd, DIAC_FLAG_DIACRITIC }, /* Tamil */ | 138 | DIAC_RANGE_ENTRY(0x1920, 0x193c, 0), |
139 | { 0x0bd6, DIAC_FLAG_NONE }, | 139 | DIAC_RANGE_ENTRY(0x19b0, 0x19c1, 0), |
140 | { 0x0bd7, DIAC_FLAG_DIACRITIC }, /* Tamil */ | 140 | DIAC_RANGE_ENTRY(0x19c8, 0x19ca, 0), |
141 | { 0x0c00, DIAC_FLAG_NONE }, | 141 | DIAC_RANGE_ENTRY(0x1a17, 0x1a1c, 0), |
142 | { 0x0c03, DIAC_FLAG_DIACRITIC }, /* Telugu */ | 142 | DIAC_RANGE_ENTRY(0x1a55, 0x1a80, 0), |
143 | { 0x0c3d, DIAC_FLAG_NONE }, | 143 | DIAC_RANGE_ENTRY(0x1b00, 0x1b05, 0), |
144 | { 0x0c56, DIAC_FLAG_DIACRITIC }, /* Telugu */ | 144 | DIAC_RANGE_ENTRY(0x1b34, 0x1b45, 0), |
145 | { 0x0c61, DIAC_FLAG_NONE }, | 145 | DIAC_RANGE_ENTRY(0x1b6b, 0x1b74, 0), |
146 | { 0x0c63, DIAC_FLAG_DIACRITIC }, /* Telugu */ | 146 | DIAC_RANGE_ENTRY(0x1b80, 0x1b83, 0), |
147 | { 0x0c81, DIAC_FLAG_NONE }, | 147 | DIAC_RANGE_ENTRY(0x1ba1, 0x1bab, 0), |
148 | { 0x0c83, DIAC_FLAG_DIACRITIC }, /* Kannada */ | 148 | DIAC_RANGE_ENTRY(0x1c24, 0x1c38, 0), |
149 | { 0x0cbb, DIAC_FLAG_NONE }, | 149 | DIAC_RANGE_ENTRY(0x1cd0, 0x1cd3, 0), |
150 | { 0x0cbc, DIAC_FLAG_DIACRITIC }, /* Kannada */ | 150 | DIAC_RANGE_ENTRY(0x1cd4, 0x1ce9, 0), |
151 | { 0x0cbd, DIAC_FLAG_NONE }, | 151 | DIAC_RANGE_ENTRY(0x1ced, 0x1cee, 0), |
152 | { 0x0cd6, DIAC_FLAG_DIACRITIC }, /* Kannada */ | 152 | DIAC_RANGE_ENTRY(0x1cf2, 0x1cf3, 0), |
153 | { 0x0ce1, DIAC_FLAG_NONE }, | 153 | DIAC_RANGE_ENTRY(0x1dc0, 0x1e00, 0), |
154 | { 0x0ce3, DIAC_FLAG_DIACRITIC }, /* Kannada */ | 154 | DIAC_RANGE_ENTRY(0x20d0, 0x20f1, 0), |
155 | { 0x0d01, DIAC_FLAG_NONE }, | 155 | DIAC_RANGE_ENTRY(0x2cef, 0x2cf2, 0), |
156 | { 0x0d03, DIAC_FLAG_DIACRITIC }, /* Malayalam */ | 156 | DIAC_RANGE_ENTRY(0x2de0, 0x2e00, 0), |
157 | { 0x0d3d, DIAC_FLAG_NONE }, | 157 | DIAC_RANGE_ENTRY(0x302a, 0x3030, 0), |
158 | { 0x0d57, DIAC_FLAG_DIACRITIC }, /* Malayalam */ | 158 | DIAC_RANGE_ENTRY(0x3099, 0x309b, 0), |
159 | { 0x0d61, DIAC_FLAG_NONE }, | 159 | DIAC_RANGE_ENTRY(0xa66f, 0xa673, 0), |
160 | { 0x0d63, DIAC_FLAG_DIACRITIC }, /* Malayalam */ | 160 | DIAC_RANGE_ENTRY(0xa67c, 0xa67e, 0), |
161 | { 0x0d81, DIAC_FLAG_NONE }, | 161 | DIAC_RANGE_ENTRY(0xa6f0, 0xa6f2, 0), |
162 | { 0x0d83, DIAC_FLAG_DIACRITIC }, /* Sinhala */ | 162 | DIAC_RANGE_ENTRY(0xa802, 0xa803, 0), |
163 | { 0x0dc9, DIAC_FLAG_NONE }, | 163 | DIAC_RANGE_ENTRY(0xa806, 0xa807, 0), |
164 | { 0x0df3, DIAC_FLAG_DIACRITIC }, /* Sinhala */ | 164 | DIAC_RANGE_ENTRY(0xa80b, 0xa80c, 0), |
165 | { 0x0e30, DIAC_FLAG_NONE }, | 165 | DIAC_RANGE_ENTRY(0xa823, 0xa828, 0), |
166 | { 0x0e31, DIAC_FLAG_DIACRITIC }, /* Thai */ | 166 | DIAC_RANGE_ENTRY(0xa880, 0xa882, 0), |
167 | { 0x0e33, DIAC_FLAG_NONE }, | 167 | DIAC_RANGE_ENTRY(0xa8b4, 0xa8c5, 0), |
168 | { 0x0e3a, DIAC_FLAG_DIACRITIC }, /* Thai */ | 168 | DIAC_RANGE_ENTRY(0xa8e0, 0xa8f2, 0), |
169 | { 0x0e46, DIAC_FLAG_NONE }, | 169 | DIAC_RANGE_ENTRY(0xa926, 0xa92e, 0), |
170 | { 0x0e4e, DIAC_FLAG_DIACRITIC }, /* Thai */ | 170 | DIAC_RANGE_ENTRY(0xa947, 0xa954, 0), |
171 | { 0x0eb0, DIAC_FLAG_NONE }, | 171 | DIAC_RANGE_ENTRY(0xa980, 0xa984, 0), |
172 | { 0x0eb1, DIAC_FLAG_DIACRITIC }, /* Lao */ | 172 | DIAC_RANGE_ENTRY(0xa9b3, 0xa9c1, 0), |
173 | { 0x0eb3, DIAC_FLAG_NONE }, | 173 | DIAC_RANGE_ENTRY(0xaa29, 0xaa37, 0), |
174 | { 0x0ebc, DIAC_FLAG_DIACRITIC }, /* Lao */ | 174 | DIAC_RANGE_ENTRY(0xaa43, 0xaa44, 0), |
175 | { 0x0ec7, DIAC_FLAG_NONE }, | 175 | DIAC_RANGE_ENTRY(0xaa4c, 0xaa4e, 0), |
176 | { 0x0ecd, DIAC_FLAG_DIACRITIC }, /* Lao */ | 176 | DIAC_RANGE_ENTRY(0xaa7b, 0xaa7c, 0), |
177 | { 0x0f17, DIAC_FLAG_NONE }, | 177 | DIAC_RANGE_ENTRY(0xaab0, 0xaab1, 0), |
178 | { 0x0f19, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 178 | DIAC_RANGE_ENTRY(0xaab2, 0xaab5, 0), |
179 | { 0x0f34, DIAC_FLAG_NONE }, | 179 | DIAC_RANGE_ENTRY(0xaab7, 0xaab9, 0), |
180 | { 0x0f35, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 180 | DIAC_RANGE_ENTRY(0xaabe, 0xaac0, 0), |
181 | { 0x0f36, DIAC_FLAG_NONE }, | 181 | DIAC_RANGE_ENTRY(0xaac1, 0xaac2, 0), |
182 | { 0x0f37, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 182 | DIAC_RANGE_ENTRY(0xabe3, 0xabeb, 0), |
183 | { 0x0f38, DIAC_FLAG_NONE }, | 183 | DIAC_RANGE_ENTRY(0xabec, 0xabee, 0), |
184 | { 0x0f39, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 184 | DIAC_RANGE_ENTRY(0xfb1e, 0xfb1f, 0), |
185 | { 0x0f3d, DIAC_FLAG_NONE }, | 185 | DIAC_RANGE_ENTRY(0xfe20, 0xfe27, 0), |
186 | { 0x0f3f, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 186 | DIAC_RANGE_ENTRY(0xfe70, 0xfe70, 1), |
187 | { 0x0f70, DIAC_FLAG_NONE }, | 187 | DIAC_RANGE_ENTRY(0xff00, 0xff00, 0), |
188 | { 0x0f84, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | 188 | DIAC_RANGE_ENTRY(0xffff, 0xffff, 0), |
189 | { 0x0f85, DIAC_FLAG_NONE }, | ||
190 | { 0x0f87, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | ||
191 | { 0x0f8f, DIAC_FLAG_NONE }, | ||
192 | { 0x0fbc, DIAC_FLAG_DIACRITIC }, /* Tibetan */ | ||
193 | { 0x102a, DIAC_FLAG_NONE }, | ||
194 | { 0x103e, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
195 | { 0x1055, DIAC_FLAG_NONE }, | ||
196 | { 0x1059, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
197 | { 0x105d, DIAC_FLAG_NONE }, | ||
198 | { 0x1060, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
199 | { 0x1061, DIAC_FLAG_NONE }, | ||
200 | { 0x1064, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
201 | { 0x1066, DIAC_FLAG_NONE }, | ||
202 | { 0x106d, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
203 | { 0x1070, DIAC_FLAG_NONE }, | ||
204 | { 0x1074, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
205 | { 0x1081, DIAC_FLAG_NONE }, | ||
206 | { 0x108d, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
207 | { 0x108e, DIAC_FLAG_NONE }, | ||
208 | { 0x108f, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
209 | { 0x1099, DIAC_FLAG_NONE }, | ||
210 | { 0x109d, DIAC_FLAG_DIACRITIC }, /* Myanmar */ | ||
211 | { 0x135e, DIAC_FLAG_NONE }, | ||
212 | { 0x135f, DIAC_FLAG_DIACRITIC }, /* Ethiopic */ | ||
213 | { 0x1711, DIAC_FLAG_NONE }, | ||
214 | { 0x1714, DIAC_FLAG_DIACRITIC }, /* Tagalog */ | ||
215 | { 0x1731, DIAC_FLAG_NONE }, | ||
216 | { 0x1734, DIAC_FLAG_DIACRITIC }, /* Hanunoo */ | ||
217 | { 0x1751, DIAC_FLAG_NONE }, | ||
218 | { 0x1753, DIAC_FLAG_DIACRITIC }, /* Buhid */ | ||
219 | { 0x1771, DIAC_FLAG_NONE }, | ||
220 | { 0x1773, DIAC_FLAG_DIACRITIC }, /* Tagbanwa */ | ||
221 | { 0x17b5, DIAC_FLAG_NONE }, | ||
222 | { 0x17d3, DIAC_FLAG_DIACRITIC }, /* Khmer */ | ||
223 | { 0x17dc, DIAC_FLAG_NONE }, | ||
224 | { 0x17dd, DIAC_FLAG_DIACRITIC }, /* Khmer */ | ||
225 | { 0x18a8, DIAC_FLAG_NONE }, | ||
226 | { 0x18a9, DIAC_FLAG_DIACRITIC }, /* Mongolian */ | ||
227 | { 0x191f, DIAC_FLAG_NONE }, | ||
228 | { 0x193b, DIAC_FLAG_DIACRITIC }, /* Limbu */ | ||
229 | { 0x19af, DIAC_FLAG_NONE }, | ||
230 | { 0x19c0, DIAC_FLAG_DIACRITIC }, /* New Tai Lue */ | ||
231 | { 0x19c7, DIAC_FLAG_NONE }, | ||
232 | { 0x19c9, DIAC_FLAG_DIACRITIC }, /* New Tai Lue */ | ||
233 | { 0x1a16, DIAC_FLAG_NONE }, | ||
234 | { 0x1a1b, DIAC_FLAG_DIACRITIC }, /* Buginese */ | ||
235 | { 0x1a54, DIAC_FLAG_NONE }, | ||
236 | { 0x1a7f, DIAC_FLAG_DIACRITIC }, /* Tai Tham */ | ||
237 | { 0x1aff, DIAC_FLAG_NONE }, | ||
238 | { 0x1b04, DIAC_FLAG_DIACRITIC }, /* Balinese */ | ||
239 | { 0x1b33, DIAC_FLAG_NONE }, | ||
240 | { 0x1b44, DIAC_FLAG_DIACRITIC }, /* Balinese */ | ||
241 | { 0x1b6a, DIAC_FLAG_NONE }, | ||
242 | { 0x1b73, DIAC_FLAG_DIACRITIC }, /* Balinese */ | ||
243 | { 0x1b7f, DIAC_FLAG_NONE }, | ||
244 | { 0x1b82, DIAC_FLAG_DIACRITIC }, /* Sundanese */ | ||
245 | { 0x1ba0, DIAC_FLAG_NONE }, | ||
246 | { 0x1baa, DIAC_FLAG_DIACRITIC }, /* Sundanese */ | ||
247 | { 0x1c23, DIAC_FLAG_NONE }, | ||
248 | { 0x1c37, DIAC_FLAG_DIACRITIC }, /* Lepcha */ | ||
249 | { 0x1ccf, DIAC_FLAG_NONE }, | ||
250 | { 0x1cd2, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */ | ||
251 | { 0x1cd3, DIAC_FLAG_NONE }, | ||
252 | { 0x1ce8, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */ | ||
253 | { 0x1cec, DIAC_FLAG_NONE }, | ||
254 | { 0x1ced, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */ | ||
255 | { 0x1cf1, DIAC_FLAG_NONE }, | ||
256 | { 0x1cf2, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */ | ||
257 | { 0x1dbf, DIAC_FLAG_NONE }, | ||
258 | { 0x1dff, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks Supplement */ | ||
259 | { 0x20cf, DIAC_FLAG_NONE }, | ||
260 | { 0x20f0, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks for Symbols */ | ||
261 | { 0x2cee, DIAC_FLAG_NONE }, | ||
262 | { 0x2cf1, DIAC_FLAG_DIACRITIC }, /* Coptic */ | ||
263 | { 0x2ddf, DIAC_FLAG_NONE }, | ||
264 | { 0x2dff, DIAC_FLAG_DIACRITIC }, /* Coptic */ | ||
265 | { 0x3029, DIAC_FLAG_NONE }, | ||
266 | { 0x302f, DIAC_FLAG_DIACRITIC }, /* CJK Symbols and Punctuation */ | ||
267 | { 0x3098, DIAC_FLAG_NONE }, | ||
268 | { 0x309a, DIAC_FLAG_DIACRITIC }, /* Hiragana */ | ||
269 | { 0xa66e, DIAC_FLAG_NONE }, | ||
270 | { 0xa672, DIAC_FLAG_DIACRITIC }, /* Hiragana */ | ||
271 | { 0xa67b, DIAC_FLAG_NONE }, | ||
272 | { 0xa67d, DIAC_FLAG_DIACRITIC }, /* Hiragana */ | ||
273 | { 0xa6ef, DIAC_FLAG_NONE }, | ||
274 | { 0xa6f1, DIAC_FLAG_DIACRITIC }, /* Bamum */ | ||
275 | { 0xa801, DIAC_FLAG_NONE }, | ||
276 | { 0xa802, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */ | ||
277 | { 0xa805, DIAC_FLAG_NONE }, | ||
278 | { 0xa806, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */ | ||
279 | { 0xa80a, DIAC_FLAG_NONE }, | ||
280 | { 0xa80b, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */ | ||
281 | { 0xa822, DIAC_FLAG_NONE }, | ||
282 | { 0xa827, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */ | ||
283 | { 0xa87f, DIAC_FLAG_NONE }, | ||
284 | { 0xa881, DIAC_FLAG_DIACRITIC }, /* Saurashtra */ | ||
285 | { 0xa8b3, DIAC_FLAG_NONE }, | ||
286 | { 0xa8c4, DIAC_FLAG_DIACRITIC }, /* Saurashtra */ | ||
287 | { 0xa8df, DIAC_FLAG_NONE }, | ||
288 | { 0xa8f1, DIAC_FLAG_DIACRITIC }, /* Devanagari Extended */ | ||
289 | { 0xa925, DIAC_FLAG_NONE }, | ||
290 | { 0xa92d, DIAC_FLAG_DIACRITIC }, /* Kayah Li */ | ||
291 | { 0xa946, DIAC_FLAG_NONE }, | ||
292 | { 0xa953, DIAC_FLAG_DIACRITIC }, /* Rejang */ | ||
293 | { 0xa97f, DIAC_FLAG_NONE }, | ||
294 | { 0xa983, DIAC_FLAG_DIACRITIC }, /* Javanese */ | ||
295 | { 0xa9b2, DIAC_FLAG_NONE }, | ||
296 | { 0xa9c0, DIAC_FLAG_DIACRITIC }, /* Javanese */ | ||
297 | { 0xaa28, DIAC_FLAG_NONE }, | ||
298 | { 0xaa36, DIAC_FLAG_DIACRITIC }, /* Cham */ | ||
299 | { 0xaa42, DIAC_FLAG_NONE }, | ||
300 | { 0xaa43, DIAC_FLAG_DIACRITIC }, /* Cham */ | ||
301 | { 0xaa4b, DIAC_FLAG_NONE }, | ||
302 | { 0xaa4d, DIAC_FLAG_DIACRITIC }, /* Cham */ | ||
303 | { 0xaa7a, DIAC_FLAG_NONE }, | ||
304 | { 0xaa7b, DIAC_FLAG_DIACRITIC }, /* Cham */ | ||
305 | { 0xaaaf, DIAC_FLAG_NONE }, | ||
306 | { 0xaab0, DIAC_FLAG_DIACRITIC }, /* Tai Viet */ | ||
307 | { 0xaab1, DIAC_FLAG_NONE }, | ||
308 | { 0xaab4, DIAC_FLAG_DIACRITIC }, /* Tai Viet */ | ||
309 | { 0xaab6, DIAC_FLAG_NONE }, | ||
310 | { 0xaab8, DIAC_FLAG_DIACRITIC }, /* Tai Viet */ | ||
311 | { 0xaabd, DIAC_FLAG_NONE }, | ||
312 | { 0xaabf, DIAC_FLAG_DIACRITIC }, /* Tai Viet */ | ||
313 | { 0xaac0, DIAC_FLAG_NONE }, | ||
314 | { 0xaac1, DIAC_FLAG_DIACRITIC }, /* Tai Viet */ | ||
315 | { 0xabe2, DIAC_FLAG_NONE }, | ||
316 | { 0xabea, DIAC_FLAG_DIACRITIC }, /* Meetei Mayek */ | ||
317 | { 0xabeb, DIAC_FLAG_NONE }, | ||
318 | { 0xabed, DIAC_FLAG_DIACRITIC }, /* Meetei Mayek */ | ||
319 | { 0xfb1d, DIAC_FLAG_NONE }, | ||
320 | { 0xfb1e, DIAC_FLAG_DIACRITIC }, /* Alphabetic Presentation Forms */ | ||
321 | { 0xfe1f, DIAC_FLAG_NONE }, | ||
322 | { 0xfe26, DIAC_FLAG_DIACRITIC }, /* Combining Half Marks */ | ||
323 | /* Currently we don't support chars above U-FFFF */ | ||
324 | { 0xffff, DIAC_FLAG_NONE }, | ||
325 | #if 0 | ||
326 | { 0x1107f, DIAC_FLAG_NONE }, | ||
327 | { 0x11082, DIAC_FLAG_DIACRITIC }, /* Kaithi */ | ||
328 | { 0x110af, DIAC_FLAG_NONE }, | ||
329 | { 0x110ba, DIAC_FLAG_DIACRITIC }, /* Kaithi */ | ||
330 | { 0x1d164, DIAC_FLAG_NONE }, | ||
331 | { 0x1d169, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */ | ||
332 | { 0x1d16c, DIAC_FLAG_NONE }, | ||
333 | { 0x1d182, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */ | ||
334 | { 0x1d184, DIAC_FLAG_NONE }, | ||
335 | { 0x1d18b, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */ | ||
336 | { 0x1d1a9, DIAC_FLAG_NONE }, | ||
337 | { 0x1d1ad, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */ | ||
338 | { 0x1d241, DIAC_FLAG_NONE }, | ||
339 | { 0x1d244, DIAC_FLAG_DIACRITIC }, /* Ancient Greek Musical Notation */ | ||
340 | { 0xe01ef, DIAC_FLAG_NONE }, | ||
341 | #endif | ||
342 | }; | 189 | }; |
343 | 190 | ||
344 | #define MRU_MAX_LEN 32 | 191 | #define MRU_MAX_LEN 32 |
@@ -349,6 +196,7 @@ static unsigned short diacritic_mru[MRU_MAX_LEN]; | |||
349 | int is_diacritic(const unsigned short char_code, bool *is_rtl) | 196 | int is_diacritic(const unsigned short char_code, bool *is_rtl) |
350 | { | 197 | { |
351 | unsigned short mru, i; | 198 | unsigned short mru, i; |
199 | const struct diac_range *diac; | ||
352 | 200 | ||
353 | /* Search in MRU */ | 201 | /* Search in MRU */ |
354 | for (mru = 0; mru < mru_len; mru++) | 202 | for (mru = 0; mru < mru_len; mru++) |
@@ -356,15 +204,18 @@ int is_diacritic(const unsigned short char_code, bool *is_rtl) | |||
356 | i = diacritic_mru[mru]; | 204 | i = diacritic_mru[mru]; |
357 | 205 | ||
358 | /* Found in MRU */ | 206 | /* Found in MRU */ |
359 | if (DIAC_VAL(i - 1) < char_code && char_code <= DIAC_VAL(i)) | 207 | if (diac_ranges[i].base <= char_code && |
208 | char_code < diac_ranges[i + 1].base) | ||
209 | { | ||
360 | goto Found; | 210 | goto Found; |
211 | } | ||
361 | } | 212 | } |
362 | 213 | ||
363 | /* Search in DB */ | 214 | /* Search in DB */ |
364 | for (i = 1; i < DIAC_NUM_RANGES; i++) | 215 | for (i = 0; i < DIAC_NUM_RANGES - 1; i++) |
365 | { | 216 | { |
366 | /* Found */ | 217 | /* Found */ |
367 | if (char_code <= DIAC_VAL(i)) | 218 | if (char_code < diac_ranges[i + 1].base) |
368 | break; | 219 | break; |
369 | } | 220 | } |
370 | 221 | ||
@@ -380,9 +231,11 @@ Found: | |||
380 | diacritic_mru[mru] = diacritic_mru[mru - 1]; | 231 | diacritic_mru[mru] = diacritic_mru[mru - 1]; |
381 | diacritic_mru[0] = i; | 232 | diacritic_mru[0] = i; |
382 | 233 | ||
234 | diac = &diac_ranges[i]; | ||
235 | |||
383 | /* Update RTL */ | 236 | /* Update RTL */ |
384 | if (is_rtl) | 237 | if (is_rtl) |
385 | *is_rtl = DIAC_IS_RTL(i); | 238 | *is_rtl = diac->is_rtl; |
386 | 239 | ||
387 | return DIAC_IS_DIACRITIC(i); | 240 | return (char_code < diac->base + diac->num_diacritics); |
388 | } | 241 | } |