Commit | Line | Data |
---|---|---|
54ee7326 BJ |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | SCCSID(@(#)main.c 2.2); | |
10 | ||
11 | ||
12 | MSG NOEOR; | |
13 | ||
14 | INT mkfault; | |
15 | INT executing; | |
16 | INT infile; | |
17 | CHAR *lp; | |
18 | L_INT maxoff; | |
19 | L_INT maxpos; | |
20 | ADDR sigint; | |
21 | ADDR sigqit; | |
22 | INT wtflag; | |
23 | L_INT maxfile; | |
24 | L_INT maxstor; | |
25 | L_INT txtsiz; | |
26 | L_INT datsiz; | |
27 | L_INT datbas; | |
28 | L_INT stksiz; | |
29 | STRING errflg; | |
30 | L_INT exitflg; | |
31 | INT magic; | |
32 | L_INT entrypt; | |
33 | ||
34 | CHAR lastc; | |
35 | INT eof; | |
36 | ||
37 | INT lastcom; | |
38 | L_INT var[36]; | |
39 | STRING symfil; | |
40 | STRING corfil; | |
41 | CHAR printbuf[]; | |
42 | CHAR *printptr; | |
43 | ||
44 | ||
45 | L_INT | |
46 | round(a,b) | |
47 | REG L_INT a, b; | |
48 | { | |
49 | REG L_INT w; | |
50 | w = (a/b)*b; | |
51 | IF a!=w THEN w += b; FI | |
52 | return(w); | |
53 | } | |
54 | ||
55 | /* error handling */ | |
56 | ||
57 | chkerr() | |
58 | { | |
59 | IF errflg ORF mkfault | |
60 | THEN error(errflg); | |
61 | FI | |
62 | } | |
63 | ||
64 | error(n) | |
65 | STRING n; | |
66 | { | |
67 | errflg=n; | |
68 | iclose(); oclose(); | |
69 | #ifndef EDDT | |
70 | reset(); | |
71 | #endif | |
72 | } | |
73 | ||
74 | fault(a) | |
75 | { | |
76 | signal(a,fault); | |
77 | #ifndef EDDT | |
78 | lseek(infile,0L,2); | |
79 | #endif | |
80 | mkfault++; | |
81 | } | |
82 | ||
83 | /* set up files and initial address mappings */ | |
84 | INT argcount; | |
85 | ||
86 | #ifndef EDDT | |
87 | main(argc, argv) | |
88 | #else | |
89 | eddt(argc, argv) | |
90 | #endif | |
91 | REG STRING *argv; | |
92 | REG INT argc; | |
93 | { | |
94 | maxfile=1L<<24; maxstor=1L<<31; | |
95 | mkioptab(); | |
96 | ||
97 | WHILE argc>1 | |
98 | DO IF eqstr("-w",argv[1]) | |
99 | THEN wtflag=2; argc--; argv++; | |
100 | ELSE break; | |
101 | FI | |
102 | OD | |
103 | ||
104 | IF argc>1 THEN symfil = argv[1]; FI | |
105 | IF argc>2 THEN corfil = argv[2]; FI | |
106 | argcount=argc; | |
107 | setsym(); setcor(); | |
108 | ||
109 | /* set up variables for user */ | |
110 | maxoff=MAXOFF; maxpos=MAXPOS; | |
111 | var[VARB] = datbas; | |
112 | var[VARD] = datsiz; | |
113 | var[VARE] = entrypt; | |
114 | var[VARM] = magic; | |
115 | var[VARS] = stksiz; | |
116 | var[VART] = txtsiz; | |
117 | ||
118 | #ifndef EDDT | |
119 | IF (sigint=signal(SIGINT,01))!=01 | |
120 | THEN sigint=fault; signal(SIGINT,fault); | |
121 | FI | |
122 | sigqit=signal(SIGQUIT,1); | |
123 | setexit(); | |
124 | #endif | |
125 | IF executing THEN delbp(); FI | |
126 | executing=FALSE; | |
127 | #ifdef EDDT | |
128 | prints(DBNAME); | |
129 | #endif | |
130 | ||
131 | LOOP flushbuf(); | |
132 | IF errflg | |
133 | THEN printf("%s\n",errflg); | |
134 | exitflg=errflg; | |
135 | errflg=0; | |
136 | FI | |
137 | IF mkfault | |
138 | THEN mkfault=0; printc(EOR); prints(DBNAME); | |
139 | FI | |
140 | lp=0; rdc(); lp--; | |
141 | IF eof | |
142 | THEN IF infile | |
143 | #ifndef EDDT | |
144 | THEN iclose(); eof=0; reset(); | |
145 | #else | |
146 | THEN iclose(); eof=0; | |
147 | #endif | |
148 | ELSE done(); | |
149 | FI | |
150 | ELSE exitflg=0; | |
151 | FI | |
152 | command(0,lastcom); | |
153 | IF lp ANDF lastc!=EOR THEN error(NOEOR); FI | |
154 | POOL | |
155 | } | |
156 | ||
157 | #ifndef EDDT | |
158 | done() | |
159 | { | |
160 | endpcs(); | |
161 | exit(exitflg); | |
162 | } | |
163 | #endif |