xref: /csrg-svn/usr.bin/pascal/pdx/main/main.c (revision 6875)
15489Slinton /* Copyright (c) 1982 Regents of the University of California */
25489Slinton 
3*6875Slinton static char sccsid[] = "@(#)main.c 1.4 05/19/82";
45489Slinton 
55489Slinton /*
65489Slinton  * Debugger main routine.
75489Slinton  */
85489Slinton 
95489Slinton #include "defs.h"
105489Slinton #include <setjmp.h>
115489Slinton #include <signal.h>
125489Slinton #include "main.h"
135489Slinton #include "command.h"
145489Slinton #include "process.h"
155489Slinton #include "object.h"
165489Slinton 
17*6875Slinton #define FIRST_TIME 0        /* initial value setjmp returns */
185489Slinton 
195648Slinton LOCAL int firstarg;
205489Slinton LOCAL jmp_buf env;
215489Slinton LOCAL catchintr();
225489Slinton 
235489Slinton main(argc, argv)
245489Slinton int argc;
255489Slinton char **argv;
265489Slinton {
27*6875Slinton     FILE *fp;
28*6875Slinton     int i;
295489Slinton 
30*6875Slinton     catcherrs();
31*6875Slinton     catchsigs();
32*6875Slinton     scanargs(argc, argv);
33*6875Slinton     cmdname = argv[0];
34*6875Slinton     if ((fp = fopen(objname, "r")) == NIL) {
35*6875Slinton 	panic("can't read %s", objname);
36*6875Slinton     } else {
37*6875Slinton 	fclose(fp);
38*6875Slinton     }
39*6875Slinton     if (option('r')) {
40*6875Slinton 	if (setjmp(env) == FIRST_TIME) {
41*6875Slinton 	    arginit();
42*6875Slinton 	    for (i = firstarg; i < argc; i++) {
43*6875Slinton 		newarg(argv[i]);
44*6875Slinton 	    }
45*6875Slinton 	    run();
46*6875Slinton 	    /* NOTREACHED */
475489Slinton 	} else {
48*6875Slinton 	    option('r') = FALSE;
495489Slinton 	}
50*6875Slinton     } else {
51*6875Slinton 	initstart();
52*6875Slinton 	prompt();
53*6875Slinton 	init();
54*6875Slinton     }
55*6875Slinton     setjmp(env);
56*6875Slinton     signal(SIGINT, catchintr);
57*6875Slinton     yyparse();
58*6875Slinton     putchar('\n');
59*6875Slinton     quit(0);
605489Slinton }
615489Slinton 
625489Slinton /*
635489Slinton  * Initialize the world, including setting initial input file
645489Slinton  * if the file exists.
655489Slinton  */
665489Slinton 
675489Slinton init()
685489Slinton {
69*6875Slinton     initinput();
70*6875Slinton     readobj(objname);
71*6875Slinton     lexinit();
725489Slinton }
735489Slinton 
745489Slinton /*
755489Slinton  * After a non-fatal error we jump back to command parsing.
765489Slinton  */
775489Slinton 
785489Slinton erecover()
795489Slinton {
80*6875Slinton     gobble();
81*6875Slinton     prompt();
82*6875Slinton     longjmp(env, 1);
835489Slinton }
845489Slinton 
855489Slinton /*
865489Slinton  * This routine is called when an interrupt occurs.
875489Slinton  */
885489Slinton 
895489Slinton LOCAL catchintr()
905489Slinton {
91*6875Slinton     putchar('\n');
92*6875Slinton     prompt();
93*6875Slinton     longjmp(env, 1);
945489Slinton }
955489Slinton 
965489Slinton /*
975489Slinton  * scan the argument list
985489Slinton  */
995489Slinton 
1005489Slinton LOCAL scanargs(argc, argv)
1015489Slinton int argc;
1025489Slinton char **argv;
1035489Slinton {
104*6875Slinton     register int i, j;
105*6875Slinton     BOOLEAN done;
1065489Slinton 
107*6875Slinton     if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) {
108*6875Slinton 	objname = argv[1];
109*6875Slinton 	option('r') = TRUE;
110*6875Slinton 	option('t') = TRUE;
111*6875Slinton 	if (streq(argv[0], "pxhdr")) {
112*6875Slinton 	    setargs("pdx", argv[2]);
113*6875Slinton 	    firstarg = 3;
1145648Slinton 	} else {
115*6875Slinton 	    setargs("pix", NIL);
116*6875Slinton 	    firstarg = 2;
117*6875Slinton 	}
118*6875Slinton 	argv[0] = "pdx";
119*6875Slinton     } else {
120*6875Slinton 	done = FALSE;
121*6875Slinton 	i = 1;
122*6875Slinton 	while (i < argc && !done) {
123*6875Slinton 	    if (argv[i][0] == '-') {
124*6875Slinton 		for (j = 1; argv[i][j] != '\0'; j++) {
125*6875Slinton 		    switch (argv[i][j]) {
126*6875Slinton 			case 'r':   /* run program before accepting commands */
127*6875Slinton 			case 'i':   /* assume input is a terminal */
128*6875Slinton 			case 'b':   /* (internal) trace breakpoints */
129*6875Slinton 			case 'e':   /* (internal) trace execution */
130*6875Slinton 			case 'h':   /* (internal) display header information */
131*6875Slinton 			    option(argv[i][j]) = TRUE;
132*6875Slinton 			    break;
1335648Slinton 
134*6875Slinton 		    default:
135*6875Slinton 			panic("bad option \"%c\"", argv[i]);
136*6875Slinton 		    }
1375648Slinton 		}
138*6875Slinton 	    } else {
139*6875Slinton 		objname = argv[i];
140*6875Slinton 		done = TRUE;
141*6875Slinton 	    }
142*6875Slinton 	    i++;
1435489Slinton 	}
144*6875Slinton 	firstarg = i;
145*6875Slinton 	setargs("pdx", objname);
146*6875Slinton     }
1475489Slinton }
1485489Slinton 
1495489Slinton /*
1505648Slinton  * Terminate program.  In the case of the -t option, we must remove
1515648Slinton  * the object file because it's a tmp file.
1525489Slinton  */
1535489Slinton 
1545648Slinton quit(r)
1555648Slinton int r;
1565489Slinton {
157*6875Slinton     if (option('t')) {
158*6875Slinton 	unlink(objname);
159*6875Slinton     }
160*6875Slinton     exit(r);
1615489Slinton }
1625648Slinton 
1635648Slinton LOCAL catchsigs()
1645648Slinton {
165*6875Slinton     signal(SIGHUP, quit);
166*6875Slinton     signal(SIGQUIT, quit);
1675648Slinton }
168