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-private.hh" 33 34 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 42 }; 43 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, 49 12, 7, 1, 16 50 }; 51 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, 57 304, 317, 325, 327 58 }; 59 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, 104 0 105 }; 106 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, 113 29, 9, 10 114 }; 115 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, 122 0, 0, 11 123 }; 124 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, 130 0, 0, 0, 0 131 }; 132 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, 138 0, 0, 0, 0 139 }; 140 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, 146 32, 43, 43, 43 147 }; 148 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; 152 153 static 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 173 static void 174 find_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 */