|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: static char sccsid[] = "%Z%%M% %I% %G%";
10: #include <stdio.h>
11:
12:
13: INT mkfault;
14: INT infile;
15: INT outfile = 1;
16: L_INT maxpos;
17: L_INT maxoff;
18: INT radix = 16;
19:
20: CHAR printbuf[MAXLIN];
21: CHAR *printptr = printbuf;
22: CHAR *digitptr;
23:
24:
25: eqstr(s1, s2)
26: REG STRING s1, s2;
27: {
28: REG STRING es1;
29: WHILE *s1++ == *s2
30: DO IF *s2++ == 0
31: THEN return(1);
32: FI
33: OD
34: return(0);
35: }
36:
37: length(s)
38: REG STRING s;
39: {
40: INT n = 0;
41: WHILE *s++ DO n++; OD
42: return(n);
43: }
44:
45: printc(c)
46: CHAR c;
47: {
48: CHAR d;
49: STRING q;
50: INT posn, tabs, p;
51:
52: IF mkfault
53: THEN return;
54: ELIF (*printptr=c)==EOR
55: THEN tabs=0; posn=0; q=printbuf;
56: FOR p=0; p<printptr-printbuf; p++
57: DO d=printbuf[p];
58: IF (p&7)==0 ANDF posn
59: THEN tabs++; posn=0;
60: FI
61: IF d==SP
62: THEN posn++;
63: ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
64: WHILE posn>0 DO *q++=SP; posn--; OD
65: *q++=d;
66: FI
67: OD
68: *q++=EOR;
69: #ifdef EDDT
70: printptr=printbuf; do putchar(*printptr++); while (printptr<q);
71: #else
72: write(outfile,printbuf,q-printbuf);
73: #endif
74: printptr=printbuf;
75: ELIF c==TB
76: THEN *printptr++=SP;
77: WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
78: ELIF c
79: THEN printptr++;
80: FI
81: }
82:
83: charpos()
84: { return(printptr-printbuf);
85: }
86:
87: flushbuf()
88: { IF printptr!=printbuf
89: THEN printc(EOR);
90: FI
91: }
92:
93: printf(fmat,a1)
94: STRING fmat;
95: STRING *a1;
96: {
97: STRING fptr, s;
98: INT *vptr;
99: L_INT *dptr;
100: L_REAL *rptr;
101: INT width, prec;
102: CHAR c, adj;
103: INT x, decpt, n;
104: L_INT lx;
105: CHAR digits[64];
106:
107: fptr = fmat; dptr = vptr = &a1;
108:
109: WHILE c = *fptr++
110: DO IF c!='%'
111: THEN printc(c);
112: ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
113: width=convert(&fptr);
114: IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
115: digitptr=digits;
116: #ifndef vax
117: dptr=rptr=vptr; lx = *dptr; x = *vptr++;
118: #else
119: rptr=dptr; x = shorten(lx = *dptr++);
120: #endif
121: s=0;
122: switch (c = *fptr++) {
123:
124: case 'd':
125: case 'u':
126: printnum(x,c,10); break;
127: case 'o':
128: #ifndef vax
129: printoct(0,x,0); break;
130: #else
131: printoct(itol(0,x),0); break;
132: #endif
133: case 'q':
134: lx=x; printoct(lx,-1); break;
135: case 'x':
136: #ifndef vax
137: printdbl(0,x,c,16); break;
138: #else
139: printdbl(itol(0,x),c,16); break;
140: #endif
141: case 'r':
142: printdbl(lx=x,c,radix); break;
143: case 'R':
144: printdbl(lx,c,radix); vptr++; break;
145: case 'Y':
146: printdate(lx); vptr++; break;
147: case 'D':
148: case 'U':
149: printdbl(lx,c,10); vptr++; break;
150: case 'O':
151: printoct(lx,0); vptr++; break;
152: case 'Q':
153: printoct(lx,-1); vptr++; break;
154: case 'X':
155: printdbl(lx,'x',16); vptr++; break;
156: case 'c':
157: printc(x); break;
158: case 's':
159: #ifndef vax
160: s=x; break;
161: #else
162: s=lx; break;
163: #endif
164: #ifndef EDDT
165: case 'f':
166: case 'F':
167: #ifdef vax
168: dptr++;
169: sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break;
170: #else
171: vptr += 7;
172: s=ecvt(*rptr, prec, &decpt, &n);
173: *digitptr++=(n?'-':'+');
174: *digitptr++ = (decpt<=0 ? '0' : *s++);
175: IF decpt>0 THEN decpt--; FI
176: *digitptr++ = '.';
177: WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
178: WHILE *--digitptr=='0' DONE
179: digitptr += (digitptr-digits>=3 ? 1 : 2);
180: IF decpt
181: THEN *digitptr++ = 'e'; printnum(decpt,'d',10);
182: FI
183: s=0; prec = -1; break;
184: #endif
185: #endif
186: case 'm':
187: vptr--; break;
188: case 'M':
189: width=x; break;
190: case 'T':
191: case 't':
192: IF c=='T'
193: THEN width=x;
194: #ifndef vax
195: ELSE vptr--;
196: #else
197: ELSE dptr--;
198: #endif
199: FI
200: IF width
201: THEN width -= charpos()%width;
202: FI
203: break;
204: default:
205: #ifndef vax
206: printc(c); vptr--;
207: #else
208: printc(c); dptr--;
209: #endif
210: }
211:
212: IF s==0
213: THEN *digitptr=0; s=digits;
214: FI
215: n=length(s);
216: n=(prec<n ANDF prec>=0 ? prec : n);
217: width -= n;
218: IF adj=='r'
219: THEN WHILE width-- > 0
220: DO printc(SP); OD
221: FI
222: WHILE n-- DO printc(*s++); OD
223: WHILE width-- > 0 DO printc(SP); OD
224: digitptr=digits;
225: FI
226: OD
227: }
228:
229: printdate(tvec)
230: L_INT tvec;
231: {
232: REG INT i;
233: REG STRING timeptr;
234: #ifndef EDDT
235: timeptr = ctime(&tvec);
236: #else
237: timeptr="????????????????????????";
238: #endif
239: FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
240: FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
241: } /*printdate*/
242:
243: prints(s)
244: char *s;
245: { printf("%s",s);
246: }
247:
248: newline()
249: {
250: printc(EOR);
251: }
252:
253: convert(cp)
254: REG STRING *cp;
255: {
256: REG CHAR c;
257: INT n;
258: n=0;
259: WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
260: (*cp)--;
261: return(n);
262: }
263:
264: printnum(n,fmat,base)
265: REG INT n;
266: {
267: REG CHAR k;
268: REG INT *dptr;
269: INT digs[15];
270: dptr=digs;
271: IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
272: n &= 0xffff;
273: WHILE n
274: DO *dptr++ = ((POS)(n&0xffff))%base;
275: n=((POS)(n&0xffff))/base;
276: OD
277: IF dptr==digs THEN *dptr++=0; FI
278: WHILE dptr!=digs
279: DO k = *--dptr;
280: *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
281: OD
282: }
283:
284: printoct(o,s)
285: L_INT o;
286: INT s;
287: {
288: INT i;
289: L_INT po = o;
290: CHAR digs[12];
291:
292: IF s
293: THEN IF po<0
294: THEN po = -po; *digitptr++='-';
295: ELSE IF s>0 THEN *digitptr++='+'; FI
296: FI
297: FI
298: FOR i=0;i<=11;i++
299: DO digs[i] = po&7; po >>= 3; OD
300: digs[10] &= 03; digs[11]=0;
301: FOR i=11;i>=0;i--
302: DO IF digs[i] THEN break; FI OD
303: FOR i++;i>=0;i--
304: DO *digitptr++=digs[i]+'0'; OD
305: }
306:
307: #ifndef vax
308: printdbl(lx,ly,fmat,base)
309: INT lx, ly; char fmat; int base;
310: #else
311: printdbl(lxy,fmat,base)
312: L_INT lxy; char fmat; int base;
313: #endif
314: { int digs[20]; int *dptr; char k;
315: #ifndef MULD2
316: register char *cp1;
317: cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;}
318: sprintf(cp1,base==16 ? "%X" : "%D",lxy);
319: cp1=digs; while (*digitptr++= *cp1++); --digitptr;
320: #else
321: L_REAL f ,g; long q;
322: #ifdef vax
323: INT lx,ly;
324: ly=lxy; lx=(lxy>>16)&0xFFFF;
325: #endif
326: dptr=digs;
327: IF fmat=='D' ORF fmat=='r'
328: THEN f=itol(lx,ly);
329: IF f<0 THEN *digitptr++='-'; f = -f; FI
330: ELSE
331: IF lx==-1
332: THEN *digitptr++='-'; f=leng(-ly);
333: ELSE f=leng(lx); f *= itol(1,0); f += leng(ly);
334: FI
335: IF fmat=='x' THEN *digitptr++='#'; FI
336: FI
337: WHILE f
338: DO q=f/base; g=q;
339: *dptr++ = f-g*base;
340: f=q;
341: OD
342: IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI
343: WHILE dptr!=digs
344: DO k = *--dptr;
345: *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
346: OD
347: #endif
348: }
349:
350: iclose()
351: {
352: IF infile
353: THEN close(infile); infile=0;
354: FI
355: }
356:
357: oclose()
358: {
359: IF outfile!=1
360: THEN flushbuf(); close(outfile); outfile=1;
361: FI
362: }
363:
364: endline()
365: {
366:
367: if (maxpos <= charpos())
368: printf("\n");
369: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.