mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-26 16:40:29 +01:00
34560: Fix $(( that's actually a multiline cmd subst.
This commit is contained in:
parent
041a85243e
commit
126fb61c7c
5 changed files with 73 additions and 2 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
2015-02-16 Peter Stephenson <p.stephenson@samsung.com>
|
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
|
* 34558: Doc/Zsh/func.yo: preexec doc erroneously claimed $1
|
||||||
was empty if line removed from history.
|
was empty if line removed from history.
|
||||||
|
|
||||||
|
|
|
||||||
33
Src/input.c
33
Src/input.c
|
|
@ -330,8 +330,37 @@ inputline(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isfirstch = 1;
|
isfirstch = 1;
|
||||||
/* Put this into the input channel. */
|
if ((inbufflags & INP_APPEND) && inbuf) {
|
||||||
inputsetline(ingetcline, INP_FREE);
|
/*
|
||||||
|
* 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -483,9 +483,13 @@ cmd_or_math(int cs_type)
|
||||||
{
|
{
|
||||||
int oldlen = lexbuf.len;
|
int oldlen = lexbuf.len;
|
||||||
int c;
|
int c;
|
||||||
|
int oinflags = inbufflags;
|
||||||
|
|
||||||
cmdpush(cs_type);
|
cmdpush(cs_type);
|
||||||
|
inbufflags |= INP_APPEND;
|
||||||
c = dquote_parse(')', 0);
|
c = dquote_parse(')', 0);
|
||||||
|
if (!(oinflags & INP_APPEND))
|
||||||
|
inbufflags &= ~INP_APPEND;
|
||||||
cmdpop();
|
cmdpop();
|
||||||
*lexbuf.ptr = '\0';
|
*lexbuf.ptr = '\0';
|
||||||
if (!c) {
|
if (!c) {
|
||||||
|
|
|
||||||
|
|
@ -410,6 +410,7 @@ enum {
|
||||||
#define INP_CONT (1<<3) /* continue onto previously stacked input */
|
#define INP_CONT (1<<3) /* continue onto previously stacked input */
|
||||||
#define INP_ALCONT (1<<4) /* stack is continued from alias expn. */
|
#define INP_ALCONT (1<<4) /* stack is continued from alias expn. */
|
||||||
#define INP_LINENO (1<<5) /* update line number */
|
#define INP_LINENO (1<<5) /* update line number */
|
||||||
|
#define INP_APPEND (1<<6) /* Append new lines to allow backup */
|
||||||
|
|
||||||
/* Flags for metafy */
|
/* Flags for metafy */
|
||||||
#define META_REALLOC 0
|
#define META_REALLOC 0
|
||||||
|
|
|
||||||
|
|
@ -318,3 +318,38 @@
|
||||||
# 0.75 is exactly representable, don't expect rounding error.
|
# 0.75 is exactly representable, don't expect rounding error.
|
||||||
>0
|
>0
|
||||||
>0.75
|
>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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue