diff options
| author | Markus Teich <markus.teich@stusta.mhn.de> | 2013-06-22 23:06:49 +0200 | 
|---|---|---|
| committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2013-07-04 09:28:19 +0200 | 
| commit | 6fc471ccc660b305cf836dcb8d57cdbffb4ed017 (patch) | |
| tree | 8019296fd8ed6a303d52da3185d1d162b0363f40 | |
| parent | 8b602a37a65a3c001bd9334d8b1cfc17fc5dd45c (diff) | |
fix: consistent usage of bitmask operations on unicode functions
| -rw-r--r-- | st.c | 50 | 
1 files changed, 23 insertions, 27 deletions
| @@ -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 }; -  typedef unsigned char uchar;  typedef unsigned int uint;  typedef 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; | 
