|
|
1.1 root 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.2 (Berkeley) 12/15/86
7: */
8:
9: #include "../kdb/defs.h"
10:
11: long maxpos;
12: int radix = 16;
13:
14: char printbuf[MAXLIN];
15: char *printptr = printbuf;
16: char *digitptr;
17:
18: printc(c)
19: char c;
20: {
21: char d;
22: register char *q;
23: register posn, tabs, p;
24:
25: if (mkfault)
26: return;
27: if ((*printptr=c)==EOR) {
28: tabs=0; posn=0; q=printbuf;
29: for (p=0; p<printptr-printbuf; p++) {
30: d=printbuf[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(printbuf,q-printbuf);
46: printptr=printbuf;
47: } else if (c==TB) {
48: *printptr++=SP;
49: while ((printptr-printbuf)&7)
50: *printptr++=SP;
51: } else if (c)
52: printptr++;
53: if (printptr >= &printbuf[MAXLIN-9]) {
54: kdbwrite(printbuf, printptr - printbuf);
55: printptr = printbuf;
56: }
57: }
58:
59: charpos()
60: {
61:
62: return (printptr-printbuf);
63: }
64:
65: flushbuf()
66: {
67:
68: if (printptr!=printbuf)
69: printc(EOR);
70: }
71:
72: /* VARARGS1 */
73: printf(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: printc(c);
89: continue;
90: }
91: if (*fptr=='-') {
92: adj='l'; fptr++;
93: } else
94: adj='r';
95: width=convert(&fptr);
96: if (*fptr=='.') {
97: fptr++; prec=convert(&fptr);
98: } else
99: prec = -1;
100: digitptr=digits;
101: x = lx = *dptr++;
102: s=0;
103: switch (c = *fptr++) {
104: case 'd':
105: printnum((u_long)x, -10); break;
106: case 'u':
107: printnum((u_long)x, 10); break;
108: case 'o':
109: printnum((u_long)x, 8); break;
110: case 'q':
111: printnum((u_long)x, -8); break;
112: case 'x':
113: printnum((u_long)x, 16); break;
114: case 'z':
115: printnum((u_long)x, -16); break;
116: case 'R':
117: printnum((u_long)lx, radix); break;
118: case 'D':
119: printnum((u_long)lx, -10); break;
120: case 'U':
121: printnum((u_long)lx, 10); break;
122: case 'O':
123: printnum((u_long)lx, 8); break;
124: case 'Q':
125: printnum((u_long)lx, -8); break;
126: case 'X':
127: printnum((u_long)lx, 16); break;
128: case 'Z':
129: printnum((u_long)lx, -16); break;
130: case 'c':
131: printc(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 -= charpos()%width;
145: break;
146: default:
147: printc(c); dptr--;
148: break;
149: }
150: if (s==0) {
151: *digitptr=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: printc(SP);
159: while (n--)
160: printc(*s++);
161: while (width-- > 0)
162: printc(SP);
163: digitptr=digits;
164: }
165: }
166:
167: static
168: convert(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
182: printnum(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: *digitptr++ = '-';
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: *digitptr++ = (n+(n<=9 ? '0' : 'a'-10));
205: }
206: }
207:
208: endline()
209: {
210:
211: if (maxpos <= charpos())
212: printf("\n");
213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.