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