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
32 #include "hb-private.hh"
35 #line 36 "hb-ot-shape-complex-khmer-machine.hh"
36 static 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
44 static 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,
52 static 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,
60 static 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,
107 static 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,
116 static 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,
125 static 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,
133 static 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,
141 static 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,
149 static const int khmer_syllable_machine_start = 10;
150 static const int khmer_syllable_machine_first_final = 10;
151 static const int khmer_syllable_machine_error = -1;
153 static const int khmer_syllable_machine_en_main = 10;
156 #line 36 "hb-ot-shape-complex-khmer-machine.rl"
160 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
163 #define found_syllable(syllable_type) \
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; \
170 if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
174 find_syllables (hb_buffer_t *buffer)
176 unsigned int p, pe, eof, ts HB_UNUSED, te, act HB_UNUSED;
178 hb_glyph_info_t *info = buffer->info;
180 #line 181 "hb-ot-shape-complex-khmer-machine.hh"
182 cs = khmer_syllable_machine_start;
188 #line 95 "hb-ot-shape-complex-khmer-machine.rl"
192 pe = eof = buffer->len;
194 unsigned int last = 0;
195 unsigned int syllable_serial = 1;
197 #line 198 "hb-ot-shape-complex-khmer-machine.hh"
201 const unsigned char *_keys;
206 switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
211 #line 212 "hb-ot-shape-complex-khmer-machine.hh"
214 _keys = _khmer_syllable_machine_trans_keys + (cs<<1);
215 _inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
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 ];
223 cs = _khmer_syllable_machine_trans_targs[_trans];
225 if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
228 switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
234 #line 68 "hb-ot-shape-complex-khmer-machine.rl"
235 {te = p+1;{ found_syllable (consonant_syllable); }}
238 #line 69 "hb-ot-shape-complex-khmer-machine.rl"
239 {te = p+1;{ found_syllable (broken_cluster); }}
242 #line 70 "hb-ot-shape-complex-khmer-machine.rl"
243 {te = p+1;{ found_syllable (non_khmer_cluster); }}
246 #line 68 "hb-ot-shape-complex-khmer-machine.rl"
247 {te = p;p--;{ found_syllable (consonant_syllable); }}
250 #line 69 "hb-ot-shape-complex-khmer-machine.rl"
251 {te = p;p--;{ found_syllable (broken_cluster); }}
254 #line 70 "hb-ot-shape-complex-khmer-machine.rl"
255 {te = p;p--;{ found_syllable (non_khmer_cluster); }}
258 #line 68 "hb-ot-shape-complex-khmer-machine.rl"
259 {{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
262 #line 69 "hb-ot-shape-complex-khmer-machine.rl"
263 {{p = ((te))-1;}{ found_syllable (broken_cluster); }}
265 #line 266 "hb-ot-shape-complex-khmer-machine.hh"
269 switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
274 #line 275 "hb-ot-shape-complex-khmer-machine.hh"
282 if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
283 _trans = _khmer_syllable_machine_eof_trans[cs] - 1;
290 #line 104 "hb-ot-shape-complex-khmer-machine.rl"
294 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */