|
|
1.1 root 1: /*
2: * adb - main command loop and error/interrupt handling
3: */
4: #include "defs.h"
5: #include <signal.h>
6: #include <setjmp.h>
7:
8: MSG NOEOR;
9:
10: char *errflg;
11: BOOL wtflag;
12:
13: BOOL mkfault;
14: ADDR maxoff;
15:
16: int xargc; /* bullshit */
17:
18: BOOL executing;
19: int infile;
20: char *lp;
21: static int exitflg;
22: int (*sigint)();
23: int (*sigqit)();
24:
25: char lastc;
26: int eof;
27:
28: char *Ipath = "/usr/lib/adb";
29: static jmp_buf env;
30:
31: main(argc, argv)
32: register char **argv;
33: int argc;
34: {
35: extern fault();
36:
37: mkioptab();
38: maxoff = MAXOFF;
39: another:
40: if (argc>1) {
41: if (strcmp("-w", argv[1]) == 0) {
42: wtflag = 2; /* suitable for open() */
43: argc--, argv++;
44: goto another;
45: }
46: if (argv[1][0] == '-' && argv[1][1] == 'I') {
47: Ipath = argv[1]+2;
48: argc--, argv++;
49: }
50: }
51: if (argc > 1)
52: symfil = argv[1];
53: if (argc > 2)
54: corfil = argv[2];
55: xargc = argc;
56: setsym();
57: setcor();
58: setvar();
59:
60: if ((sigint=signal(SIGINT,SIG_IGN)) != SIG_IGN) {
61: sigint = fault;
62: signal(SIGINT, fault);
63: }
64: sigqit = signal(SIGQUIT, SIG_IGN);
65: setjmp(env);
66: if (executing)
67: delbp();
68: executing = 0;
69: for (;;) {
70: flushbuf();
71: if (errflg) {
72: printf("%s\n", errflg);
73: exitflg = 1;
74: errflg = 0;
75: }
76: if (mkfault) {
77: mkfault=0;
78: printc('\n');
79: prints(DBNAME);
80: }
81: clrinp();
82: rdc();
83: reread();
84: if (eof) {
85: if (infile == STDIN)
86: done();
87: iclose(-1, 0);
88: eof = 0;
89: longjmp(env, 1);
90: }
91: exitflg = 0;
92: command((char *)NULL, 0);
93: reread();
94: if (rdc() != '\n')
95: error(NOEOR);
96: }
97: }
98:
99: done()
100: {
101: if (pid)
102: endpcs();
103: exit(exitflg);
104: }
105:
106: WORD
107: round(a,b)
108: register WORD a, b;
109: {
110: register WORD w;
111:
112: w = (a/b)*b;
113: if (a!=w)
114: w += b;
115: return(w);
116: }
117:
118: /*
119: * If there has been an error or a fault, take the error.
120: */
121: chkerr()
122: {
123: if (errflg || mkfault)
124: error(errflg);
125: }
126:
127: /*
128: * An error occurred; save the message for later printing,
129: * close open files, and reset to main command loop.
130: */
131: error(n)
132: char *n;
133: {
134: errflg = n;
135: iclose(0, 1);
136: oclose();
137: longjmp(env, 1);
138: }
139:
140: /*
141: * An interrupt occurred; reset the interrupt
142: * catch, seek to the end of the current file
143: * and remember that there was a fault.
144: */
145: fault(a)
146: {
147: signal(a, fault);
148: lseek(infile, 0L, 2);
149: mkfault++;
150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.