15489Slinton /* Copyright (c) 1982 Regents of the University of California */ 25489Slinton 3*6875Slinton static char sccsid[] = "@(#)main.c 1.4 05/19/82"; 45489Slinton 55489Slinton /* 65489Slinton * Debugger main routine. 75489Slinton */ 85489Slinton 95489Slinton #include "defs.h" 105489Slinton #include <setjmp.h> 115489Slinton #include <signal.h> 125489Slinton #include "main.h" 135489Slinton #include "command.h" 145489Slinton #include "process.h" 155489Slinton #include "object.h" 165489Slinton 17*6875Slinton #define FIRST_TIME 0 /* initial value setjmp returns */ 185489Slinton 195648Slinton LOCAL int firstarg; 205489Slinton LOCAL jmp_buf env; 215489Slinton LOCAL catchintr(); 225489Slinton 235489Slinton main(argc, argv) 245489Slinton int argc; 255489Slinton char **argv; 265489Slinton { 27*6875Slinton FILE *fp; 28*6875Slinton int i; 295489Slinton 30*6875Slinton catcherrs(); 31*6875Slinton catchsigs(); 32*6875Slinton scanargs(argc, argv); 33*6875Slinton cmdname = argv[0]; 34*6875Slinton if ((fp = fopen(objname, "r")) == NIL) { 35*6875Slinton panic("can't read %s", objname); 36*6875Slinton } else { 37*6875Slinton fclose(fp); 38*6875Slinton } 39*6875Slinton if (option('r')) { 40*6875Slinton if (setjmp(env) == FIRST_TIME) { 41*6875Slinton arginit(); 42*6875Slinton for (i = firstarg; i < argc; i++) { 43*6875Slinton newarg(argv[i]); 44*6875Slinton } 45*6875Slinton run(); 46*6875Slinton /* NOTREACHED */ 475489Slinton } else { 48*6875Slinton option('r') = FALSE; 495489Slinton } 50*6875Slinton } else { 51*6875Slinton initstart(); 52*6875Slinton prompt(); 53*6875Slinton init(); 54*6875Slinton } 55*6875Slinton setjmp(env); 56*6875Slinton signal(SIGINT, catchintr); 57*6875Slinton yyparse(); 58*6875Slinton putchar('\n'); 59*6875Slinton quit(0); 605489Slinton } 615489Slinton 625489Slinton /* 635489Slinton * Initialize the world, including setting initial input file 645489Slinton * if the file exists. 655489Slinton */ 665489Slinton 675489Slinton init() 685489Slinton { 69*6875Slinton initinput(); 70*6875Slinton readobj(objname); 71*6875Slinton lexinit(); 725489Slinton } 735489Slinton 745489Slinton /* 755489Slinton * After a non-fatal error we jump back to command parsing. 765489Slinton */ 775489Slinton 785489Slinton erecover() 795489Slinton { 80*6875Slinton gobble(); 81*6875Slinton prompt(); 82*6875Slinton longjmp(env, 1); 835489Slinton } 845489Slinton 855489Slinton /* 865489Slinton * This routine is called when an interrupt occurs. 875489Slinton */ 885489Slinton 895489Slinton LOCAL catchintr() 905489Slinton { 91*6875Slinton putchar('\n'); 92*6875Slinton prompt(); 93*6875Slinton longjmp(env, 1); 945489Slinton } 955489Slinton 965489Slinton /* 975489Slinton * scan the argument list 985489Slinton */ 995489Slinton 1005489Slinton LOCAL scanargs(argc, argv) 1015489Slinton int argc; 1025489Slinton char **argv; 1035489Slinton { 104*6875Slinton register int i, j; 105*6875Slinton BOOLEAN done; 1065489Slinton 107*6875Slinton if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) { 108*6875Slinton objname = argv[1]; 109*6875Slinton option('r') = TRUE; 110*6875Slinton option('t') = TRUE; 111*6875Slinton if (streq(argv[0], "pxhdr")) { 112*6875Slinton setargs("pdx", argv[2]); 113*6875Slinton firstarg = 3; 1145648Slinton } else { 115*6875Slinton setargs("pix", NIL); 116*6875Slinton firstarg = 2; 117*6875Slinton } 118*6875Slinton argv[0] = "pdx"; 119*6875Slinton } else { 120*6875Slinton done = FALSE; 121*6875Slinton i = 1; 122*6875Slinton while (i < argc && !done) { 123*6875Slinton if (argv[i][0] == '-') { 124*6875Slinton for (j = 1; argv[i][j] != '\0'; j++) { 125*6875Slinton switch (argv[i][j]) { 126*6875Slinton case 'r': /* run program before accepting commands */ 127*6875Slinton case 'i': /* assume input is a terminal */ 128*6875Slinton case 'b': /* (internal) trace breakpoints */ 129*6875Slinton case 'e': /* (internal) trace execution */ 130*6875Slinton case 'h': /* (internal) display header information */ 131*6875Slinton option(argv[i][j]) = TRUE; 132*6875Slinton break; 1335648Slinton 134*6875Slinton default: 135*6875Slinton panic("bad option \"%c\"", argv[i]); 136*6875Slinton } 1375648Slinton } 138*6875Slinton } else { 139*6875Slinton objname = argv[i]; 140*6875Slinton done = TRUE; 141*6875Slinton } 142*6875Slinton i++; 1435489Slinton } 144*6875Slinton firstarg = i; 145*6875Slinton setargs("pdx", objname); 146*6875Slinton } 1475489Slinton } 1485489Slinton 1495489Slinton /* 1505648Slinton * Terminate program. In the case of the -t option, we must remove 1515648Slinton * the object file because it's a tmp file. 1525489Slinton */ 1535489Slinton 1545648Slinton quit(r) 1555648Slinton int r; 1565489Slinton { 157*6875Slinton if (option('t')) { 158*6875Slinton unlink(objname); 159*6875Slinton } 160*6875Slinton exit(r); 1615489Slinton } 1625648Slinton 1635648Slinton LOCAL catchsigs() 1645648Slinton { 165*6875Slinton signal(SIGHUP, quit); 166*6875Slinton signal(SIGQUIT, quit); 1675648Slinton } 168