|
|
1.1 root 1: #
2: /*
3: *
4: * UNIX debugger
5: *
6: */
7:
8: #include "defs.h"
9: SCCSID(@(#)output.c 2.3);
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: es1 = s1+8;
30: WHILE *s1++ == *s2
31: DO IF *s2++ == 0 ORF s1>=es1
32: THEN return(1);
33: FI
34: OD
35: return(0);
36: }
37:
38: length(s)
39: REG STRING s;
40: {
41: INT n = 0;
42: WHILE *s++ DO n++; OD
43: return(n);
44: }
45:
46: printc(c)
47: CHAR c;
48: {
49: CHAR d;
50: STRING q;
51: INT posn, tabs, p;
52:
53: IF mkfault
54: THEN return;
55: ELIF (*printptr=c)==EOR
56: THEN tabs=0; posn=0; q=printbuf;
57: FOR p=0; p<printptr-printbuf; p++
58: DO d=printbuf[p];
59: IF (p&7)==0 ANDF posn
60: THEN tabs++; posn=0;
61: FI
62: IF d==SP
63: THEN posn++;
64: ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
65: WHILE posn>0 DO *q++=SP; posn--; OD
66: *q++=d;
67: FI
68: OD
69: *q++=EOR;
70: #ifdef EDDT
71: printptr=printbuf; do putchar(*printptr++); while (printptr<q);
72: #else
73: write(outfile,printbuf,q-printbuf);
74: #endif
75: printptr=printbuf;
76: ELIF c==TB
77: THEN *printptr++=SP;
78: WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
79: ELIF c
80: THEN printptr++;
81: FI
82: }
83:
84: charpos()
85: { return(printptr-printbuf);
86: }
87:
88: flushbuf()
89: { IF printptr!=printbuf
90: THEN printc(EOR);
91: FI
92: }
93:
94: printf(fmat,a1)
95: STRING fmat;
96: STRING *a1;
97: {
98: STRING fptr, s;
99: INT *vptr;
100: L_INT *dptr;
101: L_REAL *rptr;
102: INT width, prec;
103: CHAR c, adj;
104: INT x, decpt, n;
105: L_INT lx;
106: CHAR digits[64];
107:
108: fptr = fmat; dptr = vptr = &a1;
109:
110: WHILE c = *fptr++
111: DO IF c!='%'
112: THEN printc(c);
113: ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
114: width=convert(&fptr);
115: IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
116: digitptr=digits;
117: #ifndef vax
118: dptr=rptr=vptr; lx = *dptr; x = *vptr++;
119: #else
120: rptr=dptr; x = shorten(lx = *dptr++);
121: #endif
122: s=0;
123: switch (c = *fptr++) {
124:
125: case 'd':
126: case 'u':
127: printnum(x,c,10); break;
128: case 'o':
129: #ifndef vax
130: printoct(0,x,0); break;
131: #else
132: printoct(itol(0,x),0); break;
133: #endif
134: case 'q':
135: lx=x; printoct(lx,-1); break;
136: case 'x':
137: #ifndef vax
138: printdbl(0,x,c,16); break;
139: #else
140: printdbl(itol(0,x),c,16); break;
141: #endif
142: case 'r':
143: printdbl(lx=x,c,radix); break;
144: case 'R':
145: printdbl(lx,c,radix); vptr++; break;
146: case 'Y':
147: printdate(lx); vptr++; break;
148: case 'D':
149: case 'U':
150: printdbl(lx,c,10); vptr++; break;
151: case 'O':
152: printoct(lx,0); vptr++; break;
153: case 'Q':
154: printoct(lx,-1); vptr++; break;
155: case 'X':
156: printdbl(lx,'x',16); vptr++; break;
157: case 'c':
158: printc(x); break;
159: case 's':
160: #ifndef vax
161: s=x; break;
162: #else
163: s=lx; break;
164: #endif
165: #ifndef EDDT
166: case 'f':
167: case 'F':
168: #ifdef vax
169: dptr++;
170: sprintf(s=digits,"%+.16e",*rptr,*(rptr+4)); prec= -1; break;
171: #else
172: vptr += 7;
173: s=ecvt(*rptr, prec, &decpt, &n);
174: *digitptr++=(n?'-':'+');
175: *digitptr++ = (decpt<=0 ? '0' : *s++);
176: IF decpt>0 THEN decpt--; FI
177: *digitptr++ = '.';
178: WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
179: WHILE *--digitptr=='0' DONE
180: digitptr += (digitptr-digits>=3 ? 1 : 2);
181: IF decpt
182: THEN *digitptr++ = 'e'; printnum(decpt,'d',10);
183: FI
184: s=0; prec = -1; break;
185: #endif
186: #endif
187: case 'm':
188: vptr--; break;
189: case 'M':
190: width=x; break;
191: case 'T':
192: case 't':
193: IF c=='T'
194: THEN width=x;
195: #ifndef vax
196: ELSE vptr--;
197: #else
198: ELSE dptr--;
199: #endif
200: FI
201: IF width
202: THEN width -= charpos()%width;
203: FI
204: break;
205: default:
206: #ifndef vax
207: printc(c); vptr--;
208: #else
209: printc(c); dptr--;
210: #endif
211: }
212:
213: IF s==0
214: THEN *digitptr=0; s=digits;
215: FI
216: n=length(s);
217: n=(prec<n ANDF prec>=0 ? prec : n);
218: width -= n;
219: IF adj=='r'
220: THEN WHILE width-- > 0
221: DO printc(SP); OD
222: FI
223: WHILE n-- DO printc(*s++); OD
224: WHILE width-- > 0 DO printc(SP); OD
225: digitptr=digits;
226: FI
227: OD
228: }
229:
230: printdate(tvec)
231: L_INT tvec;
232: {
233: REG INT i;
234: REG STRING timeptr;
235: #ifndef EDDT
236: timeptr = ctime(&tvec);
237: #else
238: timeptr="????????????????????????";
239: #endif
240: FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
241: FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
242: } /*printdate*/
243:
244: prints(s)
245: char *s;
246: { printf("%s",s);
247: }
248:
249: newline()
250: {
251: printc(EOR);
252: }
253:
254: convert(cp)
255: REG STRING *cp;
256: {
257: REG CHAR c;
258: INT n;
259: n=0;
260: WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
261: (*cp)--;
262: return(n);
263: }
264:
265: printnum(n,fmat,base)
266: REG INT n;
267: {
268: REG CHAR k;
269: REG INT *dptr;
270: INT digs[15];
271: dptr=digs;
272: IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
273: WHILE n
274: DO *dptr++ = ((POS)n)%base;
275: n=((POS)n)/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: #ifndef vax
367: IF charpos()>=maxpos
368: #else
369: IF maxpos<=charpos()
370: #endif
371: THEN printf("\n");
372: FI
373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.