/* @(#)prf.c 1.2 */ #include "sys/param.h" #include "sys/types.h" #include "sys/sysmacros.h" #include "sys/systm.h" #include "sys/buf.h" #include "sys/conf.h" /* * In case console is off, * panicstr contains argument to last call to panic. */ char *panicstr; /* * Scaled down version of C Library printf. * Only %c %s %u %d (==%u) %o %x %D are recognized. * Used to print diagnostic information * directly on console tty. * Since it is not interrupt driven, * all system activities are pretty much suspended. * Printf should not be used for chit-chat. */ /* VARARGS1 */ printf(fmt, x1) register char *fmt; unsigned x1; { register c; register unsigned int *adx; register int b, i, any; char *s; #ifdef PRINTFSTALL for (c = 0; c < PRINTFSTALL; c++) ; #endif PRINTFSTALL adx = &x1; loop: while((c = *fmt++) != '%') { if(c == '\0') return; (*putchar)(c); } c = *fmt++; if(c == 'd' || c == 'u' || c == 'o' || c == 'x') printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); else if(c == 'c') (*putchar)(*adx); else if (c == 'b') { b = *adx++; s = (char *) *adx; printn((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++) ; } if (any) (*putchar)('>'); } } else if(c == 's') { s = (char *)*adx; while(c = *s++) (*putchar)(c); } else if (c == 'D') { printn(*(long *)adx, 10); adx += (sizeof(long) / sizeof(int)) - 1; } adx++; goto loop; } printn(n, b) long n; register b; { register i, nd, c; int flag; int plmax; char d[12]; c = 1; flag = n < 0; if (flag) n = (-n); if (b==8) plmax = 11; else if (b==10) plmax = 10; else if (b==16) plmax = 8; if (flag && b==10) { flag = 0; (*putchar)('-'); } for (i=0;i= b) { nd -= b; c = 1; } else c = 0; } d[i] = nd; n = n/b; if ((n==0) && (flag==0)) break; } if (i==plmax) i--; for (;i>=0;i--) { (*putchar)("0123456789ABCDEF"[d[i]]); } } /* * Panic is called on unresolvable fatal errors. * It syncs, prints "panic: mesg" and then loops. */ panic(s) char *s; { if (s && panicstr) printf("Double panic: %s\n", s); else { if (s) panicstr = s; update(); printf("panic: %s\n", panicstr?panicstr:"???"); } for(;;) idle(); } /* * prdev prints a warning message. * dev is a block special device argument. */ prdev(str, dev) char *str; dev_t dev; { register maj; maj = bmajor(dev); if (maj >= bdevcnt) { printf("%s on bad dev %o(8)\n", str, dev); return; } (*bdevsw[maj].d_print)(minor(dev), str); } /* * prcom prints a diagnostic from a device driver. * prt is device dependent print routine. */ prcom(prt, bp, er1, er2) int (*prt)(); register struct buf *bp; { (*prt)(bp->b_dev, "\nDevice error"); printf("bn = %D er = %o,%o\n", bp->b_blkno, er1, er2); }