1
2 #line 1 "hb-ot-shape-complex-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_SHAPE_COMPLEX_KHMER_MACHINE_HH
30 #define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
31
32 #include "hb.hh"
33
34 enum khmer_syllable_type_t {
35 khmer_consonant_syllable,
36 khmer_broken_cluster,
37 khmer_non_khmer_cluster,
38 };
39
40
41 #line 42 "hb-ot-shape-complex-khmer-machine.hh"
42 #define khmer_syllable_machine_ex_C 1u
43 #define khmer_syllable_machine_ex_Coeng 14u
44 #define khmer_syllable_machine_ex_DOTTEDCIRCLE 12u
45 #define khmer_syllable_machine_ex_PLACEHOLDER 11u
46 #define khmer_syllable_machine_ex_Ra 16u
47 #define khmer_syllable_machine_ex_Robatic 20u
48 #define khmer_syllable_machine_ex_V 2u
49 #define khmer_syllable_machine_ex_VAbv 26u
50 #define khmer_syllable_machine_ex_VBlw 27u
51 #define khmer_syllable_machine_ex_VPre 28u
52 #define khmer_syllable_machine_ex_VPst 29u
53 #define khmer_syllable_machine_ex_Xgroup 21u
54 #define khmer_syllable_machine_ex_Ygroup 22u
55 #define khmer_syllable_machine_ex_ZWJ 6u
56 #define khmer_syllable_machine_ex_ZWNJ 5u
57
58
59 #line 60 "hb-ot-shape-complex-khmer-machine.hh"
60 static const unsigned char _khmer_syllable_machine_trans_keys[] = {
61 5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u,
62 5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u,
63 5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u,
64 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u,
65 5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u,
66 0
67 };
68
69 static const char _khmer_syllable_machine_key_spans[] = {
70 22, 17, 22, 17, 16, 17, 22, 17,
71 22, 17, 17, 22, 17, 16, 17, 22,
72 17, 22, 17, 22, 29, 25, 25, 25,
73 1, 18, 25, 25, 25, 16, 22, 25,
74 25, 1, 18, 25, 25, 16, 25, 25
75 };
76
77 static const short _khmer_syllable_machine_index_offsets[] = {
78 0, 23, 41, 64, 82, 99, 117, 140,
79 158, 181, 199, 217, 240, 258, 275, 293,
80 316, 334, 357, 375, 398, 428, 454, 480,
81 506, 508, 527, 553, 579, 605, 622, 645,
82 671, 697, 699, 718, 744, 770, 787, 813
83 };
84
85 static const char _khmer_syllable_machine_indicies[] = {
86 1, 1, 0, 0, 0, 0, 0, 0,
87 0, 0, 0, 0, 0, 0, 0, 2,
88 3, 0, 0, 0, 0, 4, 0, 1,
89 1, 0, 0, 0, 0, 0, 0, 0,
90 0, 0, 0, 0, 0, 0, 0, 3,
91 0, 1, 1, 0, 0, 0, 0, 0,
92 0, 0, 0, 0, 0, 0, 0, 0,
93 0, 3, 0, 0, 0, 0, 4, 0,
94 5, 5, 0, 0, 0, 0, 0, 0,
95 0, 0, 0, 0, 0, 0, 0, 0,
96 4, 0, 6, 6, 0, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 6, 0, 7, 7, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0,
100 0, 0, 0, 8, 0, 9, 9, 0,
101 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 10, 0, 0,
103 0, 0, 4, 0, 9, 9, 0, 0,
104 0, 0, 0, 0, 0, 0, 0, 0,
105 0, 0, 0, 0, 10, 0, 11, 11,
106 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 12, 0,
108 0, 0, 0, 4, 0, 11, 11, 0,
109 0, 0, 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 12, 0, 14,
111 14, 13, 13, 13, 13, 13, 13, 13,
112 13, 13, 13, 13, 13, 13, 13, 15,
113 13, 14, 14, 16, 16, 16, 16, 16,
114 16, 16, 16, 16, 16, 16, 16, 16,
115 16, 15, 16, 16, 16, 16, 17, 16,
116 18, 18, 16, 16, 16, 16, 16, 16,
117 16, 16, 16, 16, 16, 16, 16, 16,
118 17, 16, 19, 19, 16, 16, 16, 16,
119 16, 16, 16, 16, 16, 16, 16, 16,
120 16, 19, 16, 20, 20, 16, 16, 16,
121 16, 16, 16, 16, 16, 16, 16, 16,
122 16, 16, 16, 21, 16, 22, 22, 16,
123 16, 16, 16, 16, 16, 16, 16, 16,
124 16, 16, 16, 16, 16, 23, 16, 16,
125 16, 16, 17, 16, 22, 22, 16, 16,
126 16, 16, 16, 16, 16, 16, 16, 16,
127 16, 16, 16, 16, 23, 16, 24, 24,
128 16, 16, 16, 16, 16, 16, 16, 16,
129 16, 16, 16, 16, 16, 16, 25, 16,
130 16, 16, 16, 17, 16, 24, 24, 16,
131 16, 16, 16, 16, 16, 16, 16, 16,
132 16, 16, 16, 16, 16, 25, 16, 14,
133 14, 16, 16, 16, 16, 16, 16, 16,
134 16, 16, 16, 16, 16, 16, 26, 15,
135 16, 16, 16, 16, 17, 16, 28, 28,
136 27, 27, 29, 29, 27, 27, 27, 27,
137 2, 2, 27, 30, 27, 28, 27, 27,
138 27, 27, 15, 19, 27, 27, 27, 17,
139 23, 25, 21, 27, 32, 32, 31, 31,
140 31, 31, 31, 31, 31, 33, 31, 31,
141 31, 31, 31, 2, 3, 6, 31, 31,
142 31, 4, 10, 12, 8, 31, 34, 34,
143 31, 31, 31, 31, 31, 31, 31, 35,
144 31, 31, 31, 31, 31, 31, 3, 6,
145 31, 31, 31, 4, 10, 12, 8, 31,
146 5, 5, 31, 31, 31, 31, 31, 31,
147 31, 35, 31, 31, 31, 31, 31, 31,
148 4, 6, 31, 31, 31, 31, 31, 31,
149 8, 31, 6, 31, 7, 7, 31, 31,
150 31, 31, 31, 31, 31, 35, 31, 31,
151 31, 31, 31, 31, 8, 6, 31, 36,
152 36, 31, 31, 31, 31, 31, 31, 31,
153 35, 31, 31, 31, 31, 31, 31, 10,
154 6, 31, 31, 31, 4, 31, 31, 8,
155 31, 37, 37, 31, 31, 31, 31, 31,
156 31, 31, 35, 31, 31, 31, 31, 31,
157 31, 12, 6, 31, 31, 31, 4, 10,
158 31, 8, 31, 34, 34, 31, 31, 31,
159 31, 31, 31, 31, 33, 31, 31, 31,
160 31, 31, 31, 3, 6, 31, 31, 31,
161 4, 10, 12, 8, 31, 28, 28, 31,
162 31, 31, 31, 31, 31, 31, 31, 31,
163 31, 31, 31, 31, 28, 31, 14, 14,
164 38, 38, 38, 38, 38, 38, 38, 38,
165 38, 38, 38, 38, 38, 38, 15, 38,
166 38, 38, 38, 17, 38, 40, 40, 39,
167 39, 39, 39, 39, 39, 39, 41, 39,
168 39, 39, 39, 39, 39, 15, 19, 39,
169 39, 39, 17, 23, 25, 21, 39, 18,
170 18, 39, 39, 39, 39, 39, 39, 39,
171 41, 39, 39, 39, 39, 39, 39, 17,
172 19, 39, 39, 39, 39, 39, 39, 21,
173 39, 19, 39, 20, 20, 39, 39, 39,
174 39, 39, 39, 39, 41, 39, 39, 39,
175 39, 39, 39, 21, 19, 39, 42, 42,
176 39, 39, 39, 39, 39, 39, 39, 41,
177 39, 39, 39, 39, 39, 39, 23, 19,
178 39, 39, 39, 17, 39, 39, 21, 39,
179 43, 43, 39, 39, 39, 39, 39, 39,
180 39, 41, 39, 39, 39, 39, 39, 39,
181 25, 19, 39, 39, 39, 17, 23, 39,
182 21, 39, 44, 44, 39, 39, 39, 39,
183 39, 39, 39, 39, 39, 39, 39, 39,
184 39, 44, 39, 45, 45, 39, 39, 39,
185 39, 39, 39, 39, 30, 39, 39, 39,
186 39, 39, 26, 15, 19, 39, 39, 39,
187 17, 23, 25, 21, 39, 40, 40, 39,
188 39, 39, 39, 39, 39, 39, 30, 39,
189 39, 39, 39, 39, 39, 15, 19, 39,
190 39, 39, 17, 23, 25, 21, 39, 0
191 };
192
193 static const char _khmer_syllable_machine_trans_targs[] = {
194 20, 1, 28, 22, 23, 3, 24, 5,
195 25, 7, 26, 9, 27, 20, 10, 31,
196 20, 32, 12, 33, 14, 34, 16, 35,
197 18, 36, 39, 20, 21, 30, 37, 20,
198 0, 29, 2, 4, 6, 8, 20, 20,
199 11, 13, 15, 17, 38, 19
200 };
201
202 static const char _khmer_syllable_machine_trans_actions[] = {
203 1, 0, 2, 2, 2, 0, 0, 0,
204 2, 0, 2, 0, 2, 3, 0, 4,
205 5, 2, 0, 0, 0, 2, 0, 2,
206 0, 2, 4, 8, 2, 9, 0, 10,
207 0, 0, 0, 0, 0, 0, 11, 12,
208 0, 0, 0, 0, 4, 0
209 };
210
211 static const char _khmer_syllable_machine_to_state_actions[] = {
212 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0,
214 0, 0, 0, 0, 6, 0, 0, 0,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0
217 };
218
219 static const char _khmer_syllable_machine_from_state_actions[] = {
220 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 7, 0, 0, 0,
223 0, 0, 0, 0, 0, 0, 0, 0,
224 0, 0, 0, 0, 0, 0, 0, 0
225 };
226
227 static const unsigned char _khmer_syllable_machine_eof_trans[] = {
228 1, 1, 1, 1, 1, 1, 1, 1,
229 1, 1, 14, 17, 17, 17, 17, 17,
230 17, 17, 17, 17, 0, 32, 32, 32,
231 32, 32, 32, 32, 32, 32, 39, 40,
232 40, 40, 40, 40, 40, 40, 40, 40
233 };
234
235 static const int khmer_syllable_machine_start = 20;
236 static const int khmer_syllable_machine_first_final = 20;
237 static const int khmer_syllable_machine_error = -1;
238
239 static const int khmer_syllable_machine_en_main = 20;
240
241
242 #line 43 "hb-ot-shape-complex-khmer-machine.rl"
243
244
245
246 #line 86 "hb-ot-shape-complex-khmer-machine.rl"
247
248
249 #define found_syllable(syllable_type) \
250 HB_STMT_START { \
251 if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
252 for (unsigned int i = ts; i < te; i++) \
253 info[i].syllable() = (syllable_serial << 4) | syllable_type; \
254 syllable_serial++; \
255 if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
256 } HB_STMT_END
257
258 static void
find_syllables_khmer(hb_buffer_t * buffer)259 find_syllables_khmer (hb_buffer_t *buffer)
260 {
261 unsigned int p, pe, eof, ts, te, act HB_UNUSED;
262 int cs;
263 hb_glyph_info_t *info = buffer->info;
264
265 #line 266 "hb-ot-shape-complex-khmer-machine.hh"
266 {
267 cs = khmer_syllable_machine_start;
268 ts = 0;
269 te = 0;
270 act = 0;
271 }
272
273 #line 106 "hb-ot-shape-complex-khmer-machine.rl"
274
275
276 p = 0;
277 pe = eof = buffer->len;
278
279 unsigned int syllable_serial = 1;
280
281 #line 282 "hb-ot-shape-complex-khmer-machine.hh"
282 {
283 int _slen;
284 int _trans;
285 const unsigned char *_keys;
286 const char *_inds;
287 if ( p == pe )
288 goto _test_eof;
289 _resume:
290 switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
291 case 7:
292 #line 1 "NONE"
293 {ts = p;}
294 break;
295 #line 296 "hb-ot-shape-complex-khmer-machine.hh"
296 }
297
298 _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
299 _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
300
301 _slen = _khmer_syllable_machine_key_spans[cs];
302 _trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
303 ( info[p].khmer_category()) <= _keys[1] ?
304 ( info[p].khmer_category()) - _keys[0] : _slen ];
305
306 _eof_trans:
307 cs = _khmer_syllable_machine_trans_targs[_trans];
308
309 if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
310 goto _again;
311
312 switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
313 case 2:
314 #line 1 "NONE"
315 {te = p+1;}
316 break;
317 case 8:
318 #line 82 "hb-ot-shape-complex-khmer-machine.rl"
319 {te = p+1;{ found_syllable (khmer_non_khmer_cluster); }}
320 break;
321 case 10:
322 #line 80 "hb-ot-shape-complex-khmer-machine.rl"
323 {te = p;p--;{ found_syllable (khmer_consonant_syllable); }}
324 break;
325 case 12:
326 #line 81 "hb-ot-shape-complex-khmer-machine.rl"
327 {te = p;p--;{ found_syllable (khmer_broken_cluster); }}
328 break;
329 case 11:
330 #line 82 "hb-ot-shape-complex-khmer-machine.rl"
331 {te = p;p--;{ found_syllable (khmer_non_khmer_cluster); }}
332 break;
333 case 1:
334 #line 80 "hb-ot-shape-complex-khmer-machine.rl"
335 {{p = ((te))-1;}{ found_syllable (khmer_consonant_syllable); }}
336 break;
337 case 5:
338 #line 81 "hb-ot-shape-complex-khmer-machine.rl"
339 {{p = ((te))-1;}{ found_syllable (khmer_broken_cluster); }}
340 break;
341 case 3:
342 #line 1 "NONE"
343 { switch( act ) {
344 case 2:
345 {{p = ((te))-1;} found_syllable (khmer_broken_cluster); }
346 break;
347 case 3:
348 {{p = ((te))-1;} found_syllable (khmer_non_khmer_cluster); }
349 break;
350 }
351 }
352 break;
353 case 4:
354 #line 1 "NONE"
355 {te = p+1;}
356 #line 81 "hb-ot-shape-complex-khmer-machine.rl"
357 {act = 2;}
358 break;
359 case 9:
360 #line 1 "NONE"
361 {te = p+1;}
362 #line 82 "hb-ot-shape-complex-khmer-machine.rl"
363 {act = 3;}
364 break;
365 #line 366 "hb-ot-shape-complex-khmer-machine.hh"
366 }
367
368 _again:
369 switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
370 case 6:
371 #line 1 "NONE"
372 {ts = 0;}
373 break;
374 #line 375 "hb-ot-shape-complex-khmer-machine.hh"
375 }
376
377 if ( ++p != pe )
378 goto _resume;
379 _test_eof: {}
380 if ( p == eof )
381 {
382 if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
383 _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
384 goto _eof_trans;
385 }
386 }
387
388 }
389
390 #line 114 "hb-ot-shape-complex-khmer-machine.rl"
391
392 }
393
394 #undef found_syllable
395
396 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
397