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