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, 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,
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
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
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
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
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,
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
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
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
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;
215 static const int khmer_syllable_machine_en_main = 20;
218 #line 36 "hb-ot-shape-complex-khmer-machine.rl"
222 #line 80 "hb-ot-shape-complex-khmer-machine.rl"
225 #define found_syllable(syllable_type) \
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; \
231 if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
235 find_syllables (hb_buffer_t *buffer)
237 unsigned int p, pe, eof, ts, te, act HB_UNUSED;
239 hb_glyph_info_t *info = buffer->info;
241 #line 242 "hb-ot-shape-complex-khmer-machine.hh"
243 cs = khmer_syllable_machine_start;
249 #line 100 "hb-ot-shape-complex-khmer-machine.rl"
253 pe = eof = buffer->len;
255 unsigned int syllable_serial = 1;
257 #line 258 "hb-ot-shape-complex-khmer-machine.hh"
261 const unsigned char *_keys;
266 switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
271 #line 272 "hb-ot-shape-complex-khmer-machine.hh"
274 _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
275 _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
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 ];
283 cs = _khmer_syllable_machine_trans_targs[_trans];
285 if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
288 switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
294 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
295 {te = p+1;{ found_syllable (non_khmer_cluster); }}
298 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
299 {te = p;p--;{ found_syllable (consonant_syllable); }}
302 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
303 {te = p;p--;{ found_syllable (broken_cluster); }}
306 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
307 {te = p;p--;{ found_syllable (non_khmer_cluster); }}
310 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
311 {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
314 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
315 {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
321 {{p = ((te))-1;} found_syllable (broken_cluster); }
324 {{p = ((te))-1;} found_syllable (non_khmer_cluster); }
332 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
338 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
341 #line 342 "hb-ot-shape-complex-khmer-machine.hh"
345 switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
350 #line 351 "hb-ot-shape-complex-khmer-machine.hh"
358 if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
359 _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
366 #line 108 "hb-ot-shape-complex-khmer-machine.rl"
370 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */