From 0a532a8f7fc5144aa8d92bda5b0d5d3acf38cc0c Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sat, 10 Feb 2007 22:12:58 +0000 Subject: fix metafication of ${(#)x} --- ChangeLog | 6 ++++++ Src/subst.c | 12 ++++++++---- Test/D07multibyte.ztst | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 67dcc2abd..b4304be4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-02-10 Peter Stephenson + + * 23162: Src/subst.c, D07multibyte.ztst: ${(#)x} didn't + metafy the result, giving nonsense if x was somewhere between + 128 and 160. + 2007-02-08 Peter Stephenson * unposted: README: add note on 23159 to incompatibilities diff --git a/Src/subst.c b/Src/subst.c index be7b5321c..acd121e78 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -1193,21 +1193,25 @@ static char * substevalchar(char *ptr) { zlong ires = mathevali(ptr); + int len; if (errflag) return NULL; +#ifdef MULTIBYTE_SUPPORT if (isset(MULTIBYTE) && ires > 127) { char buf[10]; - int dummy; /* inefficient: should separate out \U handling from getkeystring */ sprintf(buf, "\\U%.8x", (unsigned int)ires); - return getkeystring(buf, &dummy, GETKEYS_BINDKEY, NULL); - } else { + ptr = getkeystring(buf, &len, GETKEYS_BINDKEY, NULL); + } else +#endif + { ptr = zhalloc(2); + len = 1; sprintf(ptr, "%c", (int)ires); - return ptr; } + return metafy(ptr, len, META_USEHEAP); } /* parameter substitution */ diff --git a/Test/D07multibyte.ztst b/Test/D07multibyte.ztst index c3a24c067..07479539b 100644 --- a/Test/D07multibyte.ztst +++ b/Test/D07multibyte.ztst @@ -326,3 +326,35 @@ 0:Multibyte characters in print sorting >HAH HEH HÉH HÈH HUH >HAH HEH HUH HÈH HÉH + +# These are control characters in Unicode, so don't show up. +# We just want to check they're not being treated as tokens. + for x in {128..150}; do + print ${(#)x} + done | while read line; do + print ${#line} $(( #line )) + done +0:evaluated character number with multibyte characters +>1 128 +>1 129 +>1 130 +>1 131 +>1 132 +>1 133 +>1 134 +>1 135 +>1 136 +>1 137 +>1 138 +>1 139 +>1 140 +>1 141 +>1 142 +>1 143 +>1 144 +>1 145 +>1 146 +>1 147 +>1 148 +>1 149 +>1 150 -- cgit 1.4.1