Ignore:
Timestamp:
Aug 15, 2014, 1:22:17 PM (5 years ago)
Author:
cameron
Message:

Fix carry increment bug; tag Seq byte ranges

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/utf8_encoder.cpp

    r3998 r4003  
    160160        {
    161161            Seq* seq = new Seq();
     162            seq->setType((u8Prefix(hbyte) ? Seq::Byte : Seq::Normal));
    162163            seq->AddREListItem(makeByteRange(lbyte, hbyte));
    163164            seq->AddREListItem(rangeToUTF8_helper(lo, hi, n + 1, hlen));
     
    169170bool UTF8_Encoder::u8Prefix(int cp)
    170171{
    171     bool retVal = false;
    172 
    173     if ((cp >= 0xC2) && (cp <= 0xDF))
    174     {
    175         retVal = true;
    176     }
    177     else if ((cp >= 0xE0) && (cp <= 0xEF))
    178     {
    179         retVal = true;
    180     }
    181     else if ((cp >= 0xF0) && (cp <= 0xF4))
    182     {
    183         retVal = true;
     172    return ((cp >= 0xC2) && (cp <= 0xF4));
     173}
     174
     175CC* UTF8_Encoder::makeByteRange(int lo, int hi)
     176{
     177    return new CC(lo, hi);
     178}
     179
     180CC* UTF8_Encoder::makeByteClass(int byteval)
     181{
     182    return new CC(byteval, byteval);
     183}
     184
     185int UTF8_Encoder::u8byte(int codepoint, int n)
     186{
     187    int retVal = 0;
     188
     189    int len = u8len(codepoint);
     190
     191    if (n == 1)
     192    {
     193        if (len == 1)
     194        {
     195            retVal = codepoint;
     196        }
     197        else if (len == 2)
     198        {
     199            retVal = 0xC0 | (codepoint >> 6);
     200        }
     201        else if (len == 3)
     202        {
     203            retVal = 0xE0 | (codepoint >> 12);
     204        }
     205        else
     206        {
     207            retVal = 0xF0 | (codepoint >> 18);
     208        }
     209    }
     210    else
     211    {
     212        retVal = 0x80 | ((codepoint >> (6 * (len - n))) & 0x3F);
    184213    }
    185214
     
    187216}
    188217
    189 CC* UTF8_Encoder::makeByteRange(int lo, int hi)
    190 {
    191     return new CC(lo, hi);
    192 }
    193 
    194 CC* UTF8_Encoder::makeByteClass(int byteval)
    195 {
    196     return new CC(byteval, byteval);
    197 }
    198 
    199 int UTF8_Encoder::u8byte(int codepoint, int n)
    200 {
    201     int retVal = 0;
    202 
    203     int len = u8len(codepoint);
    204 
    205     if (n == 1)
    206     {
    207         if (len == 1)
    208         {
    209             retVal = codepoint;
    210         }
    211         else if (len == 2)
    212         {
    213             retVal = 0xC0 | (codepoint >> 6);
    214         }
    215         else if (len == 3)
    216         {
    217             retVal = 0xE0 | (codepoint >> 12);
    218         }
    219         else
    220         {
    221             retVal = 0xF0 | (codepoint >> 18);
    222         }
    223     }
    224     else
    225     {
    226         retVal = 0x80 | ((codepoint >> (6 * (len - n))) & 0x3F);
    227     }
    228 
    229     return retVal;
    230 }
    231 
    232218int UTF8_Encoder::u8len(int cp)
    233219{
Note: See TracChangeset for help on using the changeset viewer.