xref: /csrg-svn/usr.bin/pascal/pdx/main/main.c (revision 5489)
1*5489Slinton /* Copyright (c) 1982 Regents of the University of California */
2*5489Slinton 
3*5489Slinton static char sccsid[] = "@(#)main.c 1.1 01/18/82";
4*5489Slinton 
5*5489Slinton /*
6*5489Slinton  * Debugger main routine.
7*5489Slinton  */
8*5489Slinton 
9*5489Slinton #include "defs.h"
10*5489Slinton #include <setjmp.h>
11*5489Slinton #include <signal.h>
12*5489Slinton #include "main.h"
13*5489Slinton #include "command.h"
14*5489Slinton #include "process.h"
15*5489Slinton #include "object.h"
16*5489Slinton 
17*5489Slinton #define FIRST_TIME 0		/* initial value setjmp returns */
18*5489Slinton #define isinteractive()		(isatty(fileno(stdin)))
19*5489Slinton 
20*5489Slinton LOCAL jmp_buf env;
21*5489Slinton LOCAL catchintr();
22*5489Slinton 
23*5489Slinton main(argc, argv)
24*5489Slinton int argc;
25*5489Slinton char **argv;
26*5489Slinton {
27*5489Slinton 	FILE *fp;
28*5489Slinton 
29*5489Slinton 	cmdname = argv[0];
30*5489Slinton 	catcherrs();
31*5489Slinton 	scanargs(argc, argv);
32*5489Slinton 	if ((fp = fopen(objname, "r")) == NIL) {
33*5489Slinton 		panic("can't read %s", objname);
34*5489Slinton 	} else {
35*5489Slinton 		fclose(fp);
36*5489Slinton 	}
37*5489Slinton 	if (option('r')) {
38*5489Slinton 		if (setjmp(env) == FIRST_TIME) {
39*5489Slinton 			arginit();
40*5489Slinton 			run();
41*5489Slinton 			/* NOTREACHED */
42*5489Slinton 		} else {
43*5489Slinton 			option('r') = FALSE;
44*5489Slinton 			if (isinteractive()) {
45*5489Slinton 				printf("> ");
46*5489Slinton 				fflush(stdout);
47*5489Slinton 			}
48*5489Slinton 		}
49*5489Slinton 	} else {
50*5489Slinton 		start(NIL, NIL, NIL);
51*5489Slinton 		prompt();
52*5489Slinton 		init();
53*5489Slinton 	}
54*5489Slinton 	setjmp(env);
55*5489Slinton 	signal(SIGINT, &catchintr);
56*5489Slinton 	yyparse();
57*5489Slinton 	putchar('\n');
58*5489Slinton }
59*5489Slinton 
60*5489Slinton /*
61*5489Slinton  * Initialize the world, including setting initial input file
62*5489Slinton  * if the file exists.
63*5489Slinton  */
64*5489Slinton 
65*5489Slinton init()
66*5489Slinton {
67*5489Slinton 	initinput();
68*5489Slinton 	readobj(objname);
69*5489Slinton 	lexinit();
70*5489Slinton }
71*5489Slinton 
72*5489Slinton /*
73*5489Slinton  * After a non-fatal error we jump back to command parsing.
74*5489Slinton  */
75*5489Slinton 
76*5489Slinton erecover()
77*5489Slinton {
78*5489Slinton 	gobble();
79*5489Slinton 	prompt();
80*5489Slinton 	longjmp(env, 1);
81*5489Slinton }
82*5489Slinton 
83*5489Slinton /*
84*5489Slinton  * This routine is called when an interrupt occurs.
85*5489Slinton  */
86*5489Slinton 
87*5489Slinton LOCAL catchintr()
88*5489Slinton {
89*5489Slinton 	putchar('\n');
90*5489Slinton 	prompt();
91*5489Slinton 	longjmp(env, 1);
92*5489Slinton }
93*5489Slinton 
94*5489Slinton /*
95*5489Slinton  * scan the argument list
96*5489Slinton  */
97*5489Slinton 
98*5489Slinton LOCAL scanargs(argc, argv)
99*5489Slinton int argc;
100*5489Slinton char **argv;
101*5489Slinton {
102*5489Slinton 	register int i, j;
103*5489Slinton 	BOOLEAN foundfile;
104*5489Slinton 
105*5489Slinton 	foundfile = FALSE;
106*5489Slinton 	for (i = 1; i < argc; i++) {
107*5489Slinton 		if (argv[i][0] == '-') {
108*5489Slinton 			for (j = 1; argv[i][j] != '\0'; j++) {
109*5489Slinton 				setoption(argv[i][j]);
110*5489Slinton 			}
111*5489Slinton 		} else if (!foundfile) {
112*5489Slinton 			objname = argv[i];
113*5489Slinton 		} else {
114*5489Slinton 			panic("extraneous argument %s", argv[i]);
115*5489Slinton 		}
116*5489Slinton 	}
117*5489Slinton }
118*5489Slinton 
119*5489Slinton /*
120*5489Slinton  * take appropriate action for recognized command argument
121*5489Slinton  */
122*5489Slinton 
123*5489Slinton LOCAL setoption(c)
124*5489Slinton register char c;
125*5489Slinton {
126*5489Slinton 	switch(c) {
127*5489Slinton 		case 'r':	/* run program before accepting commands */
128*5489Slinton 		case 'b':	/* trace internal breakpoints (for debugging) */
129*5489Slinton 		case 'e':	/* trace execution (for debugging) */
130*5489Slinton 			option(c) = TRUE;
131*5489Slinton 			break;
132*5489Slinton 
133*5489Slinton 		default:
134*5489Slinton 			panic("unknown option '%c'", c);
135*5489Slinton 	}
136*5489Slinton }
137