mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-27 04:40:59 +01:00
39825: optimise mb_metastrlenend() for 7-bit character.
As the shell relies intimately on US-ASCII as a subset we can skip the multibyte functions if we are dealing with a complete 7-bit character.
This commit is contained in:
parent
6ea4e708ba
commit
9c68ef083b
2 changed files with 21 additions and 1 deletions
|
|
@ -1,3 +1,8 @@
|
|||
2016-11-04 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* Sebastian: 39825: Src/utils.c: Optimise mb_metastrlenend() for
|
||||
the common case of 7-bit character.
|
||||
|
||||
2016-11-04 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
|
||||
|
||||
* 39818 (Oliver Kiddle): Completion/Unix/Command/_awk: add nawk
|
||||
|
|
|
|||
17
Src/utils.c
17
Src/utils.c
|
|
@ -5323,7 +5323,7 @@ mb_metastrlenend(char *ptr, int width, char *eptr)
|
|||
char inchar, *laststart;
|
||||
size_t ret;
|
||||
wchar_t wc;
|
||||
int num, num_in_char;
|
||||
int num, num_in_char, complete;
|
||||
|
||||
if (!isset(MULTIBYTE))
|
||||
return ztrlen(ptr);
|
||||
|
|
@ -5331,6 +5331,7 @@ mb_metastrlenend(char *ptr, int width, char *eptr)
|
|||
laststart = ptr;
|
||||
ret = MB_INVALID;
|
||||
num = num_in_char = 0;
|
||||
complete = 1;
|
||||
|
||||
memset(&mb_shiftstate, 0, sizeof(mb_shiftstate));
|
||||
while (*ptr && !(eptr && ptr >= eptr)) {
|
||||
|
|
@ -5339,6 +5340,18 @@ mb_metastrlenend(char *ptr, int width, char *eptr)
|
|||
else
|
||||
inchar = *ptr;
|
||||
ptr++;
|
||||
|
||||
if (complete && (inchar >= 0 && inchar <= 0x7f)) {
|
||||
/*
|
||||
* We rely on 7-bit US-ASCII as a subset, so skip
|
||||
* multibyte handling if we have such a character.
|
||||
*/
|
||||
num++;
|
||||
laststart = ptr;
|
||||
num_in_char = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = mbrtowc(&wc, &inchar, 1, &mb_shiftstate);
|
||||
|
||||
if (ret == MB_INCOMPLETE) {
|
||||
|
|
@ -5358,6 +5371,7 @@ mb_metastrlenend(char *ptr, int width, char *eptr)
|
|||
* so we don't count characters twice.
|
||||
*/
|
||||
num_in_char++;
|
||||
complete = 0;
|
||||
} else {
|
||||
if (ret == MB_INVALID) {
|
||||
/* Reset, treat as single character */
|
||||
|
|
@ -5380,6 +5394,7 @@ mb_metastrlenend(char *ptr, int width, char *eptr)
|
|||
num++;
|
||||
laststart = ptr;
|
||||
num_in_char = 0;
|
||||
complete = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue