xref: /csrg-svn/sys/i386/stand/prf.c (revision 48823)
141081Swilliam /*-
241081Swilliam  * Copyright (c) 1990 The Regents of the University of California.
341081Swilliam  * All rights reserved.
441081Swilliam  *
541081Swilliam  * This code is derived from software contributed to Berkeley by
641081Swilliam  * William Jolitz.
741081Swilliam  *
8*48823Swilliam  * %sccs.include.redist.c%
941081Swilliam  *
10*48823Swilliam  *	@(#)prf.c	7.3 (Berkeley) 04/28/91
1141081Swilliam  */
1241081Swilliam 
1348822Swilliam #include "types.h"
1441081Swilliam 
1548822Swilliam 
1641081Swilliam /*
1741081Swilliam  * Scaled down version of C Library printf.
1841081Swilliam  * Used to print diagnostic information directly on console tty.
1941081Swilliam  *
2041081Swilliam  * One additional format: %b is supported to decode error registers.
2141081Swilliam  * Usage is:
2241081Swilliam  *	printf("reg=%b\n", regval, "<base><arg>*");
2341081Swilliam  * Where <base> is the output base expressed as a control character,
2441081Swilliam  * e.g. \10 gives octal; \20 gives hex.  Each arg is a sequence of
2541081Swilliam  * characters, the first of which gives the bit number to be inspected
2641081Swilliam  * (origin 1), and the next characters (up to a control character, i.e.
2741081Swilliam  * a character <= 32), give the name of the register.  Thus
2841081Swilliam  *	printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
2941081Swilliam  * would produce output:
3041081Swilliam  *	reg=3<BITTWO,BITONE>
3141081Swilliam  */
3241081Swilliam /*VARARGS1*/
3341081Swilliam printf(fmt, x1)
3441081Swilliam 	char *fmt;
3541081Swilliam 	unsigned x1;
3641081Swilliam {
3741081Swilliam 
3841081Swilliam 	prf(fmt, &x1);
3941081Swilliam }
4041081Swilliam 
4141081Swilliam prf(fmt, adx)
4241081Swilliam 	register char *fmt;
4341081Swilliam 	register *adx;
4441081Swilliam {
4541081Swilliam 	register int b, c, i;
4641081Swilliam 	char *s, sep;
4741081Swilliam 
4841081Swilliam loop:
4941081Swilliam 	while ((c = *fmt++) != '%') {
5041081Swilliam 		if(c == '\0')
5141081Swilliam 			return;
5241081Swilliam 		putchar(c);
5341081Swilliam 	}
5441081Swilliam again:
5541081Swilliam 	c = *fmt++;
5641081Swilliam 	switch (c) {
5741081Swilliam 
5841081Swilliam 	case 'l':
5941081Swilliam 		goto again;
6041081Swilliam 	case 'x': case 'X':
6141081Swilliam 		b = 16;
6241081Swilliam 		goto number;
6341081Swilliam 	case 'd': case 'D':
6441081Swilliam 	case 'u':		/* what a joke */
6541081Swilliam 		b = 10;
6641081Swilliam 		goto number;
6741081Swilliam 	case 'o': case 'O':
6841081Swilliam 		b = 8;
6941081Swilliam number:
7041081Swilliam 		printn((u_long)*adx, b);
7141081Swilliam 		break;
7241081Swilliam 	case 'c':
7341081Swilliam 		b = *adx;
7441081Swilliam 		for (i = 24; i >= 0; i -= 8)
7541081Swilliam 			if (c = (b >> i) & 0x7f)
7641081Swilliam 				putchar(c);
7741081Swilliam 		break;
7848822Swilliam #ifdef notyet
7941081Swilliam 	case 'b':
8041081Swilliam 		b = *adx++;
8141081Swilliam 		s = (char *)*adx;
8241081Swilliam 		printn((u_long)b, *s++);
8341081Swilliam 		if (b) {
8441081Swilliam 			sep = '<';
8541081Swilliam 			while (i = *s++) {
8641081Swilliam 				if (b & (1 << (i-1))) {
8741081Swilliam 					putchar(sep);
8841081Swilliam 					sep = ',';
8941081Swilliam 					for (; (c = *s) > 32; s++)
9041081Swilliam 						putchar(c);
9141081Swilliam 				} else
9241081Swilliam 					for (; *s > 32; s++)
9341081Swilliam 						;
9441081Swilliam 			}
9541081Swilliam 			if (sep != '<')
9641081Swilliam 				putchar('>');
9741081Swilliam 		}
9841081Swilliam 		break;
9941081Swilliam #endif
10041081Swilliam 
10141081Swilliam 	case 's':
10241081Swilliam 		s = (char *)*adx;
10341081Swilliam 		while (c = *s++)
10441081Swilliam 			putchar(c);
10541081Swilliam 		break;
10641081Swilliam 	}
10741081Swilliam 	adx++;
10841081Swilliam 	goto loop;
10941081Swilliam }
11041081Swilliam 
11141081Swilliam /*
11241081Swilliam  * Printn prints a number n in base b.
11341081Swilliam  * We don't use recursion to avoid deep kernel stacks.
11441081Swilliam  */
11541081Swilliam printn(n, b)
11641081Swilliam 	u_long n;
11741081Swilliam {
11841081Swilliam 	char prbuf[11];
11941081Swilliam 	register char *cp;
12041081Swilliam 
12141081Swilliam 	if (b == 10 && (int)n < 0) {
12241081Swilliam 		putchar('-');
12341081Swilliam 		n = (unsigned)(-(int)n);
12441081Swilliam 	}
12541081Swilliam 	cp = prbuf;
12641081Swilliam 	do {
12741081Swilliam 		*cp++ = "0123456789abcdef"[n%b];
12841081Swilliam 		n /= b;
12941081Swilliam 	} while (n);
13041081Swilliam 	do
13141081Swilliam 		putchar(*--cp);
13241081Swilliam 	while (cp > prbuf);
13341081Swilliam }
13441081Swilliam 
13541081Swilliam putchar(c)
13641081Swilliam char c;
13741081Swilliam {
13848822Swilliam         if (c == '\n')
13948822Swilliam 		sput('\r');
14041081Swilliam 	sput(c);
14141081Swilliam 	return(0);
14241081Swilliam }
14341081Swilliam 
14441081Swilliam wait(n) { while(n--) ; }
145