xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-shaper-khmer-machine.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1 
2 #line 1 "hb-ot-shaper-khmer-machine.rl"
3 /*
4  * Copyright © 2011,2012  Google, Inc.
5  *
6  *  This is part of HarfBuzz, a text shaping library.
7  *
8  * Permission is hereby granted, without written agreement and without
9  * license or royalty fees, to use, copy, modify, and distribute this
10  * software and its documentation for any purpose, provided that the
11  * above copyright notice and the following two paragraphs appear in
12  * all copies of this software.
13  *
14  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18  * DAMAGE.
19  *
20  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25  *
26  * Google Author(s): Behdad Esfahbod
27  */
28 
29 #ifndef HB_OT_SHAPER_KHMER_MACHINE_HH
30 #define HB_OT_SHAPER_KHMER_MACHINE_HH
31 
32 #include "hb.hh"
33 
34 #include "hb-ot-layout.hh"
35 #include "hb-ot-shaper-indic.hh"
36 
37 /* buffer var allocations */
38 #define khmer_category() ot_shaper_var_u8_category() /* khmer_category_t */
39 
40 using khmer_category_t = unsigned;
41 
42 #define K_Cat(Cat) khmer_syllable_machine_ex_##Cat
43 
44 enum khmer_syllable_type_t {
45   khmer_consonant_syllable,
46   khmer_broken_cluster,
47   khmer_non_khmer_cluster,
48 };
49 
50 
51 #line 52 "hb-ot-shaper-khmer-machine.hh"
52 #define khmer_syllable_machine_ex_C 1u
53 #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u
54 #define khmer_syllable_machine_ex_H 4u
55 #define khmer_syllable_machine_ex_PLACEHOLDER 10u
56 #define khmer_syllable_machine_ex_Ra 15u
57 #define khmer_syllable_machine_ex_Robatic 25u
58 #define khmer_syllable_machine_ex_V 2u
59 #define khmer_syllable_machine_ex_VAbv 20u
60 #define khmer_syllable_machine_ex_VBlw 21u
61 #define khmer_syllable_machine_ex_VPre 22u
62 #define khmer_syllable_machine_ex_VPst 23u
63 #define khmer_syllable_machine_ex_Xgroup 26u
64 #define khmer_syllable_machine_ex_Ygroup 27u
65 #define khmer_syllable_machine_ex_ZWJ 6u
66 #define khmer_syllable_machine_ex_ZWNJ 5u
67 
68 
69 #line 70 "hb-ot-shaper-khmer-machine.hh"
70 static const unsigned char _khmer_syllable_machine_trans_keys[] = {
71 	5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u,
72 	5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u,
73 	5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 27u, 4u, 27u, 1u, 15u,
74 	4u, 27u, 4u, 27u, 27u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 4u, 27u, 4u, 27u,
75 	4u, 27u, 1u, 15u, 4u, 27u, 4u, 27u, 27u, 27u, 4u, 27u, 4u, 27u, 4u, 27u,
76 	4u, 27u, 4u, 27u, 5u, 26u, 0
77 };
78 
79 static const char _khmer_syllable_machine_key_spans[] = {
80 	22, 22, 15, 22, 22, 22, 22, 22,
81 	22, 22, 22, 22, 22, 15, 22, 22,
82 	22, 22, 22, 22, 22, 27, 24, 15,
83 	24, 24, 1, 24, 24, 24, 24, 24,
84 	24, 15, 24, 24, 1, 24, 24, 24,
85 	24, 24, 22
86 };
87 
88 static const short _khmer_syllable_machine_index_offsets[] = {
89 	0, 23, 46, 62, 85, 108, 131, 154,
90 	177, 200, 223, 246, 269, 292, 308, 331,
91 	354, 377, 400, 423, 446, 469, 497, 522,
92 	538, 563, 588, 590, 615, 640, 665, 690,
93 	715, 740, 756, 781, 806, 808, 833, 858,
94 	883, 908, 933
95 };
96 
97 static const char _khmer_syllable_machine_indicies[] = {
98 	1, 1, 0, 0, 0, 0, 0, 0,
99 	0, 0, 0, 0, 0, 0, 0, 2,
100 	0, 0, 0, 0, 3, 4, 0, 1,
101 	1, 0, 0, 0, 0, 0, 0, 0,
102 	0, 0, 0, 0, 0, 0, 0, 0,
103 	0, 0, 0, 0, 4, 0, 5, 5,
104 	0, 0, 0, 0, 0, 0, 0, 0,
105 	0, 0, 0, 0, 5, 0, 1, 1,
106 	0, 0, 0, 0, 0, 0, 0, 0,
107 	0, 0, 0, 0, 0, 2, 0, 0,
108 	0, 0, 0, 4, 0, 6, 6, 0,
109 	0, 0, 0, 0, 0, 0, 0, 0,
110 	0, 0, 0, 0, 0, 0, 0, 0,
111 	0, 0, 2, 0, 7, 7, 0, 0,
112 	0, 0, 0, 0, 0, 0, 0, 0,
113 	0, 0, 0, 0, 0, 0, 0, 0,
114 	0, 8, 0, 9, 9, 0, 0, 0,
115 	0, 0, 0, 0, 0, 0, 0, 0,
116 	0, 0, 2, 0, 0, 0, 0, 0,
117 	10, 0, 9, 9, 0, 0, 0, 0,
118 	0, 0, 0, 0, 0, 0, 0, 0,
119 	0, 0, 0, 0, 0, 0, 0, 10,
120 	0, 11, 11, 0, 0, 0, 0, 0,
121 	0, 0, 0, 0, 0, 0, 0, 0,
122 	2, 0, 0, 0, 0, 0, 12, 0,
123 	11, 11, 0, 0, 0, 0, 0, 0,
124 	0, 0, 0, 0, 0, 0, 0, 0,
125 	0, 0, 0, 0, 0, 12, 0, 1,
126 	1, 0, 0, 0, 0, 0, 0, 0,
127 	0, 0, 0, 0, 0, 0, 2, 0,
128 	0, 0, 0, 13, 4, 0, 15, 15,
129 	14, 14, 14, 14, 14, 14, 14, 14,
130 	14, 14, 14, 14, 14, 16, 14, 14,
131 	14, 14, 17, 18, 14, 15, 15, 19,
132 	19, 19, 19, 19, 19, 19, 19, 19,
133 	19, 19, 19, 19, 19, 19, 19, 19,
134 	19, 19, 18, 19, 20, 20, 14, 14,
135 	14, 14, 14, 14, 14, 14, 14, 14,
136 	14, 14, 20, 14, 15, 15, 14, 14,
137 	14, 14, 14, 14, 14, 14, 14, 14,
138 	14, 14, 14, 16, 14, 14, 14, 14,
139 	14, 18, 14, 21, 21, 14, 14, 14,
140 	14, 14, 14, 14, 14, 14, 14, 14,
141 	14, 14, 14, 14, 14, 14, 14, 14,
142 	16, 14, 22, 22, 14, 14, 14, 14,
143 	14, 14, 14, 14, 14, 14, 14, 14,
144 	14, 14, 14, 14, 14, 14, 14, 23,
145 	14, 24, 24, 14, 14, 14, 14, 14,
146 	14, 14, 14, 14, 14, 14, 14, 14,
147 	16, 14, 14, 14, 14, 14, 25, 14,
148 	24, 24, 14, 14, 14, 14, 14, 14,
149 	14, 14, 14, 14, 14, 14, 14, 14,
150 	14, 14, 14, 14, 14, 25, 14, 26,
151 	26, 14, 14, 14, 14, 14, 14, 14,
152 	14, 14, 14, 14, 14, 14, 16, 14,
153 	14, 14, 14, 14, 27, 14, 26, 26,
154 	14, 14, 14, 14, 14, 14, 14, 14,
155 	14, 14, 14, 14, 14, 14, 14, 14,
156 	14, 14, 14, 27, 14, 29, 29, 28,
157 	30, 31, 31, 28, 28, 28, 13, 13,
158 	28, 28, 28, 29, 28, 28, 28, 28,
159 	16, 25, 27, 23, 28, 17, 18, 20,
160 	28, 33, 34, 34, 32, 32, 32, 32,
161 	32, 32, 32, 32, 32, 32, 32, 32,
162 	32, 2, 10, 12, 8, 32, 13, 4,
163 	5, 32, 35, 35, 32, 32, 32, 32,
164 	32, 32, 32, 32, 32, 32, 32, 32,
165 	35, 32, 33, 36, 36, 32, 32, 32,
166 	32, 32, 32, 32, 32, 32, 32, 32,
167 	32, 32, 2, 10, 12, 8, 32, 3,
168 	4, 5, 32, 37, 38, 38, 32, 32,
169 	32, 32, 32, 32, 32, 32, 32, 32,
170 	32, 32, 32, 2, 10, 12, 8, 32,
171 	32, 4, 5, 32, 5, 32, 37, 6,
172 	6, 32, 32, 32, 32, 32, 32, 32,
173 	32, 32, 32, 32, 32, 32, 32, 32,
174 	32, 8, 32, 32, 2, 5, 32, 37,
175 	7, 7, 32, 32, 32, 32, 32, 32,
176 	32, 32, 32, 32, 32, 32, 32, 32,
177 	32, 32, 32, 32, 32, 8, 5, 32,
178 	37, 39, 39, 32, 32, 32, 32, 32,
179 	32, 32, 32, 32, 32, 32, 32, 32,
180 	2, 32, 32, 8, 32, 32, 10, 5,
181 	32, 37, 40, 40, 32, 32, 32, 32,
182 	32, 32, 32, 32, 32, 32, 32, 32,
183 	32, 2, 10, 32, 8, 32, 32, 12,
184 	5, 32, 33, 38, 38, 32, 32, 32,
185 	32, 32, 32, 32, 32, 32, 32, 32,
186 	32, 32, 2, 10, 12, 8, 32, 32,
187 	4, 5, 32, 33, 38, 38, 32, 32,
188 	32, 32, 32, 32, 32, 32, 32, 32,
189 	32, 32, 32, 2, 10, 12, 8, 32,
190 	3, 4, 5, 32, 42, 42, 41, 41,
191 	41, 41, 41, 41, 41, 41, 41, 41,
192 	41, 41, 42, 41, 30, 43, 43, 41,
193 	41, 41, 41, 41, 41, 41, 41, 41,
194 	41, 41, 41, 41, 16, 25, 27, 23,
195 	41, 17, 18, 20, 41, 44, 45, 45,
196 	41, 41, 41, 41, 41, 41, 41, 41,
197 	41, 41, 41, 41, 41, 16, 25, 27,
198 	23, 41, 41, 18, 20, 41, 20, 41,
199 	44, 21, 21, 41, 41, 41, 41, 41,
200 	41, 41, 41, 41, 41, 41, 41, 41,
201 	41, 41, 41, 23, 41, 41, 16, 20,
202 	41, 44, 22, 22, 41, 41, 41, 41,
203 	41, 41, 41, 41, 41, 41, 41, 41,
204 	41, 41, 41, 41, 41, 41, 41, 23,
205 	20, 41, 44, 46, 46, 41, 41, 41,
206 	41, 41, 41, 41, 41, 41, 41, 41,
207 	41, 41, 16, 41, 41, 23, 41, 41,
208 	25, 20, 41, 44, 47, 47, 41, 41,
209 	41, 41, 41, 41, 41, 41, 41, 41,
210 	41, 41, 41, 16, 25, 41, 23, 41,
211 	41, 27, 20, 41, 30, 45, 45, 41,
212 	41, 41, 41, 41, 41, 41, 41, 41,
213 	41, 41, 41, 41, 16, 25, 27, 23,
214 	41, 41, 18, 20, 41, 15, 15, 48,
215 	48, 48, 48, 48, 48, 48, 48, 48,
216 	48, 48, 48, 48, 16, 48, 48, 48,
217 	48, 48, 18, 48, 0
218 };
219 
220 static const char _khmer_syllable_machine_trans_targs[] = {
221 	21, 1, 27, 31, 25, 26, 4, 5,
222 	28, 7, 29, 9, 30, 32, 21, 12,
223 	37, 41, 35, 21, 36, 15, 16, 38,
224 	18, 39, 20, 40, 21, 22, 33, 42,
225 	21, 23, 10, 24, 0, 2, 3, 6,
226 	8, 21, 34, 11, 13, 14, 17, 19,
227 	21
228 };
229 
230 static const char _khmer_syllable_machine_trans_actions[] = {
231 	1, 0, 2, 2, 2, 0, 0, 0,
232 	2, 0, 2, 0, 2, 2, 3, 0,
233 	2, 4, 4, 5, 0, 0, 0, 2,
234 	0, 2, 0, 2, 8, 2, 0, 9,
235 	10, 0, 0, 2, 0, 0, 0, 0,
236 	0, 11, 4, 0, 0, 0, 0, 0,
237 	12
238 };
239 
240 static const char _khmer_syllable_machine_to_state_actions[] = {
241 	0, 0, 0, 0, 0, 0, 0, 0,
242 	0, 0, 0, 0, 0, 0, 0, 0,
243 	0, 0, 0, 0, 0, 6, 0, 0,
244 	0, 0, 0, 0, 0, 0, 0, 0,
245 	0, 0, 0, 0, 0, 0, 0, 0,
246 	0, 0, 0
247 };
248 
249 static const char _khmer_syllable_machine_from_state_actions[] = {
250 	0, 0, 0, 0, 0, 0, 0, 0,
251 	0, 0, 0, 0, 0, 0, 0, 0,
252 	0, 0, 0, 0, 0, 7, 0, 0,
253 	0, 0, 0, 0, 0, 0, 0, 0,
254 	0, 0, 0, 0, 0, 0, 0, 0,
255 	0, 0, 0
256 };
257 
258 static const short _khmer_syllable_machine_eof_trans[] = {
259 	1, 1, 1, 1, 1, 1, 1, 1,
260 	1, 1, 1, 15, 20, 15, 15, 15,
261 	15, 15, 15, 15, 15, 0, 33, 33,
262 	33, 33, 33, 33, 33, 33, 33, 33,
263 	33, 42, 42, 42, 42, 42, 42, 42,
264 	42, 42, 49
265 };
266 
267 static const int khmer_syllable_machine_start = 21;
268 static const int khmer_syllable_machine_first_final = 21;
269 static const int khmer_syllable_machine_error = -1;
270 
271 static const int khmer_syllable_machine_en_main = 21;
272 
273 
274 #line 53 "hb-ot-shaper-khmer-machine.rl"
275 
276 
277 
278 #line 102 "hb-ot-shaper-khmer-machine.rl"
279 
280 
281 #define found_syllable(syllable_type) \
282   HB_STMT_START { \
283     if (0) fprintf (stderr, "syllable %u..%u %s\n", ts, te, #syllable_type); \
284     for (unsigned int i = ts; i < te; i++) \
285       info[i].syllable() = (syllable_serial << 4) | syllable_type; \
286     syllable_serial++; \
287     if (syllable_serial == 16) syllable_serial = 1; \
288   } HB_STMT_END
289 
290 inline void
find_syllables_khmer(hb_buffer_t * buffer)291 find_syllables_khmer (hb_buffer_t *buffer)
292 {
293   unsigned int p, pe, eof, ts, te, act HB_UNUSED;
294   int cs;
295   hb_glyph_info_t *info = buffer->info;
296 
297 #line 298 "hb-ot-shaper-khmer-machine.hh"
298 	{
299 	cs = khmer_syllable_machine_start;
300 	ts = 0;
301 	te = 0;
302 	act = 0;
303 	}
304 
305 #line 122 "hb-ot-shaper-khmer-machine.rl"
306 
307 
308   p = 0;
309   pe = eof = buffer->len;
310 
311   unsigned int syllable_serial = 1;
312 
313 #line 314 "hb-ot-shaper-khmer-machine.hh"
314 	{
315 	int _slen;
316 	int _trans;
317 	const unsigned char *_keys;
318 	const char *_inds;
319 	if ( p == pe )
320 		goto _test_eof;
321 _resume:
322 	switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
323 	case 7:
324 #line 1 "NONE"
325 	{ts = p;}
326 	break;
327 #line 328 "hb-ot-shaper-khmer-machine.hh"
328 	}
329 
330 	_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
331 	_inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
332 
333 	_slen = _khmer_syllable_machine_key_spans[cs];
334 	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
335 		( info[p].khmer_category()) <= _keys[1] ?
336 		( info[p].khmer_category()) - _keys[0] : _slen ];
337 
338 _eof_trans:
339 	cs = _khmer_syllable_machine_trans_targs[_trans];
340 
341 	if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
342 		goto _again;
343 
344 	switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
345 	case 2:
346 #line 1 "NONE"
347 	{te = p+1;}
348 	break;
349 	case 8:
350 #line 98 "hb-ot-shaper-khmer-machine.rl"
351 	{te = p+1;{ found_syllable (khmer_non_khmer_cluster); }}
352 	break;
353 	case 10:
354 #line 96 "hb-ot-shaper-khmer-machine.rl"
355 	{te = p;p--;{ found_syllable (khmer_consonant_syllable); }}
356 	break;
357 	case 11:
358 #line 97 "hb-ot-shaper-khmer-machine.rl"
359 	{te = p;p--;{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
360 	break;
361 	case 12:
362 #line 98 "hb-ot-shaper-khmer-machine.rl"
363 	{te = p;p--;{ found_syllable (khmer_non_khmer_cluster); }}
364 	break;
365 	case 1:
366 #line 96 "hb-ot-shaper-khmer-machine.rl"
367 	{{p = ((te))-1;}{ found_syllable (khmer_consonant_syllable); }}
368 	break;
369 	case 3:
370 #line 97 "hb-ot-shaper-khmer-machine.rl"
371 	{{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }}
372 	break;
373 	case 5:
374 #line 1 "NONE"
375 	{	switch( act ) {
376 	case 2:
377 	{{p = ((te))-1;} found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }
378 	break;
379 	case 3:
380 	{{p = ((te))-1;} found_syllable (khmer_non_khmer_cluster); }
381 	break;
382 	}
383 	}
384 	break;
385 	case 4:
386 #line 1 "NONE"
387 	{te = p+1;}
388 #line 97 "hb-ot-shaper-khmer-machine.rl"
389 	{act = 2;}
390 	break;
391 	case 9:
392 #line 1 "NONE"
393 	{te = p+1;}
394 #line 98 "hb-ot-shaper-khmer-machine.rl"
395 	{act = 3;}
396 	break;
397 #line 398 "hb-ot-shaper-khmer-machine.hh"
398 	}
399 
400 _again:
401 	switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
402 	case 6:
403 #line 1 "NONE"
404 	{ts = 0;}
405 	break;
406 #line 407 "hb-ot-shaper-khmer-machine.hh"
407 	}
408 
409 	if ( ++p != pe )
410 		goto _resume;
411 	_test_eof: {}
412 	if ( p == eof )
413 	{
414 	if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
415 		_trans = _khmer_syllable_machine_eof_trans[cs] - 1;
416 		goto _eof_trans;
417 	}
418 	}
419 
420 	}
421 
422 #line 130 "hb-ot-shaper-khmer-machine.rl"
423 
424 }
425 
426 #undef found_syllable
427 
428 #endif /* HB_OT_SHAPER_KHMER_MACHINE_HH */
429