From 2afdb3985aae08403e1e5ab6193cd67c695b6e2b Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 2 Jul 2015 10:01:42 +0100 Subject: 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. --- Src/lex.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'Src/lex.c') 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); } -- cgit 1.4.1