Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: More incmdpos stuff Re: Crash Re: Trial for 5.0.7
- X-seq: zsh-workers 33343
- From: Peter Stephenson <p.stephenson@xxxxxxxxxxx>
- To: zsh workers <zsh-workers@xxxxxxx>
- Subject: Re: More incmdpos stuff Re: Crash Re: Trial for 5.0.7
- Date: Fri, 03 Oct 2014 13:27:02 +0100
- In-reply-to: <CAHYJk3Q73heVqMyH+2c1_ihT4k+OghoJY+J9e0MJSTEL=AEM+w@mail.gmail.com>
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
- Organization: Samsung Cambridge Solution Centre
- References: <CAHYJk3Q73heVqMyH+2c1_ihT4k+OghoJY+J9e0MJSTEL=AEM+w@mail.gmail.com>
On Fri, 03 Oct 2014 13:47:25 +0200
Mikael Magnusson <mikachu@xxxxxxxxx> wrote:
> % () ( echo hi; echo $@ ) ls
> hi
> ls --color=auto -T 0 -A -v --quoting-style=shell
I think the right answer is along the lines of "WHY THE **@*@*@ WOULD
ANYBODY USE SYNTAX LIKE THAT SHELL SYNTAX IS UNREADABLE ENOUGH AS IT IS
WITHOUT (FROTH, GIBBER, ...)", but instead here's a minimal change until
I get around to investigating why I thought I needed to leave incmdpos
= 1 for non-anymous functions.
diff --git a/Src/parse.c b/Src/parse.c
index 6cba050..860bb4b 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -729,7 +729,7 @@ par_pline(int *complex)
p = ecadd(0);
- if (!par_cmd(complex)) {
+ if (!par_cmd(complex, 0)) {
ecused--;
return 0;
}
@@ -780,11 +780,15 @@ par_pline(int *complex)
/*
* cmd : { redir } ( for | case | if | while | repeat |
* subsh | funcdef | time | dinbrack | dinpar | simple ) { redir }
+ *
+ * With zsh_construct non-zero, we're doing a zsh special in which
+ * the following token is not considered in command position. This
+ * is used for arguments of anonymous functions.
*/
/**/
static int
-par_cmd(int *complex)
+par_cmd(int *complex, int zsh_construct)
{
int r, nr = 0;
@@ -839,12 +843,12 @@ par_cmd(int *complex)
case INPAR:
*complex = 1;
cmdpush(CS_SUBSH);
- par_subsh(complex);
+ par_subsh(complex, zsh_construct);
cmdpop();
break;
case INBRACE:
cmdpush(CS_CURSH);
- par_subsh(complex);
+ par_subsh(complex, zsh_construct);
cmdpop();
break;
case FUNC:
@@ -1378,11 +1382,13 @@ par_repeat(int *complex)
/*
* subsh : INPAR list OUTPAR |
* INBRACE list OUTBRACE [ "always" INBRACE list OUTBRACE ]
+ *
+ * zsh_construct is passed through to par_cmd(), q.v.
*/
/**/
static void
-par_subsh(int *complex)
+par_subsh(int *complex, int zsh_construct)
{
enum lextok otok = tok;
int oecused = ecused, p, pp;
@@ -1395,7 +1401,7 @@ par_subsh(int *complex)
ecadd(WCB_END());
if (tok != ((otok == INPAR) ? OUTPAR : OUTBRACE))
YYERRORV(oecused);
- incmdpos = 1;
+ incmdpos = !zsh_construct;
zshlex();
/* Optional always block. No intervening SEPERs allowed. */
@@ -1760,10 +1766,21 @@ par_simple(int *complex, int nr)
sl = ecadd(0);
(void)ecadd(WCB_PIPE(WC_PIPE_END, 0));
- if (!par_cmd(&c)) {
+ if (!par_cmd(&c, argc == 0)) {
cmdpop();
YYERROR(oecused);
}
+ if (argc == 0) {
+ /*
+ * Anonymous function, possibly with arguments.
+ * N.B. for complex structures in particular
+ * ( ... ) we rely on lower level code doing this
+ * to get the immediately following word (the
+ * first token after the ")" has already been
+ * read).
+ */
+ incmdpos = 0;
+ }
set_sublist_code(sl, WC_SUBLIST_END, 0, ecused - 1 - sl, c);
set_list_code(ll, (Z_SYNC | Z_END), c);
diff --git a/Test/C04funcdef.ztst b/Test/C04funcdef.ztst
index a266031..1937570 100644
--- a/Test/C04funcdef.ztst
+++ b/Test/C04funcdef.ztst
@@ -272,6 +272,12 @@
>ignorebraces is off
>ignorebraces is still on here
+# lsfoo should not be expanded as an anonymous function argument
+ alias lsfoo='This is not ls.'
+ () (echo anon func; echo "$@") lsfoo
+0:Anonmous function with arguments in a form nobody sane would ever use but unfortunately we have to support anyway
+>anon func
+>lsfoo
%clean
Messages sorted by:
Reverse Date,
Date,
Thread,
Author