Edit

kc3-lang/harfbuzz/src/hb-ot-shape-complex-myanmar-machine.rl

Branch :

  • Show log

    Commit

  • Author : Behdad Esfahbod
    Date : 2018-10-02 17:04:05
    Hash : 40d5d19d
    Message : [ragel] Use ts/te (token-start / token-end) instead of manual tracking

  • src/hb-ot-shape-complex-myanmar-machine.rl
  • /*
     * Copyright © 2011,2012  Google, Inc.
     *
     *  This is part of HarfBuzz, a text shaping library.
     *
     * Permission is hereby granted, without written agreement and without
     * license or royalty fees, to use, copy, modify, and distribute this
     * software and its documentation for any purpose, provided that the
     * above copyright notice and the following two paragraphs appear in
     * all copies of this software.
     *
     * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
     * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
     * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
     * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
     * DAMAGE.
     *
     * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
     * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
     * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
     * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
     * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
     *
     * Google Author(s): Behdad Esfahbod
     */
    
    #ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
    #define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
    
    #include "hb.hh"
    
    %%{
      machine myanmar_syllable_machine;
      alphtype unsigned char;
      write data;
    }%%
    
    %%{
    
    # Same order as enum myanmar_category_t.  Not sure how to avoid duplication.
    A    = 10;
    As   = 18;
    C    = 1;
    D    = 32;
    D0   = 20;
    DB   = 3;
    GB   = 11;
    H    = 4;
    IV   = 2;
    MH   = 21;
    MR   = 22;
    MW   = 23;
    MY   = 24;
    PT   = 25;
    V    = 8;
    VAbv = 26;
    VBlw = 27;
    VPre = 28;
    VPst = 29;
    VS   = 30;
    ZWJ  = 6;
    ZWNJ = 5;
    Ra   = 16;
    P    = 31;
    CS   = 19;
    
    j = ZWJ|ZWNJ;			# Joiners
    k = (Ra As H);			# Kinzi
    
    c = C|Ra;			# is_consonant
    
    medial_group = MY? MR? MW? MH? As?;
    main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
    post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
    pwo_tone_group = PT A* DB? As?;
    
    complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
    syllable_tail = (H | complex_syllable_tail);
    
    consonant_syllable =	(k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
    punctuation_cluster = 	P V;
    broken_cluster =	k? VS? syllable_tail;
    other =			any;
    
    main := |*
    	consonant_syllable	=> { found_syllable (consonant_syllable); };
    	j			=> { found_syllable (non_myanmar_cluster); };
    	punctuation_cluster	=> { found_syllable (punctuation_cluster); };
    	broken_cluster		=> { found_syllable (broken_cluster); };
    	other			=> { found_syllable (non_myanmar_cluster); };
    *|;
    
    
    }%%
    
    #define found_syllable(syllable_type) \
      HB_STMT_START { \
        if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
        for (unsigned int i = ts; i < te; i++) \
          info[i].syllable() = (syllable_serial << 4) | syllable_type; \
        syllable_serial++; \
        if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
      } HB_STMT_END
    
    static void
    find_syllables (hb_buffer_t *buffer)
    {
      unsigned int p, pe, eof, ts, te, act HB_UNUSED;
      int cs;
      hb_glyph_info_t *info = buffer->info;
      %%{
        write init;
        getkey info[p].myanmar_category();
      }%%
    
      p = 0;
      pe = eof = buffer->len;
    
      unsigned int syllable_serial = 1;
      %%{
        write exec;
      }%%
    }
    
    #undef found_syllable
    
    #endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH */