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