|
|
1.1 root 1: /*
2: * @(#)prf.c 1.1 86/02/03 Copyright (c) 1985 by Sun Microsystems, Inc.
3: */
4:
5: #include <sys/types.h>
6: #include <machine/sunromvec.h>
7:
8: /*
9: * Scaled down version of C Library printf.
10: * Used to print diagnostic information directly on console tty.
11: * Since it is not interrupt driven, all system activities are
12: * suspended. Printf should not be used for chit-chat.
13: *
14: * One additional format: %b is supported to decode error registers.
15: * Usage is:
16: * printf("reg=%b\n", regval, "<base><arg>*");
17: * Where <base> is the output base expressed as a control character,
18: * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of
19: * characters, the first of which gives the bit number to be inspected
20: * (origin 1), and the next characters (up to a control character, i.e.
21: * a character <= 32), give the name of the register. Thus
22: * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
23: * would produce output:
24: * reg=2<BITTWO,BITONE>
25: */
26: /*VARARGS1*/
27: printf(fmt, x1)
28: char *fmt;
29: unsigned x1;
30: {
31:
32: prf(fmt, &x1);
33: }
34:
35: prf(fmt, adx)
36: register char *fmt;
37: register u_int *adx;
38: {
39: register int b, c, i;
40: register char *s;
41: register int any;
42:
43: loop:
44: while ((c = *fmt++) != '%') {
45: if(c == '\0')
46: return;
47: putchar(c);
48: }
49: again:
50: c = *fmt++;
51: switch (c) {
52:
53: case 'l':
54: goto again;
55: case 'x': case 'X':
56: b = 16;
57: goto number;
58: case 'd': case 'D':
59: case 'u': /* what a joke */
60: b = 10;
61: goto number;
62: case 'o': case 'O':
63: b = 8;
64: number:
65: printn((u_long)*adx, b);
66: break;
67: case 'c':
68: b = *adx;
69: putchar(b);
70: break;
71: case 'b':
72: b = *adx++;
73: s = (char *)*adx;
74: printn((u_long)b, *s++);
75: any = 0;
76: if (b) {
77: putchar('<');
78: while (i = *s++) {
79: if (b & (1 << (i-1))) {
80: if (any)
81: putchar(',');
82: any = 1;
83: for (; (c = *s) > 32; s++)
84: putchar(c);
85: } else
86: for (; *s > 32; s++)
87: ;
88: }
89: putchar('>');
90: }
91: break;
92:
93: case 's':
94: s = (char *)*adx;
95: while (c = *s++)
96: putchar(c);
97: break;
98: }
99: adx++;
100: goto loop;
101: }
102:
103: /*
104: * Printn prints a number n in base b.
105: * We don't use recursion to avoid deep kernel stacks.
106: */
107: printn(n, b)
108: register u_long n;
109: register short b;
110: {
111: char prbuf[11];
112: register char *cp;
113:
114: if (b == 10 && (int)n < 0) {
115: putchar('-');
116: n = (unsigned)(-(int)n);
117: }
118: cp = prbuf;
119: do {
120: *cp++ = "0123456789abcdef"[n%b];
121: n /= b;
122: } while (n);
123: do
124: putchar(*--cp);
125: while (cp > prbuf);
126: }
127:
128: /*
129: * Print a character on console.
130: */
131: putchar(c)
132: int c;
133: {
134:
135: (*romp->v_putchar)(c);
136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.