fix: consistent usage of bitmask operations on unicode functions

This commit is contained in:
Markus Teich 2013-06-22 23:06:49 +02:00 committed by Roberto E. Vargas Caballero
parent 8b602a37a6
commit 6fc471ccc6

50
st.c
View file

@ -150,10 +150,6 @@ enum selection_snap {
SNAP_LINE = 2 SNAP_LINE = 2
}; };
/* bit macro */
#undef B0
enum { B0=1, B1=2, B2=4, B3=8, B4=16, B5=32, B6=64, B7=128 };
typedef unsigned char uchar; typedef unsigned char uchar;
typedef unsigned int uint; typedef unsigned int uint;
typedef unsigned long ulong; typedef unsigned long ulong;
@ -527,17 +523,17 @@ utf8decode(char *s, long *u) {
rtn = 1; rtn = 1;
c = *s; c = *s;
if(~c & B7) { /* 0xxxxxxx */ if(~c & 0x80) { /* 0xxxxxxx */
*u = c; *u = c;
return rtn; return rtn;
} else if((c & (B7|B6|B5)) == (B7|B6)) { /* 110xxxxx */ } else if((c & 0xE0) == 0xC0) { /* 110xxxxx */
*u = c&(B4|B3|B2|B1|B0); *u = c & 0x1F;
n = 1; n = 1;
} else if((c & (B7|B6|B5|B4)) == (B7|B6|B5)) { /* 1110xxxx */ } else if((c & 0xF0) == 0xE0) { /* 1110xxxx */
*u = c&(B3|B2|B1|B0); *u = c & 0x0F;
n = 2; n = 2;
} else if((c & (B7|B6|B5|B4|B3)) == (B7|B6|B5|B4)) { /* 11110xxx */ } else if((c & 0xF8) == 0xF0) { /* 11110xxx */
*u = c & (B2|B1|B0); *u = c & 0x07;
n = 3; n = 3;
} else { } else {
goto invalid; goto invalid;
@ -545,10 +541,10 @@ utf8decode(char *s, long *u) {
for(i = n, ++s; i > 0; --i, ++rtn, ++s) { for(i = n, ++s; i > 0; --i, ++rtn, ++s) {
c = *s; c = *s;
if((c & (B7|B6)) != B7) /* 10xxxxxx */ if((c & 0xC0) != 0x80) /* 10xxxxxx */
goto invalid; goto invalid;
*u <<= 6; *u <<= 6;
*u |= c & (B5|B4|B3|B2|B1|B0); *u |= c & 0x3F;
} }
if((n == 1 && *u < 0x80) || if((n == 1 && *u < 0x80) ||
@ -577,20 +573,20 @@ utf8encode(long *u, char *s) {
*sp = uc; /* 0xxxxxxx */ *sp = uc; /* 0xxxxxxx */
return 1; return 1;
} else if(*u < 0x800) { } else if(*u < 0x800) {
*sp = (uc >> 6) | (B7|B6); /* 110xxxxx */ *sp = (uc >> 6) | 0xC0; /* 110xxxxx */
n = 1; n = 1;
} else if(uc < 0x10000) { } else if(uc < 0x10000) {
*sp = (uc >> 12) | (B7|B6|B5); /* 1110xxxx */ *sp = (uc >> 12) | 0xE0; /* 1110xxxx */
n = 2; n = 2;
} else if(uc <= 0x10FFFF) { } else if(uc <= 0x10FFFF) {
*sp = (uc >> 18) | (B7|B6|B5|B4); /* 11110xxx */ *sp = (uc >> 18) | 0xF0; /* 11110xxx */
n = 3; n = 3;
} else { } else {
goto invalid; goto invalid;
} }
for(i=n,++sp; i>0; --i,++sp) 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; return n+1;
invalid: invalid:
@ -613,16 +609,16 @@ isfullutf8(char *s, int b) {
c3 = (uchar *)++s; c3 = (uchar *)++s;
if(b < 1) { if(b < 1) {
return 0; return 0;
} else if((*c1&(B7|B6|B5)) == (B7|B6) && b == 1) { } else if((*c1 & 0xE0) == 0xC0 && b == 1) {
return 0; return 0;
} else if((*c1&(B7|B6|B5|B4)) == (B7|B6|B5) && } else if((*c1 & 0xF0) == 0xE0 &&
((b == 1) || ((b == 1) ||
((b == 2) && (*c2&(B7|B6)) == B7))) { ((b == 2) && (*c2 & 0xC0) == 0x80))) {
return 0; return 0;
} else if((*c1&(B7|B6|B5|B4|B3)) == (B7|B6|B5|B4) && } else if((*c1 & 0xF8) == 0xF0 &&
((b == 1) || ((b == 1) ||
((b == 2) && (*c2&(B7|B6)) == B7) || ((b == 2) && (*c2 & 0xC0) == 0x80) ||
((b == 3) && (*c2&(B7|B6)) == B7 && (*c3&(B7|B6)) == B7))) { ((b == 3) && (*c2 & 0xC0) == 0x80 && (*c3 & 0xC0) == 0x80))) {
return 0; return 0;
} else { } else {
return 1; return 1;
@ -633,11 +629,11 @@ int
utf8size(char *s) { utf8size(char *s) {
uchar c = *s; uchar c = *s;
if(~c&B7) { if(~c & 0x80) {
return 1; return 1;
} else if((c&(B7|B6|B5)) == (B7|B6)) { } else if((c & 0xE0) == 0xC0) {
return 2; return 2;
} else if((c&(B7|B6|B5|B4)) == (B7|B6|B5)) { } else if((c & 0xF0) == 0xE0) {
return 3; return 3;
} else { } else {
return 4; return 4;
@ -3456,7 +3452,7 @@ kpress(XEvent *ev) {
if(len == 1 && e->state & Mod1Mask) { if(len == 1 && e->state & Mod1Mask) {
if(IS_SET(MODE_8BIT)) { if(IS_SET(MODE_8BIT)) {
if(*xstr < 0177) { if(*xstr < 0177) {
c = *xstr | B7; c = *xstr | 0x80;
ret = utf8encode(&c, cp); ret = utf8encode(&c, cp);
cp += ret; cp += ret;
len = 0; len = 0;