2 #line 1 "hb-ot-shape-complex-khmer-machine.rl"
4 * Copyright © 2011,2012 Google, Inc.
6 * This is part of HarfBuzz, a text shaping library.
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.
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
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.
26 * Google Author(s): Behdad Esfahbod
29 #ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
30 #define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
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,
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,
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,
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,
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
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,
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,
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,
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,
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;
223 static const int khmer_syllable_machine_en_main = 22;
226 #line 36 "hb-ot-shape-complex-khmer-machine.rl"
230 #line 80 "hb-ot-shape-complex-khmer-machine.rl"
233 #define found_syllable(syllable_type) \
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; \
239 if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
243 find_syllables (hb_buffer_t *buffer)
245 unsigned int p, pe, eof, ts, te, act HB_UNUSED;
247 hb_glyph_info_t *info = buffer->info;
249 #line 250 "hb-ot-shape-complex-khmer-machine.hh"
251 cs = khmer_syllable_machine_start;
257 #line 100 "hb-ot-shape-complex-khmer-machine.rl"
261 pe = eof = buffer->len;
263 unsigned int syllable_serial = 1;
265 #line 266 "hb-ot-shape-complex-khmer-machine.hh"
269 const unsigned char *_keys;
274 switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
279 #line 280 "hb-ot-shape-complex-khmer-machine.hh"
282 _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
283 _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
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 ];
291 cs = _khmer_syllable_machine_trans_targs[_trans];
293 if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
296 switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
302 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
303 {te = p+1;{ found_syllable (non_khmer_cluster); }}
306 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
307 {te = p;p--;{ found_syllable (consonant_syllable); }}
310 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
311 {te = p;p--;{ found_syllable (broken_cluster); }}
314 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
315 {te = p;p--;{ found_syllable (non_khmer_cluster); }}
318 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
319 {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
322 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
323 {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
329 {{p = ((te))-1;} found_syllable (broken_cluster); }
332 {{p = ((te))-1;} found_syllable (non_khmer_cluster); }
340 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
346 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
349 #line 350 "hb-ot-shape-complex-khmer-machine.hh"
353 switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
358 #line 359 "hb-ot-shape-complex-khmer-machine.hh"
366 if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
367 _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
374 #line 108 "hb-ot-shape-complex-khmer-machine.rl"
378 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */