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) 04/07/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 } 182