xref: /csrg-svn/usr.bin/pascal/pdx/main/main.c (revision 22650)
1*22650Sdist /*
2*22650Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22650Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22650Sdist  * specifies the terms and conditions for redistribution.
5*22650Sdist  */
65489Slinton 
7*22650Sdist #ifndef lint
8*22650Sdist char copyright[] =
9*22650Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\
10*22650Sdist  All rights reserved.\n";
11*22650Sdist #endif not lint
125489Slinton 
13*22650Sdist #ifndef lint
14*22650Sdist static char sccsid[] = "@(#)main.c	5.1 (Berkeley) 06/07/85";
15*22650Sdist #endif not lint
16*22650Sdist 
175489Slinton /*
185489Slinton  * Debugger main routine.
195489Slinton  */
205489Slinton 
215489Slinton #include "defs.h"
225489Slinton #include <setjmp.h>
235489Slinton #include <signal.h>
245489Slinton #include "main.h"
255489Slinton #include "command.h"
265489Slinton #include "process.h"
275489Slinton #include "object.h"
285489Slinton 
296875Slinton #define FIRST_TIME 0        /* initial value setjmp returns */
305489Slinton 
315648Slinton LOCAL int firstarg;
325489Slinton LOCAL jmp_buf env;
335489Slinton LOCAL catchintr();
345489Slinton 
355489Slinton main(argc, argv)
365489Slinton int argc;
375489Slinton char **argv;
385489Slinton {
396875Slinton     FILE *fp;
406875Slinton     int i;
415489Slinton 
426875Slinton     catcherrs();
436875Slinton     catchsigs();
446875Slinton     scanargs(argc, argv);
456875Slinton     cmdname = argv[0];
466875Slinton     if ((fp = fopen(objname, "r")) == NIL) {
476875Slinton 	panic("can't read %s", objname);
486875Slinton     } else {
496875Slinton 	fclose(fp);
506875Slinton     }
516875Slinton     if (option('r')) {
526875Slinton 	if (setjmp(env) == FIRST_TIME) {
536875Slinton 	    arginit();
546875Slinton 	    for (i = firstarg; i < argc; i++) {
556875Slinton 		newarg(argv[i]);
566875Slinton 	    }
576875Slinton 	    run();
586875Slinton 	    /* NOTREACHED */
595489Slinton 	} else {
606875Slinton 	    option('r') = FALSE;
615489Slinton 	}
626875Slinton     } else {
636875Slinton 	initstart();
646875Slinton 	prompt();
656875Slinton 	init();
666875Slinton     }
676875Slinton     setjmp(env);
686875Slinton     signal(SIGINT, catchintr);
696875Slinton     yyparse();
706875Slinton     putchar('\n');
716875Slinton     quit(0);
725489Slinton }
735489Slinton 
745489Slinton /*
755489Slinton  * Initialize the world, including setting initial input file
765489Slinton  * if the file exists.
775489Slinton  */
785489Slinton 
795489Slinton init()
805489Slinton {
816875Slinton     initinput();
826875Slinton     readobj(objname);
836875Slinton     lexinit();
845489Slinton }
855489Slinton 
865489Slinton /*
875489Slinton  * After a non-fatal error we jump back to command parsing.
885489Slinton  */
895489Slinton 
905489Slinton erecover()
915489Slinton {
926875Slinton     gobble();
936875Slinton     prompt();
946875Slinton     longjmp(env, 1);
955489Slinton }
965489Slinton 
975489Slinton /*
985489Slinton  * This routine is called when an interrupt occurs.
995489Slinton  */
1005489Slinton 
1015489Slinton LOCAL catchintr()
1025489Slinton {
1036875Slinton     putchar('\n');
1046875Slinton     prompt();
1056875Slinton     longjmp(env, 1);
1065489Slinton }
1075489Slinton 
1085489Slinton /*
1095489Slinton  * scan the argument list
1105489Slinton  */
1115489Slinton 
1125489Slinton LOCAL scanargs(argc, argv)
1135489Slinton int argc;
1145489Slinton char **argv;
1155489Slinton {
1166875Slinton     register int i, j;
1176875Slinton     BOOLEAN done;
1185489Slinton 
1196875Slinton     if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) {
1206875Slinton 	objname = argv[1];
1216875Slinton 	option('r') = TRUE;
1226875Slinton 	option('t') = TRUE;
1236875Slinton 	if (streq(argv[0], "pxhdr")) {
1246875Slinton 	    setargs("pdx", argv[2]);
1256875Slinton 	    firstarg = 3;
1265648Slinton 	} else {
1276875Slinton 	    setargs("pix", NIL);
1286875Slinton 	    firstarg = 2;
1296875Slinton 	}
1306875Slinton 	argv[0] = "pdx";
1316875Slinton     } else {
1326875Slinton 	done = FALSE;
1336875Slinton 	i = 1;
1346875Slinton 	while (i < argc && !done) {
1356875Slinton 	    if (argv[i][0] == '-') {
1366875Slinton 		for (j = 1; argv[i][j] != '\0'; j++) {
1376875Slinton 		    switch (argv[i][j]) {
1386875Slinton 			case 'r':   /* run program before accepting commands */
1396875Slinton 			case 'i':   /* assume input is a terminal */
1406875Slinton 			case 'b':   /* (internal) trace breakpoints */
1416875Slinton 			case 'e':   /* (internal) trace execution */
1426875Slinton 			case 'h':   /* (internal) display header information */
1436875Slinton 			    option(argv[i][j]) = TRUE;
1446875Slinton 			    break;
1455648Slinton 
1466875Slinton 		    default:
1476875Slinton 			panic("bad option \"%c\"", argv[i]);
1486875Slinton 		    }
1495648Slinton 		}
1506875Slinton 	    } else {
1516875Slinton 		objname = argv[i];
1526875Slinton 		done = TRUE;
1536875Slinton 	    }
1546875Slinton 	    i++;
1555489Slinton 	}
1566875Slinton 	firstarg = i;
1576875Slinton 	setargs("pdx", objname);
1586875Slinton     }
1595489Slinton }
1605489Slinton 
1615489Slinton /*
1625648Slinton  * Terminate program.  In the case of the -t option, we must remove
1635648Slinton  * the object file because it's a tmp file.
1645489Slinton  */
1655489Slinton 
1665648Slinton quit(r)
1675648Slinton int r;
1685489Slinton {
1696875Slinton     if (option('t')) {
1706875Slinton 	unlink(objname);
1716875Slinton     }
1726875Slinton     exit(r);
1735489Slinton }
1745648Slinton 
1755648Slinton LOCAL catchsigs()
1765648Slinton {
1776875Slinton     signal(SIGHUP, quit);
1786875Slinton     signal(SIGQUIT, quit);
1795648Slinton }
180