summaryrefslogtreecommitdiff
path: root/src/kash/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kash/eval.c')
-rw-r--r--src/kash/eval.c37
1 files changed, 14 insertions, 23 deletions
diff --git a/src/kash/eval.c b/src/kash/eval.c
index 665e0bf..d96c2a3 100644
--- a/src/kash/eval.c
+++ b/src/kash/eval.c
@@ -676,7 +676,7 @@ evalcommand(shinstance *psh, union node *cmd, int flags, struct backcmd *backcmd
char **argv;
int argc;
char **envp;
- int varflag;
+ int numvars;
struct strlist *sp;
int mode;
int pip[2];
@@ -706,37 +706,28 @@ evalcommand(shinstance *psh, union node *cmd, int flags, struct backcmd *backcmd
psh->back_exitstatus = 0;
arglist.lastp = &arglist.list;
- varflag = 1;
/* Expand arguments, ignoring the initial 'name=value' ones */
- for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) {
- char *p = argp->narg.text;
- if (varflag && is_name(*p)) {
- do {
- p++;
- } while (is_in_name(*p));
- if (*p == '=')
- continue;
- }
- expandarg(psh, argp, &arglist, EXP_FULL | EXP_TILDE);
- varflag = 0;
+ for (argp = cmd->ncmd.args, numvars = 0 ; argp ; argp = argp->narg.next, numvars++) {
+ char *p = argp->narg.text;
+ char ch = *p;
+ if (is_name(ch)) {
+ do ch = *++p;
+ while (is_in_name(ch));
+ if (ch == '=')
+ continue;
+ }
+ break;
}
+ for (/*continue on argp from above. */ ; argp ; argp = argp->narg.next)
+ expandarg(psh, argp, &arglist, EXP_FULL | EXP_TILDE);
*arglist.lastp = NULL;
expredir(psh, cmd->ncmd.redirect);
/* Now do the initial 'name=value' ones we skipped above */
varlist.lastp = &varlist.list;
- for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) {
- char *p = argp->narg.text;
- if (!is_name(*p))
- break;
- do
- p++;
- while (is_in_name(*p));
- if (*p != '=')
- break;
+ for (argp = cmd->ncmd.args ; numvars > 0 && argp ; argp = argp->narg.next, numvars--)
expandarg(psh, argp, &varlist, EXP_VARTILDE);
- }
*varlist.lastp = NULL;
argc = 0;