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