xref: /csrg-svn/sys/i386/stand/prf.c (revision 41081)
1*41081Swilliam /*-
2*41081Swilliam  * Copyright (c) 1990 The Regents of the University of California.
3*41081Swilliam  * All rights reserved.
4*41081Swilliam  *
5*41081Swilliam  * This code is derived from software contributed to Berkeley by
6*41081Swilliam  * William Jolitz.
7*41081Swilliam  *
8*41081Swilliam  * %sccs.include.noredist.c%
9*41081Swilliam  *
10*41081Swilliam  *	@(#)prf.c	7.1 (Berkeley) 04/24/90
11*41081Swilliam  */
12*41081Swilliam 
13*41081Swilliam #include <sys/types.h>
14*41081Swilliam 
15*41081Swilliam /*
16*41081Swilliam  * Scaled down version of C Library printf.
17*41081Swilliam  * Used to print diagnostic information directly on console tty.
18*41081Swilliam  *
19*41081Swilliam  * One additional format: %b is supported to decode error registers.
20*41081Swilliam  * Usage is:
21*41081Swilliam  *	printf("reg=%b\n", regval, "<base><arg>*");
22*41081Swilliam  * Where <base> is the output base expressed as a control character,
23*41081Swilliam  * e.g. \10 gives octal; \20 gives hex.  Each arg is a sequence of
24*41081Swilliam  * characters, the first of which gives the bit number to be inspected
25*41081Swilliam  * (origin 1), and the next characters (up to a control character, i.e.
26*41081Swilliam  * a character <= 32), give the name of the register.  Thus
27*41081Swilliam  *	printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
28*41081Swilliam  * would produce output:
29*41081Swilliam  *	reg=3<BITTWO,BITONE>
30*41081Swilliam  */
31*41081Swilliam /*VARARGS1*/
32*41081Swilliam printf(fmt, x1)
33*41081Swilliam 	char *fmt;
34*41081Swilliam 	unsigned x1;
35*41081Swilliam {
36*41081Swilliam 
37*41081Swilliam 	prf(fmt, &x1);
38*41081Swilliam }
39*41081Swilliam 
40*41081Swilliam prf(fmt, adx)
41*41081Swilliam 	register char *fmt;
42*41081Swilliam 	register *adx;
43*41081Swilliam {
44*41081Swilliam 	register int b, c, i;
45*41081Swilliam 	char *s, sep;
46*41081Swilliam 
47*41081Swilliam loop:
48*41081Swilliam 	while ((c = *fmt++) != '%') {
49*41081Swilliam 		if(c == '\0')
50*41081Swilliam 			return;
51*41081Swilliam 		putchar(c);
52*41081Swilliam 	}
53*41081Swilliam again:
54*41081Swilliam 	c = *fmt++;
55*41081Swilliam 	/*
56*41081Swilliam 	 * THIS CODE IS BYTE-ORDER DEPENDENT IN HANDLING %c
57*41081Swilliam 	 * AND IGNORES SHORT/LONG DISTINCTIONS.
58*41081Swilliam 	 */
59*41081Swilliam 	switch (c) {
60*41081Swilliam 
61*41081Swilliam 	case 'l':
62*41081Swilliam 		goto again;
63*41081Swilliam 	case 'x': case 'X':
64*41081Swilliam 		b = 16;
65*41081Swilliam 		goto number;
66*41081Swilliam 	case 'd': case 'D':
67*41081Swilliam 	case 'u':		/* what a joke */
68*41081Swilliam 		b = 10;
69*41081Swilliam 		goto number;
70*41081Swilliam 	case 'o': case 'O':
71*41081Swilliam 		b = 8;
72*41081Swilliam number:
73*41081Swilliam 		printn((u_long)*adx, b);
74*41081Swilliam 		break;
75*41081Swilliam 	case 'c':
76*41081Swilliam 		b = *adx;
77*41081Swilliam 		for (i = 24; i >= 0; i -= 8)
78*41081Swilliam 			if (c = (b >> i) & 0x7f)
79*41081Swilliam 				putchar(c);
80*41081Swilliam 		break;
81*41081Swilliam #ifndef notyet
82*41081Swilliam 	case 'b':
83*41081Swilliam 		b = *adx++;
84*41081Swilliam 		s = (char *)*adx;
85*41081Swilliam 		printn((u_long)b, *s++);
86*41081Swilliam 		if (b) {
87*41081Swilliam 			sep = '<';
88*41081Swilliam 			while (i = *s++) {
89*41081Swilliam 				if (b & (1 << (i-1))) {
90*41081Swilliam 					putchar(sep);
91*41081Swilliam 					sep = ',';
92*41081Swilliam 					for (; (c = *s) > 32; s++)
93*41081Swilliam 						putchar(c);
94*41081Swilliam 				} else
95*41081Swilliam 					for (; *s > 32; s++)
96*41081Swilliam 						;
97*41081Swilliam 			}
98*41081Swilliam 			if (sep != '<')
99*41081Swilliam 				putchar('>');
100*41081Swilliam 		}
101*41081Swilliam 		break;
102*41081Swilliam #endif
103*41081Swilliam 
104*41081Swilliam 	case 's':
105*41081Swilliam 		s = (char *)*adx;
106*41081Swilliam 		while (c = *s++)
107*41081Swilliam 			putchar(c);
108*41081Swilliam 		break;
109*41081Swilliam 	}
110*41081Swilliam 	adx++;
111*41081Swilliam 	goto loop;
112*41081Swilliam }
113*41081Swilliam 
114*41081Swilliam /*
115*41081Swilliam  * Printn prints a number n in base b.
116*41081Swilliam  * We don't use recursion to avoid deep kernel stacks.
117*41081Swilliam  */
118*41081Swilliam printn(n, b)
119*41081Swilliam 	u_long n;
120*41081Swilliam {
121*41081Swilliam 	char prbuf[11];
122*41081Swilliam 	register char *cp;
123*41081Swilliam 
124*41081Swilliam 	if (b == 10 && (int)n < 0) {
125*41081Swilliam 		putchar('-');
126*41081Swilliam 		n = (unsigned)(-(int)n);
127*41081Swilliam 	}
128*41081Swilliam 	cp = prbuf;
129*41081Swilliam 	do {
130*41081Swilliam 		*cp++ = "0123456789abcdef"[n%b];
131*41081Swilliam 		n /= b;
132*41081Swilliam 	} while (n);
133*41081Swilliam 	do
134*41081Swilliam 		putchar(*--cp);
135*41081Swilliam 	while (cp > prbuf);
136*41081Swilliam }
137*41081Swilliam 
138*41081Swilliam #define lf	10
139*41081Swilliam #define cr	13
140*41081Swilliam 
141*41081Swilliam putchar(c)
142*41081Swilliam char c;
143*41081Swilliam {
144*41081Swilliam         if (c == lf)
145*41081Swilliam {
146*41081Swilliam 		sput(cr);
147*41081Swilliam wait(60000);
148*41081Swilliam }
149*41081Swilliam 	sput(c);
150*41081Swilliam 	return(0);
151*41081Swilliam }
152*41081Swilliam 
153*41081Swilliam wait(n) { while(n--) ; }
154