|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 4/7/87"; ! 15: #endif not lint ! 16: ! 17: /* ! 18: * Debugger main routine. ! 19: */ ! 20: ! 21: #include "defs.h" ! 22: #include <setjmp.h> ! 23: #include <signal.h> ! 24: #include "main.h" ! 25: #include "command.h" ! 26: #include "process.h" ! 27: #include "object.h" ! 28: ! 29: #define FIRST_TIME 0 /* initial value setjmp returns */ ! 30: ! 31: LOCAL int firstarg; ! 32: LOCAL jmp_buf env; ! 33: LOCAL catchintr(); ! 34: ! 35: main(argc, argv) ! 36: int argc; ! 37: char **argv; ! 38: { ! 39: FILE *fp; ! 40: int i; ! 41: ! 42: #ifdef lint ! 43: syserr(); ! 44: #endif ! 45: catchsigs(); ! 46: scanargs(argc, argv); ! 47: cmdname = argv[0]; ! 48: if ((fp = fopen(objname, "r")) == NIL) { ! 49: panic("can't read %s", objname); ! 50: } else { ! 51: fclose(fp); ! 52: } ! 53: if (option('r')) { ! 54: if (setjmp(env) == FIRST_TIME) { ! 55: arginit(); ! 56: for (i = firstarg; i < argc; i++) { ! 57: newarg(argv[i]); ! 58: } ! 59: run(); ! 60: /* NOTREACHED */ ! 61: } else { ! 62: option('r') = FALSE; ! 63: } ! 64: } else { ! 65: initstart(); ! 66: prompt(); ! 67: init(); ! 68: } ! 69: setjmp(env); ! 70: signal(SIGINT, catchintr); ! 71: yyparse(); ! 72: putchar('\n'); ! 73: quit(0); ! 74: } ! 75: ! 76: /* ! 77: * Initialize the world, including setting initial input file ! 78: * if the file exists. ! 79: */ ! 80: ! 81: init() ! 82: { ! 83: initinput(); ! 84: readobj(objname); ! 85: lexinit(); ! 86: } ! 87: ! 88: /* ! 89: * After a non-fatal error we jump back to command parsing. ! 90: */ ! 91: ! 92: erecover() ! 93: { ! 94: gobble(); ! 95: prompt(); ! 96: longjmp(env, 1); ! 97: } ! 98: ! 99: /* ! 100: * This routine is called when an interrupt occurs. ! 101: */ ! 102: ! 103: LOCAL catchintr() ! 104: { ! 105: putchar('\n'); ! 106: prompt(); ! 107: longjmp(env, 1); ! 108: } ! 109: ! 110: /* ! 111: * scan the argument list ! 112: */ ! 113: ! 114: LOCAL scanargs(argc, argv) ! 115: int argc; ! 116: char **argv; ! 117: { ! 118: register int i, j; ! 119: BOOLEAN done; ! 120: ! 121: if (streq(argv[0], "pxhdr") || streq(argv[0], "pix")) { ! 122: objname = argv[1]; ! 123: option('r') = TRUE; ! 124: option('t') = TRUE; ! 125: if (streq(argv[0], "pxhdr")) { ! 126: setargs("pdx", argv[2]); ! 127: firstarg = 3; ! 128: } else { ! 129: setargs("pix", NIL); ! 130: firstarg = 2; ! 131: } ! 132: argv[0] = "pdx"; ! 133: } else { ! 134: done = FALSE; ! 135: i = 1; ! 136: while (i < argc && !done) { ! 137: if (argv[i][0] == '-') { ! 138: for (j = 1; argv[i][j] != '\0'; j++) { ! 139: switch (argv[i][j]) { ! 140: case 'r': /* run program before accepting commands */ ! 141: case 'i': /* assume input is a terminal */ ! 142: case 'b': /* (internal) trace breakpoints */ ! 143: case 'e': /* (internal) trace execution */ ! 144: case 'h': /* (internal) display header information */ ! 145: option(argv[i][j]) = TRUE; ! 146: break; ! 147: ! 148: default: ! 149: panic("bad option \"%c\"", argv[i]); ! 150: } ! 151: } ! 152: } else { ! 153: objname = argv[i]; ! 154: done = TRUE; ! 155: } ! 156: i++; ! 157: } ! 158: firstarg = i; ! 159: setargs("pdx", objname); ! 160: } ! 161: } ! 162: ! 163: /* ! 164: * Terminate program. In the case of the -t option, we must remove ! 165: * the object file because it's a tmp file. ! 166: */ ! 167: ! 168: quit(r) ! 169: int r; ! 170: { ! 171: if (option('t')) { ! 172: unlink(objname); ! 173: } ! 174: exit(r); ! 175: } ! 176: ! 177: LOCAL catchsigs() ! 178: { ! 179: signal(SIGHUP, quit); ! 180: signal(SIGQUIT, quit); ! 181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.