1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-24 17:00:32 +02:00

34560: Fix $(( that's actually a multiline cmd subst.

This commit is contained in:
Peter Stephenson 2015-02-16 17:16:57 +00:00
parent 041a85243e
commit 126fb61c7c
5 changed files with 73 additions and 2 deletions

View file

@ -1,5 +1,7 @@
2015-02-16 Peter Stephenson <p.stephenson@samsung.com>
* 34560: Src/input. Src/lex.c, Src/zsh.h, Test/C01arith.ztst:
* 34558: Doc/Zsh/func.yo: preexec doc erroneously claimed $1
was empty if line removed from history.

View file

@ -330,8 +330,37 @@ inputline(void)
}
}
isfirstch = 1;
if ((inbufflags & INP_APPEND) && inbuf) {
/*
* We need new input but need to be able to back up
* over the old input, so append this line.
* Pushing the line onto the stack doesn't have the right
* effect.
*
* This is quite a simple and inefficient fix, but currently
* we only need it when backing up over a multi-line $((...
* that turned out to be a command substitution rather than
* a math substitution, which is a very special case.
* So it's not worth rewriting.
*/
char *oinbuf = inbuf;
int newlen = strlen(ingetcline);
int oldlen = (int)(inbufptr - inbuf) + inbufleft;
if (inbufflags & INP_FREE) {
inbuf = realloc(inbuf, oldlen + newlen + 1);
inbufptr += inbuf - oinbuf;
strcpy(inbuf + oldlen, ingetcline);
} else {
/* Paranoia: don't think this is used */
DPUTS(1, "Appending to unallocated input line.");
}
inbufleft += newlen;
inbufct += newlen;
inbufflags |= INP_FREE;
} else {
/* Put this into the input channel. */
inputsetline(ingetcline, INP_FREE);
}
return 0;
}

View file

@ -483,9 +483,13 @@ cmd_or_math(int cs_type)
{
int oldlen = lexbuf.len;
int c;
int oinflags = inbufflags;
cmdpush(cs_type);
inbufflags |= INP_APPEND;
c = dquote_parse(')', 0);
if (!(oinflags & INP_APPEND))
inbufflags &= ~INP_APPEND;
cmdpop();
*lexbuf.ptr = '\0';
if (!c) {

View file

@ -410,6 +410,7 @@ enum {
#define INP_CONT (1<<3) /* continue onto previously stacked input */
#define INP_ALCONT (1<<4) /* stack is continued from alias expn. */
#define INP_LINENO (1<<5) /* update line number */
#define INP_APPEND (1<<6) /* Append new lines to allow backup */
/* Flags for metafy */
#define META_REALLOC 0

View file

@ -318,3 +318,38 @@
# 0.75 is exactly representable, don't expect rounding error.
>0
>0.75
# The following tests for a bug that only happens when
# backing up over input read a line at a time, so we'll
# read the input from stdin.
$ZTST_testdir/../Src/zsh -f <<<'
print $((echo first command
); echo second command)
print third command
'
0:Backing up a line of input when finding out it's not arithmetic
>first command second command
>third command
$ZTST_testdir/../Src/zsh -f <<<'
print $((3 +
4))
print next line
'
0:Not needing to back up a line when reading multiline arithmetic
>7
>next line
$ZTST_testdir/../Src/zsh -f <<<'
print $((case foo in
bar)
echo not this no, no
;;
foo)
echo yes, this one
;;
esac)
print after case in subshell)
'
0:Non-arithmetic subst with command subsitution parse from hell
>yes, this one after case in subshell