Commit | Line | Data |
---|---|---|
a049c340 BJ |
1 | static char sccsid[] = "@(#)main.c 4.1 %G%"; |
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 | } | |
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 | ||
91 | done() | |
92 | { | |
93 | endpcs(); | |
94 | exit(exitflg); | |
95 | } | |
96 | ||
97 | L_INT | |
98 | round(a,b) | |
99 | REG 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 | */ | |
110 | chkerr() | |
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 | */ | |
120 | error(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 | */ | |
133 | fault(a) | |
134 | { | |
135 | signal(a, fault); | |
136 | lseek(infile, 0L, 2); | |
137 | mkfault++; | |
138 | } |