summaryrefslogtreecommitdiffstats
path: root/bin/sh/eval.c
diff options
context:
space:
mode:
authorsteve <steve@FreeBSD.org>1996-12-14 06:20:03 +0000
committersteve <steve@FreeBSD.org>1996-12-14 06:20:03 +0000
commitc58aca035e2c61510b619368861598623eb95e52 (patch)
tree049d84189a59de29d49254b609a318b17ee59387 /bin/sh/eval.c
parenta958416f1b4a022c358b94db0b8e6bcc6cb54ee0 (diff)
downloadFreeBSD-src-c58aca035e2c61510b619368861598623eb95e52.zip
FreeBSD-src-c58aca035e2c61510b619368861598623eb95e52.tar.gz
Merge in NetBSD mods and -Wall cleaning.
Obtained from: NetBSD, me
Diffstat (limited to 'bin/sh/eval.c')
-rw-r--r--bin/sh/eval.c82
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;
OpenPOWER on IntegriCloud