BSD 4_3_Net_2 release
[unix-history] / usr / src / usr.bin / pascal / pdx / process / start.c
index 6a298ee..6efc620 100644 (file)
@@ -1,13 +1,46 @@
-/* Copyright (c) 1982 Regents of the University of California */
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
 
-static char sccsid[] = "@(#)start.c 1.1 %G%";
+#ifndef lint
+static char sccsid[] = "@(#)start.c    5.4 (Berkeley) 4/16/91";
+#endif /* not lint */
 
 /*
  * Begin execution.
  *
  * For px, pstart does a traced exec to read in px and then stop.  But we
  * want control after px has read in the obj file and before it starts
 
 /*
  * Begin execution.
  *
  * For px, pstart does a traced exec to read in px and then stop.  But we
  * want control after px has read in the obj file and before it starts
- * executing.  The "-d" option to px tells it to give us control
+ * executing.  The zeroth argument to px tells it to give us control
  * by sending itself a signal just prior to interpreting.
  *
  * We set a "END_BP" breakpoint at the end of the code so that the
  * by sending itself a signal just prior to interpreting.
  *
  * We set a "END_BP" breakpoint at the end of the code so that the
@@ -18,6 +51,7 @@ static char sccsid[] = "@(#)start.c 1.1 %G%";
 #include <signal.h>
 #include "process.h"
 #include "machine.h"
 #include <signal.h>
 #include "process.h"
 #include "machine.h"
+#include "main.h"
 #include "breakpoint.h"
 #include "source.h"
 #include "object.h"
 #include "breakpoint.h"
 #include "source.h"
 #include "object.h"
@@ -25,59 +59,65 @@ static char sccsid[] = "@(#)start.c 1.1 %G%";
 #include "sym.h"
 #include "process.rep"
 
 #include "sym.h"
 #include "process.rep"
 
-#      if (isvaxpx)
-#              include "pxinfo.h"
-#      endif
-
-LOCAL PROCESS pbuf;
+#include "pxinfo.h"
 
 start(argv, infile, outfile)
 char **argv;
 char *infile, *outfile;
 {
 
 start(argv, infile, outfile)
 char **argv;
 char *infile, *outfile;
 {
-       char *pargv[4];
-#      if (isvaxpx)
-               TRAPARGS *ap, t;
-#      endif
+    char *cmd;
 
 
-       process = &pbuf;
-       setsigtrace();
-       if (argv == NIL) {
-               argv = pargv;
-#              if (isvaxpx)
-                       pargv[0] = "px";
-                       pargv[1] = "-d";
-                       pargv[2] = objname;
-                       pargv[3] = NIL;
-#              else
-                       pargv[0] = objname;
-                       pargv[1] = NIL;
-#              endif
+    setsigtrace();
+    cmd = "px";
+    pstart(process, cmd, argv, infile, outfile);
+    if (process->status == STOPPED) {
+       TRAPARGS *ap, t;
+
+       pcont(process);
+       if (process->status != STOPPED) {
+           if (option('t')) {
+               quit(process->exitval);
+           } else {
+               panic("px exited with %d", process->exitval);
+           }
        }
        }
-       pstart(process, argv, infile, outfile);
-       if (process->status == STOPPED) {
-#              if (isvaxpx)
-                       pcont(process);
-                       if (process->status != STOPPED) {
-                               panic("px exited with %d", process->exitval);
-                       }
-                       dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
-                       dread(&t, ap, sizeof(TRAPARGS));
-                       if (t.nargs != 5) {
-                               panic("start: args out of sync");
-                       }
-                       DISPLAY = t.disp;
-                       DP = t.dp;
-                       ENDOFF = t.objstart;
-                       PCADDRP = t.pcaddrp;
-                       LOOPADDR = t.loopaddr;
-#              endif
-               pc = 0;
-               curfunc = program;
-               if (objsize != 0) {
-                       addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
-               }
+#ifdef tahoe
+       dread(&ap, process->fp, sizeof(ap));
+       ap = (TRAPARGS *)((unsigned)ap - 4);
+       dread(&RETLOC, process->fp - 8, sizeof(RETLOC));
+#else
+       dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
+#endif
+       dread(&t, ap, sizeof(TRAPARGS));
+
+#define NARGS 5
+#ifdef tahoe
+#      define STKNARGS (sizeof(int)*(NARGS+1))
+#      define NARGLOC  t.trp_removed
+#else
+#      define STKNARGS (NARGS)
+#      define NARGLOC  t.nargs
+#endif
+       if (NARGLOC != STKNARGS) {
+           if (option('t')) {
+               unsetsigtraces(process);
+               pcont(process);
+               quit(process->exitval);
+           } else {
+               panic("start: args out of sync");
+           }
        }
        }
+       DISPLAY = t.disp;
+       DP = t.dp;
+       ENDOFF = t.objstart;
+       PCADDR = t.pcaddr;
+       LOOPADDR = t.loopaddr;
+       pc = 0;
+       curfunc = program;
+       if (objsize != 0) {
+           addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
+       }
+    }
 }
 
 /*
 }
 
 /*
@@ -91,18 +131,14 @@ char *infile, *outfile;
 
 endprogram()
 {
 
 endprogram()
 {
-       char *filename;
-
-       if (ss_variables) {
-               prvarnews();
-       }
-       printf("\nexecution completed\n");
-       curfunc = program;
-       if ((filename = srcfilename(pc)) != cursource) {
-               skimsource(filename);
-       }
-       curline = lastlinenum;
-       erecover();
+    if (ss_variables) {
+       prvarnews();
+    }
+    printf("\nexecution completed\n");
+    curfunc = program;
+    skimsource(srcfilename(pc));
+    curline = lastlinenum;
+    erecover();
 }
 
 /*
 }
 
 /*
@@ -111,13 +147,12 @@ endprogram()
 
 LOCAL setsigtrace()
 {
 
 LOCAL setsigtrace()
 {
-       register int i;
-       register PROCESS *p;
+    register PROCESS *p;
 
 
-       p = process;
-       for (i = 1; i < NSIG; i++) {
-               psigtrace(p, i, TRUE);
-       }
-       psigtrace(p, SIGHUP, FALSE);
-       psigtrace(p, SIGKILL, FALSE);
+    p = process;
+    psigtrace(p, SIGINT, TRUE);
+    psigtrace(p, SIGTRAP, TRUE);
+    psigtrace(p, SIGIOT, TRUE);
+    psigtrace(p, SIGILL, TRUE);
+    psigtrace(p, SIGBUS, TRUE);
 }
 }