diff options
author | herbert <herbert@gondor.apana.org.au> | 2005-03-28 20:28:01 +1000 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2005-09-26 18:33:05 +1000 |
commit | 71d448c29c85afd16a4feb68b23fde6c8cf02875 (patch) | |
tree | 2414dda91f580f2c124522b41c244f0eb528acfa /src/eval.c | |
parent | Removed unnecessary inclusion of eval.h from parser.c. (diff) | |
download | dash-71d448c29c85afd16a4feb68b23fde6c8cf02875.tar.gz dash-71d448c29c85afd16a4feb68b23fde6c8cf02875.zip |
Added eflag fixes for trap and minusc.
Let evaltree handle traps from cmdloop. Reset evalskip after minusc is executed. Stop executing traps once SKIPEVAL is seen.
Diffstat (limited to '')
-rw-r--r-- | src/eval.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/eval.c b/src/eval.c index 31272da..ac4425c 100644 --- a/src/eval.c +++ b/src/eval.c @@ -163,7 +163,8 @@ evalcmd(int argc, char **argv) STPUTC('\0', concat); p = grabstackstr(concat); } - evalstring(p); + evalstring(p, ~SKIPEVAL); + } return exitstatus; } @@ -173,23 +174,29 @@ evalcmd(int argc, char **argv) * Execute a command or commands contained in a string. */ -void -evalstring(char *s) +int +evalstring(char *s, int mask) { union node *n; struct stackmark smark; + int skip; - setstackmark(&smark); setinputstring(s); + setstackmark(&smark); + skip = 0; while ((n = parsecmd(0)) != NEOF) { evaltree(n, 0); popstackmark(&smark); - if (evalskip) + skip = evalskip; + if (skip) break; } popfile(); - popstackmark(&smark); + + skip &= mask; + evalskip = skip; + return skip; } @@ -319,12 +326,15 @@ setstatus: break; } out: - if (pendingsigs) - dotrap(); - if (flags & EV_EXIT) - exraise(EXEXIT); if ((checkexit & exitstatus)) evalskip |= SKIPEVAL; + else if (pendingsigs && dotrap()) + goto exexit; + + if (flags & EV_EXIT) { +exexit: + exraise(EXEXIT); + } } @@ -930,7 +940,6 @@ cmddone: commandname = savecmdname; exsig = 0; handler = savehandler; - evalskip &= ~SKIPEVAL; return i; } |