Ticket #3012: UTF8Char.h.diff

File UTF8Char.h.diff, 2.0 KB (added by andreas_dr, 16 years ago)

This should be the correct way to check the bytecount since it checks the complete length-bitsequence

  • src/apps/terminal/UTF8Char.h

     
    2828
    2929       void SetTo(const char* c, int32 count)
    3030       {
    31                bytes[0] = c[0];
    32                if (count > 1) {
    33                        bytes[1] = c[1];
    34                        if (count > 2) {
    35                                bytes[2] = c[2];
    36                                if (count > 3)
    37                                        bytes[3] = c[3];
    38                        }
     31               for (int i = 0; i < count; i++) {
     32                       bytes[i] = c[i];
    3933               }
    4034       }
    4135
    4236       static int32 ByteCount(char firstChar)
    4337       {
    44                // Note, this does not recognize invalid chars
    45                uint32 c = firstChar;
    46                if (c < 0x80)
    47                        return 1;
    48                if (c < 0xe0)
    49                        return 2;
    50                return c < 0xf0 ? 3 : 4;
     38               const unsigned char BIT3 = 8;
     39               const unsigned char BIT4 = 16;
     40               const unsigned char BIT5 = 32;
     41               const unsigned char BIT6 = 64;
     42               const unsigned char BIT7 = 128;
     43
     44               uchar c = (uchar)firstChar;
     45               uchar invc = ~c;
     46
     47               if ((invc & BIT7) == BIT7)
     48                       return 1; else
     49               if (((c & (BIT7 | BIT6)) == (BIT7 | BIT6))
     50                       && ((invc & BIT5) == BIT5))
     51                       return 2; else
     52               if (((c & (BIT7 | BIT6 | BIT5)) == (BIT7 | BIT6 | BIT5))
     53                       && ((invc & BIT4) == BIT4))
     54                       return 3; else
     55               if (((c & (BIT7 | BIT6 | BIT5 | BIT4)) == (BIT7 | BIT6 | BIT5 | BIT4))
     56                       && ((invc & BIT3) == BIT3))
     57                       return 4; else
     58                       return 0; /* Error, no UTF8 Byte */
    5159       }
    5260
    5361       int32 ByteCount() const