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