Commit | Line | Data |
---|---|---|
d94e2462 M |
1 | # |
2 | /* | |
3 | * | |
4 | * UNIX debugger | |
5 | * | |
6 | */ | |
7 | ||
8 | #include "defs.h" | |
9 | ||
10 | ||
11 | INT mkfault; | |
12 | INT infile; | |
13 | INT outfile 1; | |
14 | INT maxpos; | |
15 | ||
16 | CHAR printbuf[MAXLIN]; | |
17 | CHAR *printptr printbuf; | |
18 | CHAR *digitptr; | |
19 | ||
20 | ||
21 | eqstr(s1, s2) | |
22 | REG STRING s1, s2; | |
23 | { | |
24 | REG STRING es1; | |
25 | es1 = s1+8; | |
26 | WHILE *s1++ == *s2 | |
27 | DO IF *s2++ == 0 ORF s1>=es1 | |
28 | THEN return(1); | |
29 | FI | |
30 | OD | |
31 | return(0); | |
32 | } | |
33 | ||
34 | length(s) | |
35 | STRING s; | |
36 | { | |
37 | INT n 0; | |
38 | WHILE *s++ DO n++; OD | |
39 | return(n); | |
40 | } | |
41 | ||
42 | printc(c) | |
43 | CHAR c; | |
44 | { | |
45 | CHAR d; | |
46 | STRING q; | |
47 | INT posn, tabs, p; | |
48 | ||
49 | IF mkfault | |
50 | THEN return; | |
51 | ELIF (*printptr=c)==EOR | |
52 | THEN tabs=0; posn=0; q=printbuf; | |
53 | FOR p=0; p<printptr-printbuf; p++ | |
54 | DO d=printbuf[p]; | |
55 | IF (p&7)==0 ANDF posn | |
56 | THEN tabs++; posn=0; | |
57 | FI | |
58 | IF d==SP | |
59 | THEN posn++; | |
60 | ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD | |
61 | WHILE posn>0 DO *q++=SP; posn--; OD | |
62 | *q++=d; | |
63 | FI | |
64 | OD | |
65 | *q++=EOR; | |
66 | write(outfile,printbuf,q-printbuf); | |
67 | printptr=printbuf; | |
68 | ELIF c==TB | |
69 | THEN *printptr++=SP; | |
70 | WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD | |
71 | ELIF c | |
72 | THEN printptr++; | |
73 | FI | |
74 | } | |
75 | ||
76 | charpos() | |
77 | { return(printptr-printbuf); | |
78 | } | |
79 | ||
80 | flushbuf() | |
81 | { IF printptr!=printbuf | |
82 | THEN printc(EOR); | |
83 | FI | |
84 | } | |
85 | ||
86 | printf(fmat,a1) | |
87 | STRING fmat; | |
88 | STRING *a1; | |
89 | { | |
90 | STRING fptr, s; | |
91 | INT *vptr; | |
92 | L_INT *dptr; | |
93 | L_REAL *rptr; | |
94 | INT width, prec; | |
95 | CHAR c, adj; | |
96 | INT x, decpt, n; | |
97 | L_INT lx; | |
98 | CHAR digits[64]; | |
99 | ||
100 | fptr = fmat; vptr = &a1; | |
101 | ||
102 | WHILE c = *fptr++ | |
103 | DO IF c!='%' | |
104 | THEN printc(c); | |
105 | ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI | |
106 | width=convert(&fptr); | |
107 | IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI | |
108 | digitptr=digits; | |
109 | dptr=rptr=vptr; lx = *dptr; x = *vptr++; | |
110 | s=0; | |
111 | switch (c = *fptr++) { | |
112 | ||
113 | case 'd': | |
114 | case 'u': | |
115 | printnum(x,c,10); break; | |
116 | case 'o': | |
117 | printoct(0,x,0); break; | |
118 | case 'q': | |
119 | lx=x; printoct(lx,-1); break; | |
120 | case 'x': | |
121 | printdbl(0,x,c,16); break; | |
122 | case 'Y': | |
123 | printdate(lx); vptr++; break; | |
124 | case 'D': | |
125 | case 'U': | |
126 | printdbl(lx,c,10); vptr++; break; | |
127 | case 'O': | |
128 | printoct(lx,0); vptr++; break; | |
129 | case 'Q': | |
130 | printoct(lx,-1); vptr++; break; | |
131 | case 'X': | |
132 | printdbl(lx,'x',16); vptr++; break; | |
133 | case 'c': | |
134 | printc(x); break; | |
135 | case 's': | |
136 | s=x; break; | |
137 | case 'f': | |
138 | case 'F': | |
139 | vptr += 7; | |
140 | s=ecvt(*rptr, prec, &decpt, &n); | |
141 | *digitptr++=(n?'-':'+'); | |
142 | *digitptr++ = (decpt<=0 ? '0' : *s++); | |
143 | IF decpt>0 THEN decpt--; FI | |
144 | *digitptr++ = '.'; | |
145 | WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD | |
146 | WHILE *--digitptr=='0' DONE | |
147 | digitptr += (digitptr-digits>=3 ? 1 : 2); | |
148 | IF decpt | |
149 | THEN *digitptr++ = 'e'; printnum(decpt,'d',10); | |
150 | FI | |
151 | s=0; prec = -1; break; | |
152 | case 'm': | |
153 | vptr--; break; | |
154 | case 'M': | |
155 | width=x; break; | |
156 | case 'T': | |
157 | case 't': | |
158 | IF c=='T' | |
159 | THEN width=x; | |
160 | ELSE vptr--; | |
161 | FI | |
162 | IF width | |
163 | THEN width -= charpos()%width; | |
164 | FI | |
165 | break; | |
166 | default: | |
167 | printc(c); vptr--; | |
168 | } | |
169 | ||
170 | IF s==0 | |
171 | THEN *digitptr=0; s=digits; | |
172 | FI | |
173 | n=length(s); | |
174 | n=(prec<n ANDF prec>=0 ? prec : n); | |
175 | width -= n; | |
176 | IF adj=='r' | |
177 | THEN WHILE width-- > 0 | |
178 | DO printc(SP); OD | |
179 | FI | |
180 | WHILE n-- DO printc(*s++); OD | |
181 | WHILE width-- > 0 DO printc(SP); OD | |
182 | digitptr=digits; | |
183 | FI | |
184 | OD | |
185 | } | |
186 | ||
187 | printdate(tvec) | |
188 | L_INT tvec; | |
189 | { | |
190 | REG INT i; | |
191 | REG STRING timeptr; | |
192 | timeptr = ctime(&tvec); | |
193 | FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD | |
194 | FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD | |
195 | } /*printdate*/ | |
196 | ||
197 | prints(s) | |
198 | char *s; | |
199 | { printf("%s",s); | |
200 | } | |
201 | ||
202 | newline() | |
203 | { | |
204 | printc(EOR); | |
205 | } | |
206 | ||
207 | convert(cp) | |
208 | REG STRING *cp; | |
209 | { | |
210 | REG CHAR c; | |
211 | INT n; | |
212 | n=0; | |
213 | WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD | |
214 | (*cp)--; | |
215 | return(n); | |
216 | } | |
217 | ||
218 | printnum(n,fmat,base) | |
219 | REG INT n; | |
220 | { | |
221 | REG CHAR k; | |
222 | REG INT *dptr; | |
223 | INT digs[15]; | |
224 | dptr=digs; | |
225 | IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI | |
226 | WHILE n | |
227 | DO *dptr++ = ((POS)n)%base; | |
228 | n=((POS)n)/base; | |
229 | OD | |
230 | IF dptr==digs THEN *dptr++=0; FI | |
231 | WHILE dptr!=digs | |
232 | DO k = *--dptr; | |
233 | *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); | |
234 | OD | |
235 | } | |
236 | ||
237 | printoct(o,s) | |
238 | L_INT o; | |
239 | INT s; | |
240 | { | |
241 | INT i; | |
242 | L_INT po = o; | |
243 | CHAR digs[12]; | |
244 | ||
245 | IF s | |
246 | THEN IF po<0 | |
247 | THEN po = -po; *digitptr++='-'; | |
248 | ELSE IF s>0 THEN *digitptr++='+'; FI | |
249 | FI | |
250 | FI | |
251 | FOR i=0;i<=11;i++ | |
252 | DO digs[i] = po&7; po =>> 3; OD | |
253 | digs[10] &= 03; digs[11]=0; | |
254 | FOR i=11;i>=0;i-- | |
255 | DO IF digs[i] THEN break; FI OD | |
256 | FOR i++;i>=0;i-- | |
257 | DO *digitptr++=digs[i]+'0'; OD | |
258 | } | |
259 | ||
260 | printdbl(lx,ly,fmat,base) | |
261 | INT lx, ly; char fmat; int base; | |
262 | { int digs[20]; int *dptr; char k; | |
263 | L_REAL f ,g; long q; | |
264 | dptr=digs; | |
265 | IF fmat!='D' | |
266 | THEN f=leng(lx); f *= itol(1,0); f += leng(ly); | |
267 | IF fmat=='x' THEN *digitptr++='#'; FI | |
268 | ELSE f=itol(lx,ly); | |
269 | IF f<0 THEN *digitptr++='-'; f = -f; FI | |
270 | FI | |
271 | WHILE f | |
272 | DO q=f/base; g=q; | |
273 | *dptr++ = f-g*base; | |
274 | f=q; | |
275 | OD | |
276 | IF dptr==digs THEN *dptr++=0; FI | |
277 | WHILE dptr!=digs | |
278 | DO k = *--dptr; | |
279 | *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); | |
280 | OD | |
281 | } | |
282 | ||
283 | iclose() | |
284 | { | |
285 | IF infile | |
286 | THEN close(infile); infile=0; | |
287 | FI | |
288 | } | |
289 | ||
290 | oclose() | |
291 | { | |
292 | IF outfile!=1 | |
293 | THEN flushbuf(); close(outfile); outfile=1; | |
294 | FI | |
295 | } | |
296 | ||
297 | endline() | |
298 | { | |
299 | IF charpos()>=maxpos | |
300 | THEN printf("\n"); | |
301 | FI | |
302 | } |