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

113 lines
1.6 KiB
C

/* @(#)prom_printf.c 1.1 94/10/31 SMI */
/*
* Copyright (c) 1990 by Sun Microsystems, Inc.
*/
#include <promcommon.h>
#include <sys/varargs.h>
extern void prom_putchar();
/*VARARGS1*/
prom_printf(fmt, va_alist)
char *fmt;
va_dcl
{
va_list adx;
register int b, c, i, width;
register char *s;
void prom_printn();
va_start(adx);
loop:
width = 0;
while ((c = *fmt++) != '%') {
if (c == '\0')
goto out;
if (c == '\n')
prom_putchar('\r');
prom_putchar(c);
}
again:
c = *fmt++;
if (c >= '2' && c <= '9') {
width = c - '0';
c = *fmt++;
}
switch (c) {
case 'l':
goto again;
case 'x':
case 'X':
b = 16;
goto number;
case 'd':
case 'D':
case 'u':
b = 10;
goto number;
case 'o':
case 'O':
b = 8;
number:
prom_printn(va_arg(adx, u_long), b, width);
break;
case 'c':
b = va_arg(adx, int);
for (i = 24; i >= 0; i -= 8)
if (c = (b >> i) & 0x7f) {
if (c == '\n')
prom_putchar('\r');
prom_putchar(c);
}
break;
case 's':
s = va_arg(adx, char*);
while (c = *s++) {
if (c == '\n')
prom_putchar('\r');
prom_putchar(c);
}
break;
case '%':
prom_putchar('%');
break;
}
goto loop;
out:
va_end(x1);
}
/*
* Printn prints a number n in base b.
* We don't use recursion to avoid deep kernel stacks.
*/
void
prom_printn(n, b, width)
u_long n;
int b, width;
{
char prbuf[40];
register char *cp;
if (b == 10 && (int)n < 0) {
prom_putchar('-');
n = (unsigned)(-(int)n);
}
cp = prbuf;
do {
*cp++ = "0123456789abcdef"[n%b];
n /= b;
width--;
} while (n);
while (width-- > 0)
*cp++ = '0';
do {
prom_putchar(*--cp);
} while (cp > prbuf);
}