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