Files
Arquivotheca.SunOS-4.1.4/sys/boot/lib/common/prf.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

137 lines
2.4 KiB
C

/*
* @(#)prf.c 1.1 94/10/31 Copyright (c) 1985 by Sun Microsystems, Inc.
*/
#include <sys/types.h>
#include <mon/sunromvec.h>
/*
* Scaled down version of C Library printf.
* Used to print diagnostic information directly on console tty.
* Since it is not interrupt driven, all system activities are
* suspended. Printf should not be used for chit-chat.
*
* One additional format: %b is supported to decode error registers.
* Usage is:
* printf("reg=%b\n", regval, "<base><arg>*");
* Where <base> is the output base expressed as a control character,
* e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of
* characters, the first of which gives the bit number to be inspected
* (origin 1), and the next characters (up to a control character, i.e.
* a character <= 32), give the name of the register. Thus
* printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
* would produce output:
* reg=2<BITTWO,BITONE>
*/
/*VARARGS1*/
printf(fmt, x1)
char *fmt;
unsigned x1;
{
prf(fmt, &x1);
}
prf(fmt, adx)
register char *fmt;
register u_int *adx;
{
register int b, c, i;
register char *s;
register int any;
loop:
while ((c = *fmt++) != '%') {
if(c == '\0')
return;
putchar(c);
}
again:
c = *fmt++;
switch (c) {
case 'l':
goto again;
case 'x': case 'X':
b = 16;
goto number;
case 'd': case 'D':
case 'u': /* what a joke */
b = 10;
goto number;
case 'o': case 'O':
b = 8;
number:
printn((u_long)*adx, b);
break;
case 'c':
b = *adx;
putchar(b);
break;
case 'b':
b = *adx++;
s = (char *)*adx;
printn((u_long)b, *s++);
any = 0;
if (b) {
putchar('<');
while (i = *s++) {
if (b & (1 << (i-1))) {
if (any)
putchar(',');
any = 1;
for (; (c = *s) > 32; s++)
putchar(c);
} else
for (; *s > 32; s++)
;
}
putchar('>');
}
break;
case 's':
s = (char *)*adx;
while (c = *s++)
putchar(c);
break;
}
adx++;
goto loop;
}
/*
* Printn prints a number n in base b.
* We don't use recursion to avoid deep kernel stacks.
*/
printn(n, b)
register u_long n;
register short b;
{
char prbuf[11];
register char *cp;
if (b == 10 && (int)n < 0) {
putchar('-');
n = (unsigned)(-(int)n);
}
cp = prbuf;
do {
*cp++ = "0123456789abcdef"[n%b];
n /= b;
} while (n);
do
putchar(*--cp);
while (cp > prbuf);
}
/*
* Print a character on console.
*/
putchar(c)
int c;
{
(*romp->v_putchar)(c);
}