From 6fa63a0ce2b2aa31a343ca0841b57895d11b5754 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 22 Feb 2015 21:32:08 +0000 Subject: 34606: fix up nested arithmetic substitution Arithmetic within a parameter substitution is a special case that needs fixing with the introduction of the new Inparmath token. Add test. --- ChangeLog | 3 +++ Src/subst.c | 20 ++++++++++++++++++-- Test/C01arith.ztst | 8 ++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index db222762a..31988c5b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-02-22 Peter Stephenson + * 34606: Src/subst.c, Test/C01arith.ztst: fix up arithmetic + nested in parameter substitution. + * 34604: Src/hist.c: Work around problem with changes in Meta affecting history file when read in. diff --git a/Src/subst.c b/Src/subst.c index 176a004ac..f52bcdfc8 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -2217,12 +2217,28 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags) */ idbeg = s; if ((subexp = (inbrace && s[-1] && isstring(*s) && - (s[1] == Inbrace || s[1] == Inpar)))) { + (s[1] == Inbrace || s[1] == Inpar || s[1] == Inparmath)))) { int sav; int quoted = *s == Qstring; + int outtok; val = s++; - skipparens(*s, *s == Inpar ? Outpar : Outbrace, &s); + switch (*s) { + case Inbrace: + outtok = Outbrace; + break; + case Inpar: + outtok = Outpar; + break; + case Inparmath: + outtok = Outparmath; + break; + default: + /* "Can't Happen" (TM) */ + DPUTS(1, "Nested substitution: This Can't Happen (TM)"); + return NULL; + } + skipparens(*s, outtok, &s); sav = *s; *s = 0; /* diff --git a/Test/C01arith.ztst b/Test/C01arith.ztst index 67d78ee13..d3176dd5e 100644 --- a/Test/C01arith.ztst +++ b/Test/C01arith.ztst @@ -300,6 +300,7 @@ print $(( 0b2 )) 1:Binary numbers don't tend to have 2's in ?(eval):1: bad math expression: operator expected at `2 ' +# ` for emacs shell mode integer varassi print $(( varassi = 5.5 / 2.0 )) @@ -376,3 +377,10 @@ esac)) 0:Would-be math expansion with extra parenthesis making it a cmd subst >Worked OK + + (setopt extendedglob + set -- 32.463 + print ${$(( $1 * 100 ))%%.[0-9]#}) +0:Arithmetic substitution nested in parameter substitution +>3246 + -- cgit 1.4.1