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