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