diff options
author | Tim J. Robbins <tjr@FreeBSD.org> | 2004-07-09 15:46:06 +0000 |
---|---|---|
committer | Tim J. Robbins <tjr@FreeBSD.org> | 2004-07-09 15:46:06 +0000 |
commit | 550473de5b157ddd51bf6403990323b0d5a68407 (patch) | |
tree | f70a23afb81a2bb69ccea6c4349f9dd0727d3d76 /lib | |
parent | fcc51917875e7f6d7d620c6a3e8268dcc6306baf (diff) | |
download | src-550473de5b157ddd51bf6403990323b0d5a68407.tar.gz src-550473de5b157ddd51bf6403990323b0d5a68407.zip |
Add fast paths for conversion of plain ASCII characters.
Notes
Notes:
svn path=/head/; revision=131881
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/locale/utf8.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/libc/locale/utf8.c b/lib/libc/locale/utf8.c index c0fbcf47d22b..bab04f05ebb7 100644 --- a/lib/libc/locale/utf8.c +++ b/lib/libc/locale/utf8.c @@ -90,6 +90,13 @@ _UTF8_mbrtowc(wchar_t * __restrict pwc, const char * __restrict s, size_t n, /* Incomplete multibyte sequence */ return ((size_t)-2); + if (us->want == 0 && ((ch = (unsigned char)*s) & ~0x7f) == 0) { + /* Fast path for plain ASCII characters. */ + if (pwc != NULL) + *pwc = ch; + return (ch != '\0' ? 1 : 0); + } + if (us->want == 0) { /* * Determine the number of octets that make up this character @@ -198,6 +205,12 @@ _UTF8_wcrtomb(char * __restrict s, wchar_t wc, mbstate_t * __restrict ps) /* Reset to initial shift state (no-op) */ return (1); + if ((wc & ~0x7f) == 0) { + /* Fast path for plain ASCII characters. */ + *s = (char)wc; + return (1); + } + /* * Determine the number of octets needed to represent this character. * We always output the shortest sequence possible. Also specify the |