diff options
| author | Rich Felker <dalias@aerifal.cx> | 2012-04-23 16:10:36 -0400 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2012-04-23 16:10:36 -0400 | 
| commit | 38b5d7d0526be24fba0f0789407727e4e7950e63 (patch) | |
| tree | 3a37bf481d568fc073f03b6a2111db4474ffeae2 /src | |
| parent | 640fe75ce8e0ca3a1af98197a93e9aa4884f79bf (diff) | |
| download | musl-38b5d7d0526be24fba0f0789407727e4e7950e63.tar.gz | |
optimize iswprint
Diffstat (limited to 'src')
| -rw-r--r-- | src/ctype/iswprint.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/src/ctype/iswprint.c b/src/ctype/iswprint.c index 7717671a..333f19c2 100644 --- a/src/ctype/iswprint.c +++ b/src/ctype/iswprint.c @@ -1,10 +1,19 @@  #include <wctype.h> +/* Consider all legal codepoints as printable except for: + * - C0 and C1 control characters + * - U+2028 and U+2029 (line/para break) + * - U+FFF9 through U+FFFB (interlinear annotation controls) + * The following code is optimized heavily to make hot paths for the + * expected printable characters. */ +  int iswprint(wint_t wc)  { -	unsigned c = wc; -	/* assume any non-control, non-illegal codepoint is printable */ -	if (c>0x10ffff || c-0xd800<0x800 || (c&0xfffe)==0xfffe || iswcntrl(c)) +	if (wc < 0xffU) +		return (wc+1 & 0x7f) >= 0x21; +	if (wc < 0x2028U || wc-0x202aU < 0xd800-0x202a || wc-0xe000U < 0xfff9-0xe000) +		return 1; +	if (wc-0xfffcU > 0x10ffff-0xfffc || (wc&0xfffe)==0xfffe)  		return 0;  	return 1;  }  | 
