From e8edd42f7ff0fefbf74db7fbab2d242852b6bce6 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 2 Jul 2017 20:29:00 +0100 Subject: 22760: fix partial string length reports with NO_MULTIBYTE --- ChangeLog | 5 +++++ Src/utils.c | 2 +- Test/D04parameter.ztst | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 7ed5ba565..c843d8856 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-07-02 Peter Stephenson + + * 22760: Src/utils.c, Test/D04parameter.ztst: NO_MULTIBYTE + partial string lengths were reported as full string lengths. + 2017-06-27 Peter Stephenson * 41368: Src/Zle/compctl.c: missing unqueue_signals(). diff --git a/Src/utils.c b/Src/utils.c index acb891d82..1b80e8cb0 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -5417,7 +5417,7 @@ mb_metastrlenend(char *ptr, int width, char *eptr) int num, num_in_char, complete; if (!isset(MULTIBYTE)) - return ztrlen(ptr); + return eptr ? (int)(eptr - ptr) : ztrlen(ptr); laststart = ptr; ret = MB_INVALID; diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst index d5798b5b9..3c93990f1 100644 --- a/Test/D04parameter.ztst +++ b/Test/D04parameter.ztst @@ -783,16 +783,36 @@ 0:${(R)...} >is the , + # Although there's no reliance on multibyte here, the + # code exercised is different, so test both paths in the following group. + # If the shell isn't multibyte capable the tests are the same; + # that's not a problem. # This (1) doesn't work with // or / # (2) perhaps ought to be 18, to be consistent with normal zsh # substring indexing and with backreferences. print ${(BES)string##white} + (unsetopt multibyte; print ${(BES)string##white}) 0:${(BE...)...} +>14 19 >14 19 print ${(NS)string##white} + (unsetopt multibyte; print ${(NS)string##white}) 0:${(N)...} >5 +>5 + + fn() { + emulate -L zsh + local a=abcdef + print ${(SNBE)a#abcd} + unsetopt multibyte + print ${(SNBE)a#abcd} + } + fn +0:${(BEN)...} again, with match +>1 5 4 +>1 5 4 string='abcdefghijklmnopqrstuvwxyz' print ${${string%[aeiou]*}/(#m)?(#e)/${(U)MATCH}} -- cgit 1.4.1