1*5489Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*5489Slinton 3*5489Slinton static char sccsid[] = "@(#)main.c 1.1 01/18/82"; 4*5489Slinton 5*5489Slinton /* 6*5489Slinton * Debugger main routine. 7*5489Slinton */ 8*5489Slinton 9*5489Slinton #include "defs.h" 10*5489Slinton #include <setjmp.h> 11*5489Slinton #include <signal.h> 12*5489Slinton #include "main.h" 13*5489Slinton #include "command.h" 14*5489Slinton #include "process.h" 15*5489Slinton #include "object.h" 16*5489Slinton 17*5489Slinton #define FIRST_TIME 0 /* initial value setjmp returns */ 18*5489Slinton #define isinteractive() (isatty(fileno(stdin))) 19*5489Slinton 20*5489Slinton LOCAL jmp_buf env; 21*5489Slinton LOCAL catchintr(); 22*5489Slinton 23*5489Slinton main(argc, argv) 24*5489Slinton int argc; 25*5489Slinton char **argv; 26*5489Slinton { 27*5489Slinton FILE *fp; 28*5489Slinton 29*5489Slinton cmdname = argv[0]; 30*5489Slinton catcherrs(); 31*5489Slinton scanargs(argc, argv); 32*5489Slinton if ((fp = fopen(objname, "r")) == NIL) { 33*5489Slinton panic("can't read %s", objname); 34*5489Slinton } else { 35*5489Slinton fclose(fp); 36*5489Slinton } 37*5489Slinton if (option('r')) { 38*5489Slinton if (setjmp(env) == FIRST_TIME) { 39*5489Slinton arginit(); 40*5489Slinton run(); 41*5489Slinton /* NOTREACHED */ 42*5489Slinton } else { 43*5489Slinton option('r') = FALSE; 44*5489Slinton if (isinteractive()) { 45*5489Slinton printf("> "); 46*5489Slinton fflush(stdout); 47*5489Slinton } 48*5489Slinton } 49*5489Slinton } else { 50*5489Slinton start(NIL, NIL, NIL); 51*5489Slinton prompt(); 52*5489Slinton init(); 53*5489Slinton } 54*5489Slinton setjmp(env); 55*5489Slinton signal(SIGINT, &catchintr); 56*5489Slinton yyparse(); 57*5489Slinton putchar('\n'); 58*5489Slinton } 59*5489Slinton 60*5489Slinton /* 61*5489Slinton * Initialize the world, including setting initial input file 62*5489Slinton * if the file exists. 63*5489Slinton */ 64*5489Slinton 65*5489Slinton init() 66*5489Slinton { 67*5489Slinton initinput(); 68*5489Slinton readobj(objname); 69*5489Slinton lexinit(); 70*5489Slinton } 71*5489Slinton 72*5489Slinton /* 73*5489Slinton * After a non-fatal error we jump back to command parsing. 74*5489Slinton */ 75*5489Slinton 76*5489Slinton erecover() 77*5489Slinton { 78*5489Slinton gobble(); 79*5489Slinton prompt(); 80*5489Slinton longjmp(env, 1); 81*5489Slinton } 82*5489Slinton 83*5489Slinton /* 84*5489Slinton * This routine is called when an interrupt occurs. 85*5489Slinton */ 86*5489Slinton 87*5489Slinton LOCAL catchintr() 88*5489Slinton { 89*5489Slinton putchar('\n'); 90*5489Slinton prompt(); 91*5489Slinton longjmp(env, 1); 92*5489Slinton } 93*5489Slinton 94*5489Slinton /* 95*5489Slinton * scan the argument list 96*5489Slinton */ 97*5489Slinton 98*5489Slinton LOCAL scanargs(argc, argv) 99*5489Slinton int argc; 100*5489Slinton char **argv; 101*5489Slinton { 102*5489Slinton register int i, j; 103*5489Slinton BOOLEAN foundfile; 104*5489Slinton 105*5489Slinton foundfile = FALSE; 106*5489Slinton for (i = 1; i < argc; i++) { 107*5489Slinton if (argv[i][0] == '-') { 108*5489Slinton for (j = 1; argv[i][j] != '\0'; j++) { 109*5489Slinton setoption(argv[i][j]); 110*5489Slinton } 111*5489Slinton } else if (!foundfile) { 112*5489Slinton objname = argv[i]; 113*5489Slinton } else { 114*5489Slinton panic("extraneous argument %s", argv[i]); 115*5489Slinton } 116*5489Slinton } 117*5489Slinton } 118*5489Slinton 119*5489Slinton /* 120*5489Slinton * take appropriate action for recognized command argument 121*5489Slinton */ 122*5489Slinton 123*5489Slinton LOCAL setoption(c) 124*5489Slinton register char c; 125*5489Slinton { 126*5489Slinton switch(c) { 127*5489Slinton case 'r': /* run program before accepting commands */ 128*5489Slinton case 'b': /* trace internal breakpoints (for debugging) */ 129*5489Slinton case 'e': /* trace execution (for debugging) */ 130*5489Slinton option(c) = TRUE; 131*5489Slinton break; 132*5489Slinton 133*5489Slinton default: 134*5489Slinton panic("unknown option '%c'", c); 135*5489Slinton } 136*5489Slinton } 137