xref: /csrg-svn/usr.bin/pascal/pdx/main/main.c (revision 5648)
15489Slinton /* Copyright (c) 1982 Regents of the University of California */
25489Slinton 
3*5648Slinton static char sccsid[] = "@(#)main.c 1.3 02/02/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 
175489Slinton #define FIRST_TIME 0		/* initial value setjmp returns */
185489Slinton 
19*5648Slinton LOCAL int firstarg;
205489Slinton LOCAL jmp_buf env;
215489Slinton LOCAL catchintr();
225489Slinton 
235489Slinton main(argc, argv)
245489Slinton int argc;
255489Slinton char **argv;
265489Slinton {
275489Slinton 	FILE *fp;
28*5648Slinton 	int i;
295489Slinton 
305489Slinton 	catcherrs();
31*5648Slinton 	catchsigs();
325489Slinton 	scanargs(argc, argv);
33*5648Slinton 	cmdname = argv[0];
345489Slinton 	if ((fp = fopen(objname, "r")) == NIL) {
355489Slinton 		panic("can't read %s", objname);
365489Slinton 	} else {
375489Slinton 		fclose(fp);
385489Slinton 	}
395489Slinton 	if (option('r')) {
405489Slinton 		if (setjmp(env) == FIRST_TIME) {
415489Slinton 			arginit();
42*5648Slinton 			for (i = firstarg; i < argc; i++) {
43*5648Slinton 				newarg(argv[i]);
44*5648Slinton 			}
455489Slinton 			run();
465489Slinton 			/* NOTREACHED */
475489Slinton 		} else {
485489Slinton 			option('r') = FALSE;
495489Slinton 		}
505489Slinton 	} else {
51*5648Slinton 		initstart();
525489Slinton 		prompt();
535489Slinton 		init();
545489Slinton 	}
555489Slinton 	setjmp(env);
56*5648Slinton 	signal(SIGINT, catchintr);
575489Slinton 	yyparse();
585489Slinton 	putchar('\n');
59*5648Slinton 	quit(0);
605489Slinton }
615489Slinton 
625489Slinton /*
635489Slinton  * Initialize the world, including setting initial input file
645489Slinton  * if the file exists.
655489Slinton  */
665489Slinton 
675489Slinton init()
685489Slinton {
695489Slinton 	initinput();
705489Slinton 	readobj(objname);
715489Slinton 	lexinit();
725489Slinton }
735489Slinton 
745489Slinton /*
755489Slinton  * After a non-fatal error we jump back to command parsing.
765489Slinton  */
775489Slinton 
785489Slinton erecover()
795489Slinton {
805489Slinton 	gobble();
815489Slinton 	prompt();
825489Slinton 	longjmp(env, 1);
835489Slinton }
845489Slinton 
855489Slinton /*
865489Slinton  * This routine is called when an interrupt occurs.
875489Slinton  */
885489Slinton 
895489Slinton LOCAL catchintr()
905489Slinton {
915489Slinton 	putchar('\n');
925489Slinton 	prompt();
935489Slinton 	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 {
1045489Slinton 	register int i, j;
105*5648Slinton 	BOOLEAN done;
1065489Slinton 
107*5648Slinton 	if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) {
108*5648Slinton 		objname = argv[1];
109*5648Slinton 		option('r') = TRUE;
110*5648Slinton 		option('t') = TRUE;
111*5648Slinton 		if (streq(argv[0], "pxhdr")) {
112*5648Slinton 			setargs("pdx", argv[2]);
113*5648Slinton 			firstarg = 3;
1145489Slinton 		} else {
115*5648Slinton 			setargs("pix", NIL);
116*5648Slinton 			firstarg = 2;
1175489Slinton 		}
118*5648Slinton 		argv[0] = "pdx";
119*5648Slinton 	} else {
120*5648Slinton 		done = FALSE;
121*5648Slinton 		i = 1;
122*5648Slinton 		while (i < argc && !done) {
123*5648Slinton 			if (argv[i][0] == '-') {
124*5648Slinton 				for (j = 1; argv[i][j] != '\0'; j++) {
125*5648Slinton 					switch (argv[i][j]) {
126*5648Slinton 						case 'r':	/* run program before accepting commands */
127*5648Slinton 						case 'b':	/* (internal) trace breakpoints */
128*5648Slinton 						case 'e':	/* (internal) trace execution */
129*5648Slinton 						case 'h':	/* (internal) display header information */
130*5648Slinton 							option(argv[i][j]) = TRUE;
131*5648Slinton 							break;
132*5648Slinton 
133*5648Slinton 					default:
134*5648Slinton 						panic("bad option \"%c\"", argv[i]);
135*5648Slinton 					}
136*5648Slinton 				}
137*5648Slinton 			} else {
138*5648Slinton 				objname = argv[i];
139*5648Slinton 				done = TRUE;
140*5648Slinton 			}
141*5648Slinton 			i++;
142*5648Slinton 		}
143*5648Slinton 		firstarg = i;
144*5648Slinton 		setargs("pdx", objname);
1455489Slinton 	}
1465489Slinton }
1475489Slinton 
1485489Slinton /*
149*5648Slinton  * Terminate program.  In the case of the -t option, we must remove
150*5648Slinton  * the object file because it's a tmp file.
1515489Slinton  */
1525489Slinton 
153*5648Slinton quit(r)
154*5648Slinton int r;
1555489Slinton {
156*5648Slinton 	if (option('t')) {
157*5648Slinton 		unlink(objname);
1585489Slinton 	}
159*5648Slinton 	exit(r);
1605489Slinton }
161*5648Slinton 
162*5648Slinton LOCAL catchsigs()
163*5648Slinton {
164*5648Slinton 	signal(SIGHUP, quit);
165*5648Slinton 	signal(SIGQUIT, quit);
166*5648Slinton }
167