15489Slinton /* Copyright (c) 1982 Regents of the University of California */ 25489Slinton 3*5648Slinton static char sccsid[] = "@(#)main.c 1.3 02/02/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 175489Slinton #define FIRST_TIME 0 /* initial value setjmp returns */ 185489Slinton 19*5648Slinton LOCAL int firstarg; 205489Slinton LOCAL jmp_buf env; 215489Slinton LOCAL catchintr(); 225489Slinton 235489Slinton main(argc, argv) 245489Slinton int argc; 255489Slinton char **argv; 265489Slinton { 275489Slinton FILE *fp; 28*5648Slinton int i; 295489Slinton 305489Slinton catcherrs(); 31*5648Slinton catchsigs(); 325489Slinton scanargs(argc, argv); 33*5648Slinton cmdname = argv[0]; 345489Slinton if ((fp = fopen(objname, "r")) == NIL) { 355489Slinton panic("can't read %s", objname); 365489Slinton } else { 375489Slinton fclose(fp); 385489Slinton } 395489Slinton if (option('r')) { 405489Slinton if (setjmp(env) == FIRST_TIME) { 415489Slinton arginit(); 42*5648Slinton for (i = firstarg; i < argc; i++) { 43*5648Slinton newarg(argv[i]); 44*5648Slinton } 455489Slinton run(); 465489Slinton /* NOTREACHED */ 475489Slinton } else { 485489Slinton option('r') = FALSE; 495489Slinton } 505489Slinton } else { 51*5648Slinton initstart(); 525489Slinton prompt(); 535489Slinton init(); 545489Slinton } 555489Slinton setjmp(env); 56*5648Slinton signal(SIGINT, catchintr); 575489Slinton yyparse(); 585489Slinton putchar('\n'); 59*5648Slinton quit(0); 605489Slinton } 615489Slinton 625489Slinton /* 635489Slinton * Initialize the world, including setting initial input file 645489Slinton * if the file exists. 655489Slinton */ 665489Slinton 675489Slinton init() 685489Slinton { 695489Slinton initinput(); 705489Slinton readobj(objname); 715489Slinton lexinit(); 725489Slinton } 735489Slinton 745489Slinton /* 755489Slinton * After a non-fatal error we jump back to command parsing. 765489Slinton */ 775489Slinton 785489Slinton erecover() 795489Slinton { 805489Slinton gobble(); 815489Slinton prompt(); 825489Slinton longjmp(env, 1); 835489Slinton } 845489Slinton 855489Slinton /* 865489Slinton * This routine is called when an interrupt occurs. 875489Slinton */ 885489Slinton 895489Slinton LOCAL catchintr() 905489Slinton { 915489Slinton putchar('\n'); 925489Slinton prompt(); 935489Slinton 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 { 1045489Slinton register int i, j; 105*5648Slinton BOOLEAN done; 1065489Slinton 107*5648Slinton if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) { 108*5648Slinton objname = argv[1]; 109*5648Slinton option('r') = TRUE; 110*5648Slinton option('t') = TRUE; 111*5648Slinton if (streq(argv[0], "pxhdr")) { 112*5648Slinton setargs("pdx", argv[2]); 113*5648Slinton firstarg = 3; 1145489Slinton } else { 115*5648Slinton setargs("pix", NIL); 116*5648Slinton firstarg = 2; 1175489Slinton } 118*5648Slinton argv[0] = "pdx"; 119*5648Slinton } else { 120*5648Slinton done = FALSE; 121*5648Slinton i = 1; 122*5648Slinton while (i < argc && !done) { 123*5648Slinton if (argv[i][0] == '-') { 124*5648Slinton for (j = 1; argv[i][j] != '\0'; j++) { 125*5648Slinton switch (argv[i][j]) { 126*5648Slinton case 'r': /* run program before accepting commands */ 127*5648Slinton case 'b': /* (internal) trace breakpoints */ 128*5648Slinton case 'e': /* (internal) trace execution */ 129*5648Slinton case 'h': /* (internal) display header information */ 130*5648Slinton option(argv[i][j]) = TRUE; 131*5648Slinton break; 132*5648Slinton 133*5648Slinton default: 134*5648Slinton panic("bad option \"%c\"", argv[i]); 135*5648Slinton } 136*5648Slinton } 137*5648Slinton } else { 138*5648Slinton objname = argv[i]; 139*5648Slinton done = TRUE; 140*5648Slinton } 141*5648Slinton i++; 142*5648Slinton } 143*5648Slinton firstarg = i; 144*5648Slinton setargs("pdx", objname); 1455489Slinton } 1465489Slinton } 1475489Slinton 1485489Slinton /* 149*5648Slinton * Terminate program. In the case of the -t option, we must remove 150*5648Slinton * the object file because it's a tmp file. 1515489Slinton */ 1525489Slinton 153*5648Slinton quit(r) 154*5648Slinton int r; 1555489Slinton { 156*5648Slinton if (option('t')) { 157*5648Slinton unlink(objname); 1585489Slinton } 159*5648Slinton exit(r); 1605489Slinton } 161*5648Slinton 162*5648Slinton LOCAL catchsigs() 163*5648Slinton { 164*5648Slinton signal(SIGHUP, quit); 165*5648Slinton signal(SIGQUIT, quit); 166*5648Slinton } 167