diff options
author | Peter Stephenson <pws@zsh.org> | 2016-11-14 10:12:04 +0000 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2016-11-14 10:12:04 +0000 |
commit | 99acd1e7f48414e34aa08ec8246caa09088861df (patch) | |
tree | 66470736f61944de97a8d7178cec1fdc183a26ad | |
parent | 56e3d23b98628a50359e2a54bdb1837d063802df (diff) | |
download | zsh-99acd1e7f48414e34aa08ec8246caa09088861df.tar.gz zsh-99acd1e7f48414e34aa08ec8246caa09088861df.tar.xz zsh-99acd1e7f48414e34aa08ec8246caa09088861df.zip |
39906: More multibyte optimisations for US-ASCII.
This treats characters 0 to 0x7f as single byte US-ASCII along the lines we already do in other places in the code.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/utils.c | 26 |
2 files changed, 28 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog index 3ca016ef4..27e01c232 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2016-11-14 Peter Stephenson <p.stephenson@samsung.com> + + * 39906: Src/utils.c: More optimisation of multibyte handling + for US-ASCII along existing lines. + 2016-11-13 Barton E. Schaefer <schaefer@zsh.org> * unposted: Src/Zle/zle_utils.c: comment in zlecallhook() points diff --git a/Src/utils.c b/Src/utils.c index 3d535b85c..cceaf4c57 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -84,7 +84,15 @@ set_widearray(char *mb_array, Widechar_array wca) mb_charinit(); while (*mb_array) { - int mblen = mb_metacharlenconv(mb_array, &wci); + int mblen; + + if (STOUC(*mb_array) <= 0x7f) { + mb_array++; + *wcptr++ = (wchar_t)*mb_array; + continue; + } + + mblen = mb_metacharlenconv(mb_array, &wci); if (!mblen) break; @@ -5249,6 +5257,12 @@ mb_metacharlenconv_r(const char *s, wint_t *wcp, mbstate_t *mbsp) const char *ptr; wchar_t wc; + if (STOUC(*s) <= 0x7f) { + if (wcp) + *wcp = (wint_t)*s; + return 1; + } + for (ptr = s; *ptr; ) { if (*ptr == Meta) { inchar = *++ptr ^ 32; @@ -5301,7 +5315,7 @@ mb_metacharlenconv_r(const char *s, wint_t *wcp, mbstate_t *mbsp) mod_export int mb_metacharlenconv(const char *s, wint_t *wcp) { - if (!isset(MULTIBYTE)) { + if (!isset(MULTIBYTE) || STOUC(*s) <= 0x7f) { /* treat as single byte, possibly metafied */ if (wcp) *wcp = (wint_t)(*s == Meta ? s[1] ^ 32 : *s); @@ -5442,6 +5456,12 @@ mb_charlenconv_r(const char *s, int slen, wint_t *wcp, mbstate_t *mbsp) const char *ptr; wchar_t wc; + if (slen && STOUC(*s) <= 0x7f) { + if (wcp) + *wcp = (wint_t)*s; + return 1; + } + for (ptr = s; slen; ) { inchar = *ptr; ptr++; @@ -5477,7 +5497,7 @@ mb_charlenconv_r(const char *s, int slen, wint_t *wcp, mbstate_t *mbsp) mod_export int mb_charlenconv(const char *s, int slen, wint_t *wcp) { - if (!isset(MULTIBYTE)) { + if (!isset(MULTIBYTE) || STOUC(*s) <= 0x7f) { if (wcp) *wcp = (wint_t)*s; return 1; |