diff options
Diffstat (limited to 'bin/sh/eval.c')
-rw-r--r-- | bin/sh/eval.c | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c index a74b6ca..1539ec0 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -33,11 +33,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: eval.c,v 1.7 1996/10/22 03:02:07 steve Exp $ + * $Id: eval.c,v 1.8 1996/11/12 18:35:06 peter Exp $ */ #ifndef lint -static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; +static char const sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; #endif /* not lint */ #include <signal.h> @@ -76,12 +76,6 @@ static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; #define EV_TESTED 02 /* exit status is checked; ignore -e flag */ #define EV_BACKCMD 04 /* command executing within back quotes */ - -/* reasons for skipping commands (see comment on breakcmd routine) */ -#define SKIPBREAK 1 -#define SKIPCONT 2 -#define SKIPFUNC 3 - MKINIT int evalskip; /* set if we are skipping commands */ STATIC int skipcount; /* number of levels to skip */ MKINIT int loopnest; /* current loop nesting level */ @@ -129,9 +123,9 @@ SHELLPROC { */ int -evalcmd(argc, argv) +evalcmd(argc, argv) int argc; - char **argv; + char **argv; { char *p; char *concat; @@ -234,17 +228,15 @@ evaltree(n, flags) evalsubshell(n, flags); break; case NIF: { - int status; - evaltree(n->nif.test, EV_TESTED); - status = exitstatus; - exitstatus = 0; if (evalskip) goto out; - if (status == 0) + if (exitstatus == 0) evaltree(n->nif.ifpart, flags); else if (n->nif.elsepart) evaltree(n->nif.elsepart, flags); + else + exitstatus = 0; break; } case NWHILE: @@ -688,7 +680,7 @@ evalcommand(cmd, flags, backcmd) find_command(argv[0], &cmdentry, 1, path); if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ - exitstatus = 1; + exitstatus = 127; flushout(&errout); return; } @@ -700,7 +692,7 @@ evalcommand(cmd, flags, backcmd) break; if ((cmdentry.u.index = find_builtin(*argv)) < 0) { outfmt(&errout, "%s: not found\n", *argv); - exitstatus = 1; + exitstatus = 127; flushout(&errout); return; } @@ -741,10 +733,13 @@ evalcommand(cmd, flags, backcmd) /* This is the child process if a fork occurred. */ /* Execute the command. */ if (cmdentry.cmdtype == CMDFUNCTION) { +#ifdef DEBUG trputs("Shell function: "); trargs(argv); +#endif redirect(cmd->ncmd.redirect, REDIR_PUSH); saveparam = shellparam; shellparam.malloc = 0; + shellparam.reset = 1; shellparam.nparam = argc - 1; shellparam.p = argv + 1; shellparam.optnext = NULL; @@ -786,7 +781,9 @@ evalcommand(cmd, flags, backcmd) if (flags & EV_EXIT) exitshell(exitstatus); } else if (cmdentry.cmdtype == CMDBUILTIN) { +#ifdef DEBUG trputs("builtin command: "); trargs(argv); +#endif mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH; if (flags == EV_BACKCMD) { memout.nleft = 0; @@ -822,13 +819,14 @@ cmddone: } handler = savehandler; if (e != -1) { - if (e != EXERROR || cmdentry.u.index == BLTINCMD - || cmdentry.u.index == DOTCMD - || cmdentry.u.index == EVALCMD + if ((e != EXERROR && e != EXEXEC) + || cmdentry.u.index == BLTINCMD + || cmdentry.u.index == DOTCMD + || cmdentry.u.index == EVALCMD #ifndef NO_HISTORY - || cmdentry.u.index == HISTCMD + || cmdentry.u.index == HISTCMD #endif - || cmdentry.u.index == EXECCMD) + || cmdentry.u.index == EXECCMD) exraise(e); FORCEINTON; } @@ -840,7 +838,9 @@ cmddone: memout.buf = NULL; } } else { +#ifdef DEBUG trputs("normal command: "); trargs(argv); +#endif clearredir(); redirect(cmd->ncmd.redirect, 0); for (sp = varlist.list ; sp ; sp = sp->next) @@ -904,12 +904,12 @@ prehash(n) int bltincmd(argc, argv) int argc; - char **argv; + char **argv; { listsetvar(cmdenviron); - /* + /* * Preserve exitstatus of a previous possible redirection - * as POSIX mandates + * as POSIX mandates */ return exitstatus; } @@ -929,13 +929,10 @@ bltincmd(argc, argv) int breakcmd(argc, argv) int argc; - char **argv; + char **argv; { - int n; + int n = argc > 1 ? number(argv[1]) : 1; - n = 1; - if (argc > 1) - n = number(argv[1]); if (n > loopnest) n = loopnest; if (n > 0) { @@ -951,45 +948,46 @@ breakcmd(argc, argv) */ int -returncmd(argc, argv) +returncmd(argc, argv) int argc; - char **argv; + char **argv; { - int ret; + int ret = argc > 1 ? number(argv[1]) : oexitstatus; - ret = exitstatus; - if (argc > 1) - ret = number(argv[1]); if (funcnest) { evalskip = SKIPFUNC; skipcount = 1; + } else { + /* skip the rest of the file */ + evalskip = SKIPFILE; + skipcount = 1; } return ret; } int -falsecmd(argc, argv) +falsecmd(argc, argv) int argc; - char **argv; + char **argv; { return 1; } int -truecmd(argc, argv) +truecmd(argc, argv) int argc; - char **argv; + char **argv; { return 0; } int -execcmd(argc, argv) +execcmd(argc, argv) int argc; - char **argv; + char **argv; { if (argc > 1) { struct strlist *sp; |