Changeset 4332


Ignore:
Timestamp:
Dec 10, 2014, 10:54:12 PM (4 years ago)
Author:
cameron
Message:

Fix UTF-8 parsing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/re_parser.cpp

    r4320 r4332  
    420420
    421421codepoint_t RE_Parser::parse_utf8_codepoint() {
    422     codepoint_t c = static_cast<codepoint_t>(*_cursor++);
     422    // Must cast to unsigned char to avoid sign extension.
     423    unsigned char c = static_cast<unsigned char>(*_cursor++);
     424    codepoint_t cp = c;
    423425    if (c > 0x80) { // if non-ascii
    424426        if (c < 0xC2) {
     
    428430            unsigned bytes = 0;
    429431            if (c < 0xE0) { // [0xC2, 0xDF]
    430                 c &= 0x1F;
     432                cp &= 0x1F;
    431433                bytes = 1;
    432434            }
    433435            else if (c < 0xF0) { // [0xE0, 0xEF]
    434                 c &= 0x0F;
     436                cp &= 0x0F;
    435437                bytes = 2;
    436438            }
    437439            else { // [0xF0, 0xFF]
    438                 c &= 0x0F;
     440                cp &= 0x0F;
    439441                bytes = 3;
    440442            }
    441             while (--bytes) {
    442                 if (++_cursor == _end || (*_cursor & 0xC0) != 0x80) {
     443            while (bytes--) {
     444                if (_cursor == _end) {
    443445                    throw InvalidUTF8Encoding();
    444446                }
    445                 c = (c << 6) | static_cast<codepoint_t>(*_cursor & 0x3F);
     447                c = static_cast<unsigned char>(*_cursor++);
     448                if ((c & 0xC0) != 0x80) {
     449                    throw InvalidUTF8Encoding();
     450                }
     451                cp = (cp << 6) | (c & 0x3F);
    446452                // It is an error if a 3-byte sequence is used to encode a codepoint < 0x800
    447453                // or a 4-byte sequence is used to encode a codepoint < 0x10000.
    448                 // if (((bytes == 1) && (c < 0x20)) || ((bytes == 2) && (c < 0x10))) {
    449                 if ((c << (bytes - 1)) < 0x20) {
     454                if (((bytes == 1) && (cp < 0x20)) || ((bytes == 2) && (cp < 0x10))) {
    450455                    throw InvalidUTF8Encoding();
    451456                }
     
    455460    // It is an error if a 4-byte sequence is used to encode a codepoint
    456461    // above the Unicode maximum.   
    457     if (c > CC::UNICODE_MAX) {
     462    if (cp > CC::UNICODE_MAX) {
    458463        throw InvalidUTF8Encoding();
    459464    }
    460     return c;
     465    return cp;
    461466}
    462467
Note: See TracChangeset for help on using the changeset viewer.