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