summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2015-07-02 10:01:42 +0100
committerPeter Stephenson <pws@zsh.org>2015-07-02 10:01:42 +0100
commit2afdb3985aae08403e1e5ab6193cd67c695b6e2b (patch)
treee6c66c0eefef3309f34d7153c7ecfd5949edd99f /Src
parentdce1f33c02c855e9d5f588716d7e9ddaea3887ba (diff)
downloadzsh-2afdb3985aae08403e1e5ab6193cd67c695b6e2b.tar.gz
zsh-2afdb3985aae08403e1e5ab6193cd67c695b6e2b.zip
35668: Improved fix for command/proc subst starting in alias.
Use input flag to suppress the unwanted backtracking. Add test for the extra case covered.
Diffstat (limited to 'Src')
-rw-r--r--Src/input.c2
-rw-r--r--Src/lex.c26
-rw-r--r--Src/zsh.h2
3 files changed, 18 insertions, 12 deletions
diff --git a/Src/input.c b/Src/input.c
index 4a5bf89c6..613f89a25 100644
--- a/Src/input.c
+++ b/Src/input.c
@@ -591,7 +591,7 @@ inpoptop(void)
* history is before, but they're both pushed onto
* the input stack.
*/
- if ((inbufflags & (INP_ALIAS|INP_HIST)) == INP_ALIAS)
+ if ((inbufflags & (INP_ALIAS|INP_HIST|INP_RAW_KEEP)) == INP_ALIAS)
zshlex_raw_back();
}
}
diff --git a/Src/lex.c b/Src/lex.c
index 910773ca4..b0cd96340 100644
--- a/Src/lex.c
+++ b/Src/lex.c
@@ -162,7 +162,7 @@ static int lex_add_raw;
/* variables associated with the above */
-static char *tokstr_raw, *lexbuf_ptr_start;
+static char *tokstr_raw;
static struct lexbufstate lexbuf_raw;
/* text of punctuation tokens */
@@ -229,13 +229,12 @@ lex_context_save(struct lex_stack *ls, int toplevel)
ls->lex_add_raw = lex_add_raw;
ls->tokstr_raw = tokstr_raw;
ls->lexbuf_raw = lexbuf_raw;
- ls->lexbuf_ptr_start = lexbuf_ptr_start;
ls->lexstop = lexstop;
ls->toklineno = toklineno;
tokstr = zshlextext = lexbuf.ptr = NULL;
lexbuf.siz = 256;
- tokstr_raw = lexbuf_raw.ptr = lexbuf_ptr_start = NULL;
+ tokstr_raw = lexbuf_raw.ptr = NULL;
lexbuf_raw.siz = lexbuf_raw.len = lex_add_raw = 0;
}
@@ -258,7 +257,6 @@ lex_context_restore(const struct lex_stack *ls, int toplevel)
lex_add_raw = ls->lex_add_raw;
tokstr_raw = ls->tokstr_raw;
lexbuf_raw = ls->lexbuf_raw;
- lexbuf_ptr_start = ls->lexbuf_ptr_start;
lexstop = ls->lexstop;
toklineno = ls->toklineno;
}
@@ -1884,7 +1882,7 @@ zshlex_raw_add(int c)
void
zshlex_raw_back(void)
{
- if (!lex_add_raw || lexbuf_raw.ptr == lexbuf_ptr_start)
+ if (!lex_add_raw)
return;
lexbuf_raw.ptr--;
lexbuf_raw.len--;
@@ -1995,7 +1993,7 @@ skipcomm(void)
cmdpop();
return lexstop;
#else
- char *new_tokstr, *new_lexbuf_ptr_start;
+ char *new_tokstr;
int new_lexstop, new_lex_add_raw;
struct lexbufstate new_lexbuf;
@@ -2023,6 +2021,18 @@ skipcomm(void)
new_tokstr = tokstr;
new_lexbuf = lexbuf;
+ /*
+ * If we're expanding an alias at this point, we need the whole
+ * remaining text as part of the string for the command in
+ * parentheses, so don't backtrack. This is different from the
+ * usual case where the alias is fully within the command, where
+ * we want the unexpanded text so that it will be expanded
+ * again when the command in the parentheses is executed.
+ *
+ * I never wanted to be a software engineer, you know.
+ */
+ if (inbufflags & INP_ALIAS)
+ inbufflags |= INP_RAW_KEEP;
zcontext_save_partial(ZCONTEXT_LEX|ZCONTEXT_PARSE);
hist_in_word(1);
} else {
@@ -2042,7 +2052,6 @@ skipcomm(void)
}
tokstr_raw = new_tokstr;
lexbuf_raw = new_lexbuf;
- lexbuf_ptr_start = lexbuf_raw.ptr;
lex_add_raw = new_lex_add_raw;
/*
* Don't do any ZLE specials down here: they're only needed
@@ -2067,7 +2076,6 @@ skipcomm(void)
*/
new_tokstr = tokstr_raw;
new_lexbuf = lexbuf_raw;
- new_lexbuf_ptr_start = lexbuf_ptr_start;
/*
* We're also going to propagate the lexical state:
* if we couldn't parse the command substitution we
@@ -2083,7 +2091,6 @@ skipcomm(void)
*/
tokstr_raw = new_tokstr;
lexbuf_raw = new_lexbuf;
- lexbuf_ptr_start = new_lexbuf_ptr_start;
} else {
if (!new_lexstop) {
/* Ignore the ')' added on input */
@@ -2098,7 +2105,6 @@ skipcomm(void)
tokstr = new_tokstr;
lexbuf = new_lexbuf;
lexstop = new_lexstop;
- lexbuf_ptr_start = (char *)NULL;
hist_in_word(0);
}
diff --git a/Src/zsh.h b/Src/zsh.h
index d11d4fea2..69fef33f5 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -425,6 +425,7 @@ enum {
#define INP_HISTCONT (1<<5) /* stack is continued from history expn. */
#define INP_LINENO (1<<6) /* update line number */
#define INP_APPEND (1<<7) /* Append new lines to allow backup */
+#define INP_RAW_KEEP (1<<8) /* Input needed in raw mode even if alias */
/* Flags for metafy */
#define META_REALLOC 0
@@ -2801,7 +2802,6 @@ struct lex_stack {
int lex_add_raw;
char *tokstr_raw;
struct lexbufstate lexbuf_raw;
- char *lexbuf_ptr_start;
int lexstop;
zlong toklineno;
};