Imported Upstream version 2.4.0
[platform/upstream/harfbuzz.git] / src / hb-ot-shape-complex-khmer-machine.hh
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, 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
45 static 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
53 static 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
61 static 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
169 static 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
178 static 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
187 static 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
195 static 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
203 static 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
211 static const int khmer_syllable_machine_start = 20;
212 static const int khmer_syllable_machine_first_final = 20;
213 static const int khmer_syllable_machine_error = -1;
214
215 static 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) | syllable_type; \
230     syllable_serial++; \
231     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
232   } HB_STMT_END
233
234 static void
235 find_syllables (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 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */