xref: /csrg-svn/old/adb/adb.tahoe/main.c (revision 26419)
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