1*30110Ssam /*	kdb_output.c	7.1	86/11/20	*/
2*30110Ssam 
3*30110Ssam #include "../kdb/defs.h"
4*30110Ssam 
5*30110Ssam long	maxpos;
6*30110Ssam int	radix = 16;
7*30110Ssam 
8*30110Ssam char	printbuf[MAXLIN];
9*30110Ssam char	*printptr = printbuf;
10*30110Ssam char	*digitptr;
11*30110Ssam 
12*30110Ssam printc(c)
13*30110Ssam 	char c;
14*30110Ssam {
15*30110Ssam 	char d;
16*30110Ssam 	register char *q;
17*30110Ssam 	register posn, tabs, p;
18*30110Ssam 
19*30110Ssam 	if (mkfault)
20*30110Ssam 		return;
21*30110Ssam 	if ((*printptr=c)==EOR) {
22*30110Ssam 		tabs=0; posn=0; q=printbuf;
23*30110Ssam 		for (p=0; p<printptr-printbuf; p++) {
24*30110Ssam 			d=printbuf[p];
25*30110Ssam 			if ((p&7)==0 && posn) {
26*30110Ssam 				tabs++;
27*30110Ssam 				posn=0;
28*30110Ssam 			}
29*30110Ssam 			if (d!=SP) {
30*30110Ssam 				while (tabs>0)
31*30110Ssam 					*q++=TB, tabs--;
32*30110Ssam 				while (posn>0)
33*30110Ssam 					*q++=SP, posn--;
34*30110Ssam 				*q++=d;
35*30110Ssam 			} else
36*30110Ssam 				posn++;
37*30110Ssam 		 }
38*30110Ssam 		 *q++=EOR;
39*30110Ssam 		 kdbwrite(printbuf,q-printbuf);
40*30110Ssam 		 printptr=printbuf;
41*30110Ssam 	} else if (c==TB) {
42*30110Ssam 		*printptr++=SP;
43*30110Ssam 		while ((printptr-printbuf)&7)
44*30110Ssam 			*printptr++=SP;
45*30110Ssam 	} else if (c)
46*30110Ssam 		printptr++;
47*30110Ssam 	if (printptr >= &printbuf[MAXLIN-9]) {
48*30110Ssam 		kdbwrite(printbuf, printptr - printbuf);
49*30110Ssam 		printptr = printbuf;
50*30110Ssam 	}
51*30110Ssam }
52*30110Ssam 
53*30110Ssam charpos()
54*30110Ssam {
55*30110Ssam 
56*30110Ssam 	return (printptr-printbuf);
57*30110Ssam }
58*30110Ssam 
59*30110Ssam flushbuf()
60*30110Ssam {
61*30110Ssam 
62*30110Ssam 	if (printptr!=printbuf)
63*30110Ssam 		printc(EOR);
64*30110Ssam }
65*30110Ssam 
66*30110Ssam /* VARARGS1 */
67*30110Ssam printf(fmat,a1)
68*30110Ssam 	char *fmat, *a1;
69*30110Ssam {
70*30110Ssam 	char *fptr;
71*30110Ssam 	register char *s;
72*30110Ssam 	register long *dptr;
73*30110Ssam 	double *rptr;
74*30110Ssam 	register width, prec;
75*30110Ssam 	char c, adj;
76*30110Ssam 	int x, n;
77*30110Ssam 	register long lx;
78*30110Ssam 	char digits[64];
79*30110Ssam 
80*30110Ssam 	fptr = fmat; dptr = (long *)&a1;
81*30110Ssam 	while (c = *fptr++) {
82*30110Ssam 		if (c!='%') {
83*30110Ssam 			printc(c);
84*30110Ssam 			continue;
85*30110Ssam 		}
86*30110Ssam 		if (*fptr=='-') {
87*30110Ssam 			adj='l'; fptr++;
88*30110Ssam 		} else
89*30110Ssam 			adj='r';
90*30110Ssam 		width=convert(&fptr);
91*30110Ssam 		if (*fptr=='.') {
92*30110Ssam 			fptr++; prec=convert(&fptr);
93*30110Ssam 		} else
94*30110Ssam 			prec = -1;
95*30110Ssam 		digitptr=digits;
96*30110Ssam 		rptr=(double *)dptr; x = lx = *dptr++;
97*30110Ssam 		s=0;
98*30110Ssam 		switch (c = *fptr++) {
99*30110Ssam 		case 'd':
100*30110Ssam 			printnum(x, -10); break;
101*30110Ssam 		case 'u':
102*30110Ssam 			printnum((unsigned short)x, 10); break;
103*30110Ssam 		case 'o':
104*30110Ssam 			printnum((unsigned short)x, 8); break;
105*30110Ssam 		case 'q':
106*30110Ssam 			printnum(x, -8); break;
107*30110Ssam 		case 'x':
108*30110Ssam 			printnum((unsigned short)x, 16); break;
109*30110Ssam 		case 'z':
110*30110Ssam 			printnum((unsigned short)x, -16); break;
111*30110Ssam 		case 'R':
112*30110Ssam 			printnum(lx, radix); break;
113*30110Ssam 		case 'D':
114*30110Ssam 			printnum(lx, -10); break;
115*30110Ssam 		case 'U':
116*30110Ssam 			printnum(lx, 10); break;
117*30110Ssam 		case 'O':
118*30110Ssam 			printnum(lx, 8); break;
119*30110Ssam 		case 'Q':
120*30110Ssam 			printnum(lx, -8); break;
121*30110Ssam 		case 'X':
122*30110Ssam 			printnum(lx, 16); break;
123*30110Ssam 		case 'Z':
124*30110Ssam 			printnum(lx, -16); break;
125*30110Ssam 		case 'c':
126*30110Ssam 			printc(x); break;
127*30110Ssam 		case 's':
128*30110Ssam 			s=(char *)lx; break;
129*30110Ssam 		case 'm':
130*30110Ssam 			break;
131*30110Ssam 		case 'M':
132*30110Ssam 			width=x; break;
133*30110Ssam 		case 'T': case 't':
134*30110Ssam 			if (c=='T')
135*30110Ssam 				width=x;
136*30110Ssam 			else
137*30110Ssam 				dptr--;
138*30110Ssam 			if (width)
139*30110Ssam 				width -= charpos()%width;
140*30110Ssam 			break;
141*30110Ssam 		default:
142*30110Ssam 			printc(c); dptr--;
143*30110Ssam 			break;
144*30110Ssam 		}
145*30110Ssam 		if (s==0) {
146*30110Ssam 			*digitptr=0; s=digits;
147*30110Ssam 		}
148*30110Ssam 		n=strlen(s);
149*30110Ssam 		n=(prec<n && prec>=0 ? prec : n);
150*30110Ssam 		width -= n;
151*30110Ssam 		if (adj=='r')
152*30110Ssam 			while (width-- > 0)
153*30110Ssam 				printc(SP);
154*30110Ssam 		while (n--)
155*30110Ssam 			printc(*s++);
156*30110Ssam 		while (width-- > 0)
157*30110Ssam 			printc(SP);
158*30110Ssam 		digitptr=digits;
159*30110Ssam 	}
160*30110Ssam }
161*30110Ssam 
162*30110Ssam static
163*30110Ssam convert(cp)
164*30110Ssam 	register char **cp;
165*30110Ssam {
166*30110Ssam 	register char c;
167*30110Ssam 	int n;
168*30110Ssam 
169*30110Ssam 	n=0;
170*30110Ssam 	while (((c = *(*cp)++)>='0') && c<='9')
171*30110Ssam 		n=n*10+c-'0';
172*30110Ssam 	(*cp)--;
173*30110Ssam 	return (n);
174*30110Ssam }
175*30110Ssam 
176*30110Ssam static
177*30110Ssam printnum(n, base)
178*30110Ssam 	register POS n;
179*30110Ssam {
180*30110Ssam 	register char *dptr;
181*30110Ssam 	char digs[15];
182*30110Ssam 
183*30110Ssam 	dptr=digs;
184*30110Ssam 	if (base<0) {
185*30110Ssam 		base = -base;
186*30110Ssam 		if ((long)n<0) {
187*30110Ssam 			n = -n;
188*30110Ssam 			*digitptr++ = '-';
189*30110Ssam 		}
190*30110Ssam 	}
191*30110Ssam 	while (n) {
192*30110Ssam 		*dptr++ = n%base;
193*30110Ssam 		n /= base;
194*30110Ssam 	}
195*30110Ssam 	if (dptr==digs)
196*30110Ssam 		*dptr++=0;
197*30110Ssam 	while (dptr!=digs) {
198*30110Ssam 		n = *--dptr;
199*30110Ssam 		*digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
200*30110Ssam 	}
201*30110Ssam }
202*30110Ssam 
203*30110Ssam endline()
204*30110Ssam {
205*30110Ssam 
206*30110Ssam 	if (maxpos <= charpos())
207*30110Ssam 		printf("\n");
208*30110Ssam }
209