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