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