xref: /csrg-svn/usr.bin/pascal/pdx/main/main.c (revision 30846)
122650Sdist /*
222650Sdist  * Copyright (c) 1980 Regents of the University of California.
322650Sdist  * All rights reserved.  The Berkeley software License Agreement
422650Sdist  * specifies the terms and conditions for redistribution.
522650Sdist  */
65489Slinton 
722650Sdist #ifndef lint
822650Sdist char copyright[] =
922650Sdist "@(#) Copyright (c) 1980 Regents of the University of California.\n\
1022650Sdist  All rights reserved.\n";
1122650Sdist #endif not lint
125489Slinton 
1322650Sdist #ifndef lint
14*30846Smckusick static char sccsid[] = "@(#)main.c	5.2 (Berkeley) 04/07/87";
1522650Sdist #endif not lint
1622650Sdist 
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 
42*30846Smckusick #ifdef lint
43*30846Smckusick     syserr();
44*30846Smckusick #endif
456875Slinton     catchsigs();
466875Slinton     scanargs(argc, argv);
476875Slinton     cmdname = argv[0];
486875Slinton     if ((fp = fopen(objname, "r")) == NIL) {
496875Slinton 	panic("can't read %s", objname);
506875Slinton     } else {
516875Slinton 	fclose(fp);
526875Slinton     }
536875Slinton     if (option('r')) {
546875Slinton 	if (setjmp(env) == FIRST_TIME) {
556875Slinton 	    arginit();
566875Slinton 	    for (i = firstarg; i < argc; i++) {
576875Slinton 		newarg(argv[i]);
586875Slinton 	    }
596875Slinton 	    run();
606875Slinton 	    /* NOTREACHED */
615489Slinton 	} else {
626875Slinton 	    option('r') = FALSE;
635489Slinton 	}
646875Slinton     } else {
656875Slinton 	initstart();
666875Slinton 	prompt();
676875Slinton 	init();
686875Slinton     }
696875Slinton     setjmp(env);
706875Slinton     signal(SIGINT, catchintr);
716875Slinton     yyparse();
726875Slinton     putchar('\n');
736875Slinton     quit(0);
745489Slinton }
755489Slinton 
765489Slinton /*
775489Slinton  * Initialize the world, including setting initial input file
785489Slinton  * if the file exists.
795489Slinton  */
805489Slinton 
815489Slinton init()
825489Slinton {
836875Slinton     initinput();
846875Slinton     readobj(objname);
856875Slinton     lexinit();
865489Slinton }
875489Slinton 
885489Slinton /*
895489Slinton  * After a non-fatal error we jump back to command parsing.
905489Slinton  */
915489Slinton 
925489Slinton erecover()
935489Slinton {
946875Slinton     gobble();
956875Slinton     prompt();
966875Slinton     longjmp(env, 1);
975489Slinton }
985489Slinton 
995489Slinton /*
1005489Slinton  * This routine is called when an interrupt occurs.
1015489Slinton  */
1025489Slinton 
1035489Slinton LOCAL catchintr()
1045489Slinton {
1056875Slinton     putchar('\n');
1066875Slinton     prompt();
1076875Slinton     longjmp(env, 1);
1085489Slinton }
1095489Slinton 
1105489Slinton /*
1115489Slinton  * scan the argument list
1125489Slinton  */
1135489Slinton 
1145489Slinton LOCAL scanargs(argc, argv)
1155489Slinton int argc;
1165489Slinton char **argv;
1175489Slinton {
1186875Slinton     register int i, j;
1196875Slinton     BOOLEAN done;
1205489Slinton 
1216875Slinton     if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) {
1226875Slinton 	objname = argv[1];
1236875Slinton 	option('r') = TRUE;
1246875Slinton 	option('t') = TRUE;
1256875Slinton 	if (streq(argv[0], "pxhdr")) {
1266875Slinton 	    setargs("pdx", argv[2]);
1276875Slinton 	    firstarg = 3;
1285648Slinton 	} else {
1296875Slinton 	    setargs("pix", NIL);
1306875Slinton 	    firstarg = 2;
1316875Slinton 	}
1326875Slinton 	argv[0] = "pdx";
1336875Slinton     } else {
1346875Slinton 	done = FALSE;
1356875Slinton 	i = 1;
1366875Slinton 	while (i < argc && !done) {
1376875Slinton 	    if (argv[i][0] == '-') {
1386875Slinton 		for (j = 1; argv[i][j] != '\0'; j++) {
1396875Slinton 		    switch (argv[i][j]) {
1406875Slinton 			case 'r':   /* run program before accepting commands */
1416875Slinton 			case 'i':   /* assume input is a terminal */
1426875Slinton 			case 'b':   /* (internal) trace breakpoints */
1436875Slinton 			case 'e':   /* (internal) trace execution */
1446875Slinton 			case 'h':   /* (internal) display header information */
1456875Slinton 			    option(argv[i][j]) = TRUE;
1466875Slinton 			    break;
1475648Slinton 
1486875Slinton 		    default:
1496875Slinton 			panic("bad option \"%c\"", argv[i]);
1506875Slinton 		    }
1515648Slinton 		}
1526875Slinton 	    } else {
1536875Slinton 		objname = argv[i];
1546875Slinton 		done = TRUE;
1556875Slinton 	    }
1566875Slinton 	    i++;
1575489Slinton 	}
1586875Slinton 	firstarg = i;
1596875Slinton 	setargs("pdx", objname);
1606875Slinton     }
1615489Slinton }
1625489Slinton 
1635489Slinton /*
1645648Slinton  * Terminate program.  In the case of the -t option, we must remove
1655648Slinton  * the object file because it's a tmp file.
1665489Slinton  */
1675489Slinton 
1685648Slinton quit(r)
1695648Slinton int r;
1705489Slinton {
1716875Slinton     if (option('t')) {
1726875Slinton 	unlink(objname);
1736875Slinton     }
1746875Slinton     exit(r);
1755489Slinton }
1765648Slinton 
1775648Slinton LOCAL catchsigs()
1785648Slinton {
1796875Slinton     signal(SIGHUP, quit);
1806875Slinton     signal(SIGQUIT, quit);
1815648Slinton }
182