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