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