xref: /original-bsd/old/adb/adb.tahoe/output.c (revision cd18b70b)
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 
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 
66 charpos()
67 {	return(printptr-printbuf);
68 }
69 
70 flushbuf()
71 {	IF printptr!=printbuf
72 	THEN printc(EOR);
73 	FI
74 }
75 
76 /* VARARGS1 */
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 
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 
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 
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 
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 
265 oclose()
266 {
267 	IF outfile!=1
268 	THEN	flushbuf(); close(outfile); outfile=1;
269 	FI
270 }
271 
272 endline()
273 {
274 
275 	if (maxpos <= charpos())
276 		printf("\n");
277 }
278