V10/lsys/os/prf.c
#include "sys/param.h"
#include "sys/buf.h"
#include "sys/mtpr.h"
#include "sys/msgbuf.h"
#include "sys/user.h"
#include "sys/pte.h"
/*
* In case console is off,
* panicstr contains argument to last
* call to panic.
*/
char *panicstr;
/*
* 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.
*/
/*VARARGS1*/
printf(fmt, x1)
char *fmt;
unsigned x1;
{
prf(fmt, &x1, 0);
}
prf(fmt, adx, touser)
register char *fmt;
register u_int *adx;
{
register int b, c, i;
char *s;
int any;
loop:
while ((c = *fmt++) != '%') {
if(c == '\0')
return;
putchar(c, touser);
}
again:
c = *fmt++;
/* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
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, touser);
break;
case 'c':
b = *adx;
for (i = 24; i >= 0; i -= 8)
if (c = (b >> i) & 0x7f)
putchar(c, touser);
break;
case 'b':
b = *adx++;
s = (char *)*adx;
printn((u_long)b, *s++, touser);
any = 0;
if (b) {
putchar('<', touser);
while (i = *s++) {
if (b & (1 << (i-1))) {
if (any)
putchar(',', touser);
any = 1;
for (; (c = *s) > 32; s++)
putchar(c, touser);
} else
for (; *s > 32; s++)
;
}
if (any)
putchar('>', touser);
}
break;
case 's':
s = (char *)*adx;
while (c = *s++)
putchar(c, touser);
break;
case '%':
putchar('%', touser);
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, touser)
u_long n;
{
char prbuf[11];
register char *cp;
if (b == 10 && (int)n < 0) {
putchar('-', touser);
n = (unsigned)(-(int)n);
}
cp = prbuf;
do {
*cp++ = "0123456789abcdef"[n%b];
n /= b;
} while (n);
do
putchar(*--cp, touser);
while (cp > prbuf);
}
/*
* Panic is called on unresolvable fatal errors.
* print `panic: mesg' and boot
* reboot may call update if it seems safe
*/
panic(s)
char *s;
{
static int panicked = 0;
panicstr = s;
if (panicked++) {
printf("panic again: %s\n", s);
reboot(0); /* no sync, so probably won't reenter again */
}
printf("panic: %s\n", s);
reboot(1);
}
/*
* Warn that a system table is full.
*/
tablefull(tab)
char *tab;
{
printf("%s: table is full\n", tab);
}
/*
* Hard error is the preface to plaintive error messages
* about failing disk transfers.
* this is hopeless; the driver should do it.
* the magic constant 07 shows why.
*/
harderr(bp, cp)
struct buf *bp;
char *cp;
{
printf("%s%d%o: hard error sn%d ", cp,
dkunit(bp), minor(bp->b_dev)&07, bp->b_blkno);
}
struct pte *msgbufmap;
struct msgbuf *msgbuf;
/*
* Print a character on console or users terminal.
* If destination is console then the last MSGBUFS characters
* are saved in msgbuf for inspection later.
*/
/*ARGSUSED*/
putchar(c, touser)
register int c;
{
if (touser) {
/* put them on user's stdout instead */
return;
}
if (c != '\0' && c != '\r' && c != 0177 && mfpr(MAPEN)) {
if (msgbuf->msg_magic != MSG_MAGIC) {
msgbuf->msg_bufx = 0;
msgbuf->msg_magic = MSG_MAGIC;
}
if (msgbuf->msg_bufx < 0 || msgbuf->msg_bufx >= MSG_BSIZE)
msgbuf->msg_bufx = 0;
msgbuf->msg_bufc[msgbuf->msg_bufx++] = c;
}
if (c == 0)
return;
cnputc(c);
}