aboutsummaryrefslogtreecommitdiff
path: root/Src/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/parse.c')
-rw-r--r--Src/parse.c56
1 files changed, 46 insertions, 10 deletions
diff --git a/Src/parse.c b/Src/parse.c
index 043aa0f0d..520181750 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -298,6 +298,8 @@ par_pline(void)
rdr->type = MERGEOUT;
rdr->fd1 = 2;
rdr->name = dupstring("1");
+ if (!c->redir)
+ c->redir = newlinklist();
addlinknode(c->redir, rdr);
cmdpush(CS_ERRPIPE);
@@ -330,11 +332,14 @@ par_cmd(void)
c = (Cmd) make_cmd();
c->lineno = lineno;
- c->args = newlinklist();
- c->redir = newlinklist();
- c->vars = newlinklist();
- while (IS_REDIROP(tok))
- par_redir(c->redir);
+ c->args = NULL;
+ c->vars = NULL;
+ if (IS_REDIROP(tok)) {
+ c->redir = newlinklist();
+ while (IS_REDIROP(tok))
+ par_redir(c->redir);
+ } else
+ c->redir = NULL;
switch (tok) {
case FOR:
cmdpush(CS_FOR);
@@ -399,6 +404,8 @@ par_cmd(void)
break;
case DINPAR:
c->type = CARITH;
+ if (!c->args)
+ c->args = newlinklist();
addlinknode(c->args, tokstr);
yylex();
break;
@@ -407,8 +414,12 @@ par_cmd(void)
return NULL;
break;
}
- while (IS_REDIROP(tok))
- par_redir(c->redir);
+ if (IS_REDIROP(tok)) {
+ if (!c->redir)
+ c->redir = newlinklist();
+ while (IS_REDIROP(tok))
+ par_redir(c->redir);
+ }
incmdpos = 1;
incasepat = 0;
incond = 0;
@@ -460,6 +471,8 @@ par_for(Cmd c)
f->inflag = 1;
incmdpos = 0;
yylex();
+ if (!c->args)
+ c->args = newlinklist();
c->args = par_wordlist();
if (tok != SEPER)
YYERRORV;
@@ -467,6 +480,8 @@ par_for(Cmd c)
f->inflag = 1;
incmdpos = 0;
yylex();
+ if (!c->args)
+ c->args = newlinklist();
c->args = par_nl_wordlist();
if (tok != OUTPAR)
YYERRORV;
@@ -819,6 +834,8 @@ par_repeat(Cmd c)
yylex();
if (tok != STRING)
YYERRORV;
+ if (!c->args)
+ c->args = newlinklist();
addlinknode(c->args, tokstr);
incmdpos = 1;
yylex();
@@ -966,6 +983,8 @@ par_simple(Cmd c)
v->str = p + 1;
} else
equalsplit(tokstr, &v->str);
+ if (!c->vars)
+ c->vars = newlinklist();
addlinknode(c->vars, v);
isnull = 0;
} else if (tok == ENVARRAY) {
@@ -982,6 +1001,8 @@ par_simple(Cmd c)
if (tok != OUTPAR)
YYERROR;
incmdpos = oldcmdpos;
+ if (!c->vars)
+ c->vars = newlinklist();
addlinknode(c->vars, v);
isnull = 0;
} else
@@ -993,9 +1014,13 @@ par_simple(Cmd c)
for (;;) {
if (tok == STRING) {
incmdpos = 0;
+ if (!c->args)
+ c->args = newlinklist();
addlinknode(c->args, tokstr);
yylex();
} else if (IS_REDIROP(tok)) {
+ if (!c->redir)
+ c->redir = newlinklist();
par_redir(c->redir);
} else if (tok == INOUTPAR) {
incmdpos = 1;
@@ -1011,15 +1036,26 @@ par_simple(Cmd c)
YYERROR;
}
yylex();
- } else
- c->u.list = (List) expandstruct((struct node *) par_cmd(), N_LIST);
+ } else {
+ List l;
+ Sublist sl;
+ Pline pl;
+
+ l = (List) allocnode(N_LIST);
+ l->type = Z_SYNC;
+ l->left = sl = (Sublist) allocnode(N_SUBLIST);
+ sl->type = END;
+ sl->left = pl = (Pline) allocnode(N_PLINE);
+ pl->type = END;
+ pl->left = par_cmd();
+ }
cmdpop();
c->type = FUNCDEF;
} else
break;
isnull = 0;
}
- if (isnull && empty(c->redir))
+ if (isnull && (!c->redir || empty(c->redir)))
return NULL;
incmdpos = 1;
return c;