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