fix: consistent usage of bitmask operations on unicode functions - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6fc471ccc660b305cf836dcb8d57cdbffb4ed017
 (DIR) parent 8b602a37a65a3c001bd9334d8b1cfc17fc5dd45c
 (HTM) Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Sat, 22 Jun 2013 23:06:49 +0200
       
       fix: consistent usage of bitmask operations on unicode functions
       
       Diffstat:
         st.c                                |      50 ++++++++++++++-----------------
       
       1 file changed, 23 insertions(+), 27 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -150,10 +150,6 @@ enum selection_snap {
                SNAP_LINE = 2
        };
        
       -/* bit macro */
       -#undef B0
       -enum { B0=1, B1=2, B2=4, B3=8, B4=16, B5=32, B6=64, B7=128 };
       -
        ttypedef unsigned char uchar;
        ttypedef unsigned int uint;
        ttypedef unsigned long ulong;
       @@ -527,17 +523,17 @@ utf8decode(char *s, long *u) {
        
                rtn = 1;
                c = *s;
       -        if(~c & B7) { /* 0xxxxxxx */
       +        if(~c & 0x80) { /* 0xxxxxxx */
                        *u = c;
                        return rtn;
       -        } else if((c & (B7|B6|B5)) == (B7|B6)) { /* 110xxxxx */
       -                *u = c&(B4|B3|B2|B1|B0);
       +        } else if((c & 0xE0) == 0xC0) { /* 110xxxxx */
       +                *u = c & 0x1F;
                        n = 1;
       -        } else if((c & (B7|B6|B5|B4)) == (B7|B6|B5)) { /* 1110xxxx */
       -                *u = c&(B3|B2|B1|B0);
       +        } else if((c & 0xF0) == 0xE0) { /* 1110xxxx */
       +                *u = c & 0x0F;
                        n = 2;
       -        } else if((c & (B7|B6|B5|B4|B3)) == (B7|B6|B5|B4)) { /* 11110xxx */
       -                *u = c & (B2|B1|B0);
       +        } else if((c & 0xF8) == 0xF0) { /* 11110xxx */
       +                *u = c & 0x07;
                        n = 3;
                } else {
                        goto invalid;
       @@ -545,10 +541,10 @@ utf8decode(char *s, long *u) {
        
                for(i = n, ++s; i > 0; --i, ++rtn, ++s) {
                        c = *s;
       -                if((c & (B7|B6)) != B7) /* 10xxxxxx */
       +                if((c & 0xC0) != 0x80) /* 10xxxxxx */
                                goto invalid;
                        *u <<= 6;
       -                *u |= c & (B5|B4|B3|B2|B1|B0);
       +                *u |= c & 0x3F;
                }
        
                if((n == 1 && *u < 0x80) ||
       @@ -577,20 +573,20 @@ utf8encode(long *u, char *s) {
                        *sp = uc; /* 0xxxxxxx */
                        return 1;
                } else if(*u < 0x800) {
       -                *sp = (uc >> 6) | (B7|B6); /* 110xxxxx */
       +                *sp = (uc >> 6) | 0xC0; /* 110xxxxx */
                        n = 1;
                } else if(uc < 0x10000) {
       -                *sp = (uc >> 12) | (B7|B6|B5); /* 1110xxxx */
       +                *sp = (uc >> 12) | 0xE0; /* 1110xxxx */
                        n = 2;
                } else if(uc <= 0x10FFFF) {
       -                *sp = (uc >> 18) | (B7|B6|B5|B4); /* 11110xxx */
       +                *sp = (uc >> 18) | 0xF0; /* 11110xxx */
                        n = 3;
                } else {
                        goto invalid;
                }
        
                for(i=n,++sp; i>0; --i,++sp)
       -                *sp = ((uc >> 6*(i-1)) & (B5|B4|B3|B2|B1|B0)) | B7; /* 10xxxxxx */
       +                *sp = ((uc >> 6*(i-1)) & 0x3F) | 0x80; /* 10xxxxxx */
        
                return n+1;
        invalid:
       @@ -613,16 +609,16 @@ isfullutf8(char *s, int b) {
                c3 = (uchar *)++s;
                if(b < 1) {
                        return 0;
       -        } else if((*c1&(B7|B6|B5)) == (B7|B6) && b == 1) {
       +        } else if((*c1 & 0xE0) == 0xC0 && b == 1) {
                        return 0;
       -        } else if((*c1&(B7|B6|B5|B4)) == (B7|B6|B5) &&
       +        } else if((*c1 & 0xF0) == 0xE0 &&
                    ((b == 1) ||
       -            ((b == 2) && (*c2&(B7|B6)) == B7))) {
       +            ((b == 2) && (*c2 & 0xC0) == 0x80))) {
                        return 0;
       -        } else if((*c1&(B7|B6|B5|B4|B3)) == (B7|B6|B5|B4) &&
       +        } else if((*c1 & 0xF8) == 0xF0 &&
                    ((b == 1) ||
       -            ((b == 2) && (*c2&(B7|B6)) == B7) ||
       -            ((b == 3) && (*c2&(B7|B6)) == B7 && (*c3&(B7|B6)) == B7))) {
       +            ((b == 2) && (*c2 & 0xC0) == 0x80) ||
       +            ((b == 3) && (*c2 & 0xC0) == 0x80 && (*c3 & 0xC0) == 0x80))) {
                        return 0;
                } else {
                        return 1;
       @@ -633,11 +629,11 @@ int
        utf8size(char *s) {
                uchar c = *s;
        
       -        if(~c&B7) {
       +        if(~c & 0x80) {
                        return 1;
       -        } else if((c&(B7|B6|B5)) == (B7|B6)) {
       +        } else if((c & 0xE0) == 0xC0) {
                        return 2;
       -        } else if((c&(B7|B6|B5|B4)) == (B7|B6|B5)) {
       +        } else if((c & 0xF0) == 0xE0) {
                        return 3;
                } else {
                        return 4;
       @@ -3456,7 +3452,7 @@ kpress(XEvent *ev) {
                        if(len == 1 && e->state & Mod1Mask) {
                                if(IS_SET(MODE_8BIT)) {
                                        if(*xstr < 0177) {
       -                                        c = *xstr | B7;
       +                                        c = *xstr | 0x80;
                                                ret = utf8encode(&c, cp);
                                                cp += ret;
                                                len = 0;