|
|
1.1 root 1: /* prf.c 4.3 81/05/05 */
2:
3: #include "../h/param.h"
4: #include "../h/cons.h"
5: #include "../h/mtpr.h"
6:
7: /*
8: * Scaled down version of C Library printf.
9: * Used to print diagnostic information directly on console tty.
10: * Since it is not interrupt driven, all system activities are
11: * suspended. Printf should not be used for chit-chat.
12: *
13: * One additional format: %b is supported to decode error registers.
14: * Usage is:
15: * printf("reg=%b\n", regval, "<base><arg>*");
16: * Where <base> is the output base expressed as a control character,
17: * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of
18: * characters, the first of which gives the bit number to be inspected
19: * (origin 1), and the next characters (up to a control character, i.e.
20: * a character <= 32), give the name of the register. Thus
21: * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
22: * would produce output:
23: * reg=2<BITTWO,BITONE>
24: */
25: /*VARARGS1*/
26: printf(fmt, x1)
27: char *fmt;
28: unsigned x1;
29: {
30:
31: prf(fmt, &x1);
32: }
33:
34: prf(fmt, adx)
35: register char *fmt;
36: register u_int *adx;
37: {
38: register int b, c, i;
39: char *s;
40: int any;
41:
42: loop:
43: while ((c = *fmt++) != '%') {
44: if(c == '\0')
45: return;
46: putchar(c);
47: }
48: again:
49: c = *fmt++;
50: /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
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: for (i = 24; i >= 0; i -= 8)
70: if (c = (b >> i) & 0x7f)
71: putchar(c);
72: break;
73: case 'b':
74: b = *adx++;
75: s = (char *)*adx;
76: printn((u_long)b, *s++);
77: any = 0;
78: if (b) {
79: putchar('<');
80: while (i = *s++) {
81: if (b & (1 << (i-1))) {
82: if (any)
83: putchar(',');
84: any = 1;
85: for (; (c = *s) > 32; s++)
86: putchar(c);
87: } else
88: for (; *s > 32; s++)
89: ;
90: }
91: putchar('>');
92: }
93: break;
94:
95: case 's':
96: s = (char *)*adx;
97: while (c = *s++)
98: putchar(c);
99: break;
100: }
101: adx++;
102: goto loop;
103: }
104:
105: /*
106: * Printn prints a number n in base b.
107: * We don't use recursion to avoid deep kernel stacks.
108: */
109: printn(n, b)
110: u_long n;
111: {
112: char prbuf[11];
113: register char *cp;
114:
115: if (b == 10 && (int)n < 0) {
116: putchar('-');
117: n = (unsigned)(-(int)n);
118: }
119: cp = prbuf;
120: do {
121: *cp++ = "0123456789abcdef"[n%b];
122: n /= b;
123: } while (n);
124: do
125: putchar(*--cp);
126: while (cp > prbuf);
127: }
128:
129: /*
130: * Print a character on console.
131: * Attempts to save and restore device
132: * status.
133: *
134: * Whether or not printing is inhibited,
135: * the last MSGBUFS characters
136: * are saved in msgbuf for inspection later.
137: */
138: putchar(c)
139: register c;
140: {
141: register s, timo;
142:
143: timo = 30000;
144: /*
145: * Try waiting for the console tty to come ready,
146: * otherwise give up after a reasonable time.
147: */
148: while((mfpr(TXCS)&TXCS_RDY) == 0)
149: if(--timo == 0)
150: break;
151: if(c == 0)
152: return;
153: s = mfpr(TXCS);
154: mtpr(TXCS,0);
155: mtpr(TXDB, c&0xff);
156: if(c == '\n')
157: putchar('\r');
158: putchar(0);
159: mtpr(TXCS, s);
160: }
161:
162: getchar()
163: {
164: register c;
165:
166: while((mfpr(RXCS)&RXCS_DONE) == 0)
167: ;
168: c = mfpr(RXDB)&0177;
169: if (c=='\r')
170: c = '\n';
171: putchar(c);
172: return(c);
173: }
174:
175: gets(buf)
176: char *buf;
177: {
178: register char *lp;
179: register c;
180:
181: lp = buf;
182: for (;;) {
183: c = getchar() & 0177;
184: store:
185: switch(c) {
186: case '\n':
187: case '\r':
188: c = '\n';
189: *lp++ = '\0';
190: return;
191: case '\b':
192: case '#':
193: lp--;
194: if (lp < buf)
195: lp = buf;
196: continue;
197: case '@':
198: case 'u'&037:
199: lp = buf;
200: putchar('\n');
201: continue;
202: default:
203: *lp++ = c;
204: }
205: }
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.