summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/diacritic.c471
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 */
38struct diac_range 34struct 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 */
45static const struct diac_range diac_ranges[] = 45static 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];
349int is_diacritic(const unsigned short char_code, bool *is_rtl) 196int 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}