Commit | Line | Data |
---|---|---|
52bff713 | 1 | static char sccsid[] = "@(#)main.c 4.3 %G%"; |
a049c340 BJ |
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 | ||
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 | } | |
6d4468aa BJ |
44 | if (eqstr("-k", argv[1])) { |
45 | kernel = 1; | |
46 | argc--, argv++; | |
47 | goto another; | |
48 | } | |
a049c340 BJ |
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 | ||
96 | done() | |
97 | { | |
98 | endpcs(); | |
99 | exit(exitflg); | |
100 | } | |
101 | ||
102 | L_INT | |
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 | */ | |
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 | */ | |
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 | */ | |
138 | fault(a) | |
139 | { | |
140 | signal(a, fault); | |
141 | lseek(infile, 0L, 2); | |
142 | mkfault++; | |
143 | } |