• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #line 1 "hb-ot-shape-complex-use-machine.rl"
3 /*
4  * Copyright © 2015  Mozilla Foundation.
5  * Copyright © 2015  Google, Inc.
6  *
7  *  This is part of HarfBuzz, a text shaping library.
8  *
9  * Permission is hereby granted, without written agreement and without
10  * license or royalty fees, to use, copy, modify, and distribute this
11  * software and its documentation for any purpose, provided that the
12  * above copyright notice and the following two paragraphs appear in
13  * all copies of this software.
14  *
15  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
16  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
17  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
18  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
19  * DAMAGE.
20  *
21  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
22  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
23  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
24  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
25  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
26  *
27  * Mozilla Author(s): Jonathan Kew
28  * Google Author(s): Behdad Esfahbod
29  */
30 
31 #ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
32 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
33 
34 #include "hb.hh"
35 
36 #include "hb-ot-shape-complex-syllabic.hh"
37 
38 /* buffer var allocations */
39 #define use_category() complex_var_u8_category()
40 
41 #define USE(Cat) use_syllable_machine_ex_##Cat
42 
43 enum use_syllable_type_t {
44   use_virama_terminated_cluster,
45   use_sakot_terminated_cluster,
46   use_standard_cluster,
47   use_number_joiner_terminated_cluster,
48   use_numeral_cluster,
49   use_symbol_cluster,
50   use_hieroglyph_cluster,
51   use_broken_cluster,
52   use_non_cluster,
53 };
54 
55 
56 #line 57 "hb-ot-shape-complex-use-machine.hh"
57 #define use_syllable_machine_ex_B 1u
58 #define use_syllable_machine_ex_CGJ 6u
59 #define use_syllable_machine_ex_CMAbv 31u
60 #define use_syllable_machine_ex_CMBlw 32u
61 #define use_syllable_machine_ex_CS 43u
62 #define use_syllable_machine_ex_FAbv 24u
63 #define use_syllable_machine_ex_FBlw 25u
64 #define use_syllable_machine_ex_FMAbv 45u
65 #define use_syllable_machine_ex_FMBlw 46u
66 #define use_syllable_machine_ex_FMPst 47u
67 #define use_syllable_machine_ex_FPst 26u
68 #define use_syllable_machine_ex_G 49u
69 #define use_syllable_machine_ex_GB 5u
70 #define use_syllable_machine_ex_H 12u
71 #define use_syllable_machine_ex_HN 13u
72 #define use_syllable_machine_ex_HVM 44u
73 #define use_syllable_machine_ex_J 50u
74 #define use_syllable_machine_ex_MAbv 27u
75 #define use_syllable_machine_ex_MBlw 28u
76 #define use_syllable_machine_ex_MPre 30u
77 #define use_syllable_machine_ex_MPst 29u
78 #define use_syllable_machine_ex_N 4u
79 #define use_syllable_machine_ex_O 0u
80 #define use_syllable_machine_ex_R 18u
81 #define use_syllable_machine_ex_SB 51u
82 #define use_syllable_machine_ex_SE 52u
83 #define use_syllable_machine_ex_SMAbv 41u
84 #define use_syllable_machine_ex_SMBlw 42u
85 #define use_syllable_machine_ex_SUB 11u
86 #define use_syllable_machine_ex_Sk 48u
87 #define use_syllable_machine_ex_VAbv 33u
88 #define use_syllable_machine_ex_VBlw 34u
89 #define use_syllable_machine_ex_VMAbv 37u
90 #define use_syllable_machine_ex_VMBlw 38u
91 #define use_syllable_machine_ex_VMPre 23u
92 #define use_syllable_machine_ex_VMPst 39u
93 #define use_syllable_machine_ex_VPre 22u
94 #define use_syllable_machine_ex_VPst 35u
95 #define use_syllable_machine_ex_ZWNJ 14u
96 
97 
98 #line 99 "hb-ot-shape-complex-use-machine.hh"
99 static const unsigned char _use_syllable_machine_trans_keys[] = {
100 	0u, 51u, 41u, 42u, 42u, 42u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u,
101 	24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u,
102 	1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u,
103 	11u, 48u, 1u, 48u, 13u, 13u, 4u, 4u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u,
104 	23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u,
105 	24u, 48u, 1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u,
106 	22u, 48u, 11u, 48u, 1u, 48u, 4u, 4u, 13u, 13u, 1u, 48u, 11u, 48u, 41u, 42u,
107 	42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, 0
108 };
109 
110 static const char _use_syllable_machine_key_spans[] = {
111 	52, 2, 1, 38, 38, 1, 27, 26,
112 	24, 23, 22, 2, 1, 25, 25, 25,
113 	1, 25, 26, 26, 26, 27, 27, 27,
114 	38, 48, 1, 1, 38, 38, 1, 27,
115 	26, 24, 23, 22, 2, 1, 25, 25,
116 	25, 1, 25, 26, 26, 26, 27, 27,
117 	27, 38, 48, 1, 1, 48, 38, 2,
118 	1, 5, 3, 4, 3
119 };
120 
121 static const short _use_syllable_machine_index_offsets[] = {
122 	0, 53, 56, 58, 97, 136, 138, 166,
123 	193, 218, 242, 265, 268, 270, 296, 322,
124 	348, 350, 376, 403, 430, 457, 485, 513,
125 	541, 580, 629, 631, 633, 672, 711, 713,
126 	741, 768, 793, 817, 840, 843, 845, 871,
127 	897, 923, 925, 951, 978, 1005, 1032, 1060,
128 	1088, 1116, 1155, 1204, 1206, 1208, 1257, 1296,
129 	1299, 1301, 1307, 1311, 1316
130 };
131 
132 static const char _use_syllable_machine_indicies[] = {
133 	0, 1, 2, 2, 3, 4, 2, 2,
134 	2, 2, 2, 5, 6, 7, 2, 2,
135 	2, 2, 8, 2, 2, 2, 9, 10,
136 	11, 12, 13, 14, 15, 9, 16, 17,
137 	18, 19, 20, 21, 2, 22, 23, 24,
138 	2, 25, 26, 27, 28, 29, 30, 31,
139 	6, 32, 2, 33, 2, 0, 35, 34,
140 	35, 34, 37, 38, 36, 36, 36, 36,
141 	36, 36, 36, 36, 36, 39, 40, 41,
142 	42, 43, 44, 45, 39, 46, 1, 47,
143 	48, 49, 50, 36, 51, 52, 53, 36,
144 	36, 36, 36, 54, 55, 56, 57, 38,
145 	36, 37, 38, 36, 36, 36, 36, 36,
146 	36, 36, 36, 36, 39, 40, 41, 42,
147 	43, 44, 45, 39, 46, 47, 47, 48,
148 	49, 50, 36, 51, 52, 53, 36, 36,
149 	36, 36, 54, 55, 56, 57, 38, 36,
150 	37, 58, 39, 40, 41, 42, 43, 36,
151 	36, 36, 36, 36, 36, 48, 49, 50,
152 	36, 51, 52, 53, 36, 36, 36, 36,
153 	40, 55, 56, 57, 59, 36, 40, 41,
154 	42, 43, 36, 36, 36, 36, 36, 36,
155 	36, 36, 36, 36, 51, 52, 53, 36,
156 	36, 36, 36, 36, 55, 56, 57, 59,
157 	36, 41, 42, 43, 36, 36, 36, 36,
158 	36, 36, 36, 36, 36, 36, 36, 36,
159 	36, 36, 36, 36, 36, 36, 55, 56,
160 	57, 36, 42, 43, 36, 36, 36, 36,
161 	36, 36, 36, 36, 36, 36, 36, 36,
162 	36, 36, 36, 36, 36, 36, 55, 56,
163 	57, 36, 43, 36, 36, 36, 36, 36,
164 	36, 36, 36, 36, 36, 36, 36, 36,
165 	36, 36, 36, 36, 36, 55, 56, 57,
166 	36, 55, 56, 36, 56, 36, 41, 42,
167 	43, 36, 36, 36, 36, 36, 36, 36,
168 	36, 36, 36, 51, 52, 53, 36, 36,
169 	36, 36, 36, 55, 56, 57, 59, 36,
170 	41, 42, 43, 36, 36, 36, 36, 36,
171 	36, 36, 36, 36, 36, 36, 52, 53,
172 	36, 36, 36, 36, 36, 55, 56, 57,
173 	59, 36, 41, 42, 43, 36, 36, 36,
174 	36, 36, 36, 36, 36, 36, 36, 36,
175 	36, 53, 36, 36, 36, 36, 36, 55,
176 	56, 57, 59, 36, 61, 60, 41, 42,
177 	43, 36, 36, 36, 36, 36, 36, 36,
178 	36, 36, 36, 36, 36, 36, 36, 36,
179 	36, 36, 36, 55, 56, 57, 59, 36,
180 	40, 41, 42, 43, 36, 36, 36, 36,
181 	36, 36, 48, 49, 50, 36, 51, 52,
182 	53, 36, 36, 36, 36, 40, 55, 56,
183 	57, 59, 36, 40, 41, 42, 43, 36,
184 	36, 36, 36, 36, 36, 36, 49, 50,
185 	36, 51, 52, 53, 36, 36, 36, 36,
186 	40, 55, 56, 57, 59, 36, 40, 41,
187 	42, 43, 36, 36, 36, 36, 36, 36,
188 	36, 36, 50, 36, 51, 52, 53, 36,
189 	36, 36, 36, 40, 55, 56, 57, 59,
190 	36, 39, 40, 41, 42, 43, 36, 45,
191 	39, 36, 36, 36, 48, 49, 50, 36,
192 	51, 52, 53, 36, 36, 36, 36, 40,
193 	55, 56, 57, 59, 36, 39, 40, 41,
194 	42, 43, 36, 36, 39, 36, 36, 36,
195 	48, 49, 50, 36, 51, 52, 53, 36,
196 	36, 36, 36, 40, 55, 56, 57, 59,
197 	36, 39, 40, 41, 42, 43, 44, 45,
198 	39, 36, 36, 36, 48, 49, 50, 36,
199 	51, 52, 53, 36, 36, 36, 36, 40,
200 	55, 56, 57, 59, 36, 37, 38, 36,
201 	36, 36, 36, 36, 36, 36, 36, 36,
202 	39, 40, 41, 42, 43, 44, 45, 39,
203 	46, 36, 47, 48, 49, 50, 36, 51,
204 	52, 53, 36, 36, 36, 36, 54, 55,
205 	56, 57, 38, 36, 37, 58, 58, 58,
206 	58, 58, 58, 58, 58, 58, 58, 58,
207 	58, 58, 58, 58, 58, 58, 58, 58,
208 	58, 58, 40, 41, 42, 43, 58, 58,
209 	58, 58, 58, 58, 58, 58, 58, 58,
210 	51, 52, 53, 58, 58, 58, 58, 58,
211 	55, 56, 57, 59, 58, 63, 62, 3,
212 	64, 37, 38, 36, 36, 36, 36, 36,
213 	36, 36, 36, 36, 39, 40, 41, 42,
214 	43, 44, 45, 39, 46, 1, 47, 48,
215 	49, 50, 36, 51, 52, 53, 36, 0,
216 	35, 36, 54, 55, 56, 57, 38, 36,
217 	5, 6, 65, 65, 65, 65, 65, 65,
218 	65, 65, 65, 9, 10, 11, 12, 13,
219 	14, 15, 9, 16, 18, 18, 19, 20,
220 	21, 65, 22, 23, 24, 65, 65, 65,
221 	65, 28, 29, 30, 31, 6, 65, 5,
222 	65, 9, 10, 11, 12, 13, 65, 65,
223 	65, 65, 65, 65, 19, 20, 21, 65,
224 	22, 23, 24, 65, 65, 65, 65, 10,
225 	29, 30, 31, 66, 65, 10, 11, 12,
226 	13, 65, 65, 65, 65, 65, 65, 65,
227 	65, 65, 65, 22, 23, 24, 65, 65,
228 	65, 65, 65, 29, 30, 31, 66, 65,
229 	11, 12, 13, 65, 65, 65, 65, 65,
230 	65, 65, 65, 65, 65, 65, 65, 65,
231 	65, 65, 65, 65, 65, 29, 30, 31,
232 	65, 12, 13, 65, 65, 65, 65, 65,
233 	65, 65, 65, 65, 65, 65, 65, 65,
234 	65, 65, 65, 65, 65, 29, 30, 31,
235 	65, 13, 65, 65, 65, 65, 65, 65,
236 	65, 65, 65, 65, 65, 65, 65, 65,
237 	65, 65, 65, 65, 29, 30, 31, 65,
238 	29, 30, 65, 30, 65, 11, 12, 13,
239 	65, 65, 65, 65, 65, 65, 65, 65,
240 	65, 65, 22, 23, 24, 65, 65, 65,
241 	65, 65, 29, 30, 31, 66, 65, 11,
242 	12, 13, 65, 65, 65, 65, 65, 65,
243 	65, 65, 65, 65, 65, 23, 24, 65,
244 	65, 65, 65, 65, 29, 30, 31, 66,
245 	65, 11, 12, 13, 65, 65, 65, 65,
246 	65, 65, 65, 65, 65, 65, 65, 65,
247 	24, 65, 65, 65, 65, 65, 29, 30,
248 	31, 66, 65, 67, 65, 11, 12, 13,
249 	65, 65, 65, 65, 65, 65, 65, 65,
250 	65, 65, 65, 65, 65, 65, 65, 65,
251 	65, 65, 29, 30, 31, 66, 65, 10,
252 	11, 12, 13, 65, 65, 65, 65, 65,
253 	65, 19, 20, 21, 65, 22, 23, 24,
254 	65, 65, 65, 65, 10, 29, 30, 31,
255 	66, 65, 10, 11, 12, 13, 65, 65,
256 	65, 65, 65, 65, 65, 20, 21, 65,
257 	22, 23, 24, 65, 65, 65, 65, 10,
258 	29, 30, 31, 66, 65, 10, 11, 12,
259 	13, 65, 65, 65, 65, 65, 65, 65,
260 	65, 21, 65, 22, 23, 24, 65, 65,
261 	65, 65, 10, 29, 30, 31, 66, 65,
262 	9, 10, 11, 12, 13, 65, 15, 9,
263 	65, 65, 65, 19, 20, 21, 65, 22,
264 	23, 24, 65, 65, 65, 65, 10, 29,
265 	30, 31, 66, 65, 9, 10, 11, 12,
266 	13, 65, 65, 9, 65, 65, 65, 19,
267 	20, 21, 65, 22, 23, 24, 65, 65,
268 	65, 65, 10, 29, 30, 31, 66, 65,
269 	9, 10, 11, 12, 13, 14, 15, 9,
270 	65, 65, 65, 19, 20, 21, 65, 22,
271 	23, 24, 65, 65, 65, 65, 10, 29,
272 	30, 31, 66, 65, 5, 6, 65, 65,
273 	65, 65, 65, 65, 65, 65, 65, 9,
274 	10, 11, 12, 13, 14, 15, 9, 16,
275 	65, 18, 19, 20, 21, 65, 22, 23,
276 	24, 65, 65, 65, 65, 28, 29, 30,
277 	31, 6, 65, 5, 65, 65, 65, 65,
278 	65, 65, 65, 65, 65, 65, 65, 65,
279 	65, 65, 65, 65, 65, 65, 65, 65,
280 	65, 10, 11, 12, 13, 65, 65, 65,
281 	65, 65, 65, 65, 65, 65, 65, 22,
282 	23, 24, 65, 65, 65, 65, 65, 29,
283 	30, 31, 66, 65, 68, 65, 7, 65,
284 	1, 65, 65, 65, 1, 65, 65, 65,
285 	65, 65, 5, 6, 7, 65, 65, 65,
286 	65, 65, 65, 65, 65, 9, 10, 11,
287 	12, 13, 14, 15, 9, 16, 17, 18,
288 	19, 20, 21, 65, 22, 23, 24, 65,
289 	25, 26, 65, 28, 29, 30, 31, 6,
290 	65, 5, 6, 65, 65, 65, 65, 65,
291 	65, 65, 65, 65, 9, 10, 11, 12,
292 	13, 14, 15, 9, 16, 17, 18, 19,
293 	20, 21, 65, 22, 23, 24, 65, 65,
294 	65, 65, 28, 29, 30, 31, 6, 65,
295 	25, 26, 65, 26, 65, 1, 69, 69,
296 	69, 1, 69, 71, 70, 32, 70, 32,
297 	71, 70, 71, 70, 32, 70, 33, 70,
298 	0
299 };
300 
301 static const char _use_syllable_machine_trans_targs[] = {
302 	1, 3, 0, 26, 28, 29, 30, 51,
303 	53, 31, 32, 33, 34, 35, 46, 47,
304 	48, 54, 49, 43, 44, 45, 38, 39,
305 	40, 55, 56, 57, 50, 36, 37, 0,
306 	58, 60, 0, 2, 0, 4, 5, 6,
307 	7, 8, 9, 10, 21, 22, 23, 24,
308 	18, 19, 20, 13, 14, 15, 25, 11,
309 	12, 0, 0, 16, 0, 17, 0, 27,
310 	0, 0, 41, 42, 52, 0, 0, 59
311 };
312 
313 static const char _use_syllable_machine_trans_actions[] = {
314 	0, 0, 3, 0, 0, 0, 0, 0,
315 	0, 0, 0, 0, 0, 0, 0, 0,
316 	0, 0, 0, 0, 0, 0, 0, 0,
317 	0, 0, 0, 0, 0, 0, 0, 4,
318 	0, 0, 5, 0, 6, 0, 0, 0,
319 	0, 0, 0, 0, 0, 0, 0, 0,
320 	0, 0, 0, 0, 0, 0, 0, 0,
321 	0, 7, 8, 0, 9, 0, 10, 0,
322 	11, 12, 0, 0, 0, 13, 14, 0
323 };
324 
325 static const char _use_syllable_machine_to_state_actions[] = {
326 	1, 0, 0, 0, 0, 0, 0, 0,
327 	0, 0, 0, 0, 0, 0, 0, 0,
328 	0, 0, 0, 0, 0, 0, 0, 0,
329 	0, 0, 0, 0, 0, 0, 0, 0,
330 	0, 0, 0, 0, 0, 0, 0, 0,
331 	0, 0, 0, 0, 0, 0, 0, 0,
332 	0, 0, 0, 0, 0, 0, 0, 0,
333 	0, 0, 0, 0, 0
334 };
335 
336 static const char _use_syllable_machine_from_state_actions[] = {
337 	2, 0, 0, 0, 0, 0, 0, 0,
338 	0, 0, 0, 0, 0, 0, 0, 0,
339 	0, 0, 0, 0, 0, 0, 0, 0,
340 	0, 0, 0, 0, 0, 0, 0, 0,
341 	0, 0, 0, 0, 0, 0, 0, 0,
342 	0, 0, 0, 0, 0, 0, 0, 0,
343 	0, 0, 0, 0, 0, 0, 0, 0,
344 	0, 0, 0, 0, 0
345 };
346 
347 static const short _use_syllable_machine_eof_trans[] = {
348 	0, 35, 35, 37, 37, 59, 37, 37,
349 	37, 37, 37, 37, 37, 37, 37, 37,
350 	61, 37, 37, 37, 37, 37, 37, 37,
351 	37, 59, 63, 65, 37, 66, 66, 66,
352 	66, 66, 66, 66, 66, 66, 66, 66,
353 	66, 66, 66, 66, 66, 66, 66, 66,
354 	66, 66, 66, 66, 66, 66, 66, 66,
355 	66, 70, 71, 71, 71
356 };
357 
358 static const int use_syllable_machine_start = 0;
359 static const int use_syllable_machine_first_final = 0;
360 static const int use_syllable_machine_error = -1;
361 
362 static const int use_syllable_machine_en_main = 0;
363 
364 
365 #line 58 "hb-ot-shape-complex-use-machine.rl"
366 
367 
368 
369 #line 179 "hb-ot-shape-complex-use-machine.rl"
370 
371 
372 #define found_syllable(syllable_type) \
373   HB_STMT_START { \
374     if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
375     for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
376       info[i].syllable() = (syllable_serial << 4) | syllable_type; \
377     syllable_serial++; \
378     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
379   } HB_STMT_END
380 
381 
382 template <typename Iter>
383 struct machine_index_t :
384   hb_iter_with_fallback_t<machine_index_t<Iter>,
385 			  typename Iter::item_t>
386 {
machine_index_tmachine_index_t387   machine_index_t (const Iter& it) : it (it) {}
machine_index_tmachine_index_t388   machine_index_t (const machine_index_t& o) : it (o.it) {}
389 
390   static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
391   static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
392 
__item__machine_index_t393   typename Iter::item_t __item__ () const { return *it; }
__item_at__machine_index_t394   typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
__len__machine_index_t395   unsigned __len__ () const { return it.len (); }
__next__machine_index_t396   void __next__ () { ++it; }
__forward__machine_index_t397   void __forward__ (unsigned n) { it += n; }
__prev__machine_index_t398   void __prev__ () { --it; }
__rewind__machine_index_t399   void __rewind__ (unsigned n) { it -= n; }
operator =machine_index_t400   void operator = (unsigned n)
401   { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
operator =machine_index_t402   void operator = (const machine_index_t& o) { *this = (*o.it).first; }
operator ==machine_index_t403   bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
operator !=machine_index_t404   bool operator != (const machine_index_t& o) const { return !(*this == o); }
405 
406   private:
407   Iter it;
408 };
409 struct
410 {
411   template <typename Iter,
412 	    hb_requires (hb_is_iterable (Iter))>
413   machine_index_t<hb_iter_type<Iter>>
operator ()__anon70fe297a0108414   operator () (Iter&& it) const
415   { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
416 }
417 HB_FUNCOBJ (machine_index);
418 
419 
420 
421 static bool
not_ccs_default_ignorable(const hb_glyph_info_t & i)422 not_ccs_default_ignorable (const hb_glyph_info_t &i)
423 { return !(i.use_category() == USE(CGJ) && _hb_glyph_info_is_default_ignorable (&i)); }
424 
425 static inline void
find_syllables_use(hb_buffer_t * buffer)426 find_syllables_use (hb_buffer_t *buffer)
427 {
428   hb_glyph_info_t *info = buffer->info;
429   auto p =
430     + hb_iter (info, buffer->len)
431     | hb_enumerate
432     | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); },
433 		 hb_second)
434     | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
435 		 {
436 		   if (p.second.use_category() == USE(ZWNJ))
437 		     for (unsigned i = p.first + 1; i < buffer->len; ++i)
438 		       if (not_ccs_default_ignorable (info[i]))
439 			 return !_hb_glyph_info_is_unicode_mark (&info[i]);
440 		   return true;
441 		 })
442     | hb_enumerate
443     | machine_index
444     ;
445   auto pe = p + p.len ();
446   auto eof = +pe;
447   auto ts = +p;
448   auto te = +p;
449   unsigned int act HB_UNUSED;
450   int cs;
451 
452 #line 453 "hb-ot-shape-complex-use-machine.hh"
453 	{
454 	cs = use_syllable_machine_start;
455 	ts = 0;
456 	te = 0;
457 	act = 0;
458 	}
459 
460 #line 263 "hb-ot-shape-complex-use-machine.rl"
461 
462 
463   unsigned int syllable_serial = 1;
464 
465 #line 466 "hb-ot-shape-complex-use-machine.hh"
466 	{
467 	int _slen;
468 	int _trans;
469 	const unsigned char *_keys;
470 	const char *_inds;
471 	if ( p == pe )
472 		goto _test_eof;
473 _resume:
474 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
475 	case 2:
476 #line 1 "NONE"
477 	{ts = p;}
478 	break;
479 #line 480 "hb-ot-shape-complex-use-machine.hh"
480 	}
481 
482 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
483 	_inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
484 
485 	_slen = _use_syllable_machine_key_spans[cs];
486 	_trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) &&
487 		( (*p).second.second.use_category()) <= _keys[1] ?
488 		( (*p).second.second.use_category()) - _keys[0] : _slen ];
489 
490 _eof_trans:
491 	cs = _use_syllable_machine_trans_targs[_trans];
492 
493 	if ( _use_syllable_machine_trans_actions[_trans] == 0 )
494 		goto _again;
495 
496 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
497 	case 7:
498 #line 169 "hb-ot-shape-complex-use-machine.rl"
499 	{te = p+1;{ found_syllable (use_standard_cluster); }}
500 	break;
501 	case 4:
502 #line 174 "hb-ot-shape-complex-use-machine.rl"
503 	{te = p+1;{ found_syllable (use_broken_cluster); }}
504 	break;
505 	case 3:
506 #line 175 "hb-ot-shape-complex-use-machine.rl"
507 	{te = p+1;{ found_syllable (use_non_cluster); }}
508 	break;
509 	case 8:
510 #line 167 "hb-ot-shape-complex-use-machine.rl"
511 	{te = p;p--;{ found_syllable (use_virama_terminated_cluster); }}
512 	break;
513 	case 9:
514 #line 168 "hb-ot-shape-complex-use-machine.rl"
515 	{te = p;p--;{ found_syllable (use_sakot_terminated_cluster); }}
516 	break;
517 	case 6:
518 #line 169 "hb-ot-shape-complex-use-machine.rl"
519 	{te = p;p--;{ found_syllable (use_standard_cluster); }}
520 	break;
521 	case 11:
522 #line 170 "hb-ot-shape-complex-use-machine.rl"
523 	{te = p;p--;{ found_syllable (use_number_joiner_terminated_cluster); }}
524 	break;
525 	case 10:
526 #line 171 "hb-ot-shape-complex-use-machine.rl"
527 	{te = p;p--;{ found_syllable (use_numeral_cluster); }}
528 	break;
529 	case 5:
530 #line 172 "hb-ot-shape-complex-use-machine.rl"
531 	{te = p;p--;{ found_syllable (use_symbol_cluster); }}
532 	break;
533 	case 14:
534 #line 173 "hb-ot-shape-complex-use-machine.rl"
535 	{te = p;p--;{ found_syllable (use_hieroglyph_cluster); }}
536 	break;
537 	case 12:
538 #line 174 "hb-ot-shape-complex-use-machine.rl"
539 	{te = p;p--;{ found_syllable (use_broken_cluster); }}
540 	break;
541 	case 13:
542 #line 175 "hb-ot-shape-complex-use-machine.rl"
543 	{te = p;p--;{ found_syllable (use_non_cluster); }}
544 	break;
545 #line 546 "hb-ot-shape-complex-use-machine.hh"
546 	}
547 
548 _again:
549 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
550 	case 1:
551 #line 1 "NONE"
552 	{ts = 0;}
553 	break;
554 #line 555 "hb-ot-shape-complex-use-machine.hh"
555 	}
556 
557 	if ( ++p != pe )
558 		goto _resume;
559 	_test_eof: {}
560 	if ( p == eof )
561 	{
562 	if ( _use_syllable_machine_eof_trans[cs] > 0 ) {
563 		_trans = _use_syllable_machine_eof_trans[cs] - 1;
564 		goto _eof_trans;
565 	}
566 	}
567 
568 	}
569 
570 #line 268 "hb-ot-shape-complex-use-machine.rl"
571 
572 }
573 
574 #undef found_syllable
575 
576 #endif /* HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH */
577