Home | History | Annotate | Download | only in src
      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"
     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,
     42 	5u, 29u, 0
     43 };
     44 
     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,
     51 	25
     52 };
     53 
     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,
     60 	830
     61 };
     62 
     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,
    171 	0
    172 };
    173 
    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
    181 };
    182 
    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,
    189 	12, 0, 0, 0, 0, 0, 0
    190 };
    191 
    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,
    198 	0
    199 };
    200 
    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,
    207 	0
    208 };
    209 
    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,
    216 	41
    217 };
    218 
    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;
    222 
    223 static const int khmer_syllable_machine_en_main = 22;
    224 
    225 
    226 #line 36 "hb-ot-shape-complex-khmer-machine.rl"
    227 
    228 
    229 
    230 #line 80 "hb-ot-shape-complex-khmer-machine.rl"
    231 
    232 
    233 #define found_syllable(syllable_type) \
    234   HB_STMT_START { \
    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; \
    238     syllable_serial++; \
    239     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
    240   } HB_STMT_END
    241 
    242 static void
    243 find_syllables (hb_buffer_t *buffer)
    244 {
    245   unsigned int p, pe, eof, ts, te, act HB_UNUSED;
    246   int cs;
    247   hb_glyph_info_t *info = buffer->info;
    248 
    249 #line 250 "hb-ot-shape-complex-khmer-machine.hh"
    250 	{
    251 	cs = khmer_syllable_machine_start;
    252 	ts = 0;
    253 	te = 0;
    254 	act = 0;
    255 	}
    256 
    257 #line 100 "hb-ot-shape-complex-khmer-machine.rl"
    258 
    259 
    260   p = 0;
    261   pe = eof = buffer->len;
    262 
    263   unsigned int syllable_serial = 1;
    264 
    265 #line 266 "hb-ot-shape-complex-khmer-machine.hh"
    266 	{
    267 	int _slen;
    268 	int _trans;
    269 	const unsigned char *_keys;
    270 	const char *_inds;
    271 	if ( p == pe )
    272 		goto _test_eof;
    273 _resume:
    274 	switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
    275 	case 7:
    276 #line 1 "NONE"
    277 	{ts = p;}
    278 	break;
    279 #line 280 "hb-ot-shape-complex-khmer-machine.hh"
    280 	}
    281 
    282 	_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
    283 	_inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
    284 
    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 ];
    289 
    290 _eof_trans:
    291 	cs = _khmer_syllable_machine_trans_targs[_trans];
    292 
    293 	if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
    294 		goto _again;
    295 
    296 	switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
    297 	case 2:
    298 #line 1 "NONE"
    299 	{te = p+1;}
    300 	break;
    301 	case 8:
    302 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
    303 	{te = p+1;{ found_syllable (non_khmer_cluster); }}
    304 	break;
    305 	case 10:
    306 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
    307 	{te = p;p--;{ found_syllable (consonant_syllable); }}
    308 	break;
    309 	case 12:
    310 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
    311 	{te = p;p--;{ found_syllable (broken_cluster); }}
    312 	break;
    313 	case 11:
    314 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
    315 	{te = p;p--;{ found_syllable (non_khmer_cluster); }}
    316 	break;
    317 	case 1:
    318 #line 74 "hb-ot-shape-complex-khmer-machine.rl"
    319 	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
    320 	break;
    321 	case 5:
    322 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
    323 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
    324 	break;
    325 	case 3:
    326 #line 1 "NONE"
    327 	{	switch( act ) {
    328 	case 2:
    329 	{{p = ((te))-1;} found_syllable (broken_cluster); }
    330 	break;
    331 	case 3:
    332 	{{p = ((te))-1;} found_syllable (non_khmer_cluster); }
    333 	break;
    334 	}
    335 	}
    336 	break;
    337 	case 4:
    338 #line 1 "NONE"
    339 	{te = p+1;}
    340 #line 75 "hb-ot-shape-complex-khmer-machine.rl"
    341 	{act = 2;}
    342 	break;
    343 	case 9:
    344 #line 1 "NONE"
    345 	{te = p+1;}
    346 #line 76 "hb-ot-shape-complex-khmer-machine.rl"
    347 	{act = 3;}
    348 	break;
    349 #line 350 "hb-ot-shape-complex-khmer-machine.hh"
    350 	}
    351 
    352 _again:
    353 	switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
    354 	case 6:
    355 #line 1 "NONE"
    356 	{ts = 0;}
    357 	break;
    358 #line 359 "hb-ot-shape-complex-khmer-machine.hh"
    359 	}
    360 
    361 	if ( ++p != pe )
    362 		goto _resume;
    363 	_test_eof: {}
    364 	if ( p == eof )
    365 	{
    366 	if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
    367 		_trans = _khmer_syllable_machine_eof_trans[cs] - 1;
    368 		goto _eof_trans;
    369 	}
    370 	}
    371 
    372 	}
    373 
    374 #line 108 "hb-ot-shape-complex-khmer-machine.rl"
    375 
    376 }
    377 
    378 #endif /* HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH */
    379