xref: /original-bsd/old/adb/adb.vax/output.c (revision 6c57d260)
1 #
2 /*
3  *
4  *	UNIX debugger
5  *
6  */
7 
8 #include "defs.h"
9 static	char sccsid[] = "@(#)output.c 4.1 05/14/81";
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 MSG		TOODEEP;
24 
25 
26 eqstr(s1, s2)
27 	REG STRING	s1, s2;
28 {
29 	REG STRING	 es1;
30 	WHILE *s1++ == *s2
31 	DO IF *s2++ == 0
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 	n &= 0xffff;
274 	WHILE n
275 	DO  *dptr++ = ((POS)(n&0xffff))%base;
276 	    n=((POS)(n&0xffff))/base;
277 	OD
278 	IF dptr==digs THEN *dptr++=0; FI
279 	WHILE dptr!=digs
280 	DO  k = *--dptr;
281 	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
282 	OD
283 }
284 
285 printoct(o,s)
286 	L_INT		o;
287 	INT		s;
288 {
289 	INT		i;
290 	L_INT		po = o;
291 	CHAR		digs[12];
292 
293 	IF s
294 	THEN IF po<0
295 	     THEN po = -po; *digitptr++='-';
296 	     ELSE IF s>0 THEN *digitptr++='+'; FI
297 	     FI
298 	FI
299 	FOR i=0;i<=11;i++
300 	DO digs[i] = po&7; po >>= 3; OD
301 	digs[10] &= 03; digs[11]=0;
302 	FOR i=11;i>=0;i--
303 	DO IF digs[i] THEN break; FI OD
304 	FOR i++;i>=0;i--
305 	DO *digitptr++=digs[i]+'0'; OD
306 }
307 
308 #ifndef vax
309 printdbl(lx,ly,fmat,base)
310 INT lx, ly; char fmat; int base;
311 #else
312 printdbl(lxy,fmat,base)
313 L_INT lxy; char fmat; int base;
314 #endif
315 {	int digs[20]; int *dptr; char k;
316 #ifndef MULD2
317 	register char *cp1;
318 	cp1=digs; if ((lxy&0xFFFF0000L)==0xFFFF0000L) {*cp1++='-'; lxy= -lxy;}
319 	sprintf(cp1,base==16 ? "%X" : "%D",lxy);
320 	cp1=digs; while (*digitptr++= *cp1++); --digitptr;
321 #else
322 	L_REAL f ,g; long q;
323 #ifdef vax
324 	INT lx,ly;
325 	ly=lxy; lx=(lxy>>16)&0xFFFF;
326 #endif
327 	dptr=digs;
328 	IF fmat=='D' ORF fmat=='r'
329 	THEN	f=itol(lx,ly);
330 		IF f<0 THEN *digitptr++='-'; f = -f; FI
331 	ELSE
332 		IF lx==-1
333 		THEN *digitptr++='-'; f=leng(-ly);
334 		ELSE f=leng(lx); f *= itol(1,0); f += leng(ly);
335 		FI
336 		IF fmat=='x' THEN *digitptr++='#'; FI
337 	FI
338 	WHILE f
339 	DO  q=f/base; g=q;
340 	    *dptr++ = f-g*base;
341 	    f=q;
342 	OD
343 	IF dptr==digs ORF dptr[-1]>9 THEN *dptr++=0; FI
344 	WHILE dptr!=digs
345 	DO  k = *--dptr;
346 	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
347 	OD
348 #endif
349 }
350 
351 #define	MAXIFD	5
352 struct {
353 	int	fd;
354 	int	r9;
355 } istack[MAXIFD];
356 int	ifiledepth;
357 
358 iclose(stack, err)
359 {
360 	IF err
361 	THEN	IF infile
362 		THEN	close(infile); infile=0;
363 		FI
364 		WHILE --ifiledepth >= 0
365 		DO	IF istack[ifiledepth].fd
366 			THEN	close(istack[ifiledepth].fd);
367 			FI
368 		OD
369 		ifiledepth = 0;
370 	ELIF stack == 0
371 	THEN	IF infile
372 		THEN	close(infile); infile=0;
373 		FI
374 	ELIF stack > 0
375 	THEN	IF ifiledepth >= MAXIFD
376 		THEN	error(TOODEEP);
377 		FI
378 		istack[ifiledepth].fd = infile;
379 		istack[ifiledepth].r9 = var[9];
380 		ifiledepth++;
381 		infile = 0;
382 	ELSE	IF infile
383 		THEN	close(infile); infile=0;
384 		FI
385 		IF ifiledepth > 0
386 		THEN	infile = istack[--ifiledepth].fd;
387 			var[9] = istack[ifiledepth].r9;
388 		FI
389 	FI
390 }
391 
392 oclose()
393 {
394 	IF outfile!=1
395 	THEN	flushbuf(); close(outfile); outfile=1;
396 	FI
397 }
398 
399 endline()
400 {
401 
402 	if (maxpos <= charpos())
403 		printf("\n");
404 }
405