From: Ken Thompson Date: Mon, 14 May 1979 03:23:29 +0000 (-0500) Subject: Research V7 development X-Git-Tag: Research-V7~34 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/9a2a2041cf03e9cae91519b56516c45db0ff643b Research V7 development Work on file usr/sys/sys/prf.c Synthesized-from: v7 --- diff --git a/usr/sys/sys/prf.c b/usr/sys/sys/prf.c new file mode 100644 index 0000000000..4ba9863e9a --- /dev/null +++ b/usr/sys/sys/prf.c @@ -0,0 +1,116 @@ +#include "../h/param.h" +#include "../h/systm.h" +#include "../h/seg.h" +#include "../h/buf.h" +#include "../h/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 %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. + */ +/* VARARGS 1 */ +printf(fmt, x1) +register char *fmt; +unsigned x1; +{ + register c; + register unsigned int *adx; + char *s; + + 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 == '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; +} + +/* + * Print an unsigned integer in base b. + */ +printn(n, b) +long n; +{ + register long a; + + if (n<0) { /* shouldn't happen */ + putchar('-'); + n = -n; + } + if(a = n/b) + printn(a, b); + putchar("0123456789ABCDEF"[(int)(n%b)]); +} + +/* + * Panic is called on unresolvable + * fatal errors. + * It syncs, prints "panic: mesg" and + * then loops. + */ +panic(s) +char *s; +{ + panicstr = s; + update(); + printf("panic: %s\n", s); + for(;;) + idle(); +} + +/* + * prdev prints a warning message of the + * form "mesg on dev x/y". + * x and y are the major and minor parts of + * the device argument. + */ +prdev(str, dev) +char *str; +dev_t dev; +{ + + printf("%s on dev %u/%u\n", str, major(dev), minor(dev)); +} + +/* + * deverr prints a diagnostic from + * a device driver. + * It prints the device, block number, + * and an octal word (usually some error + * status register) passed as argument. + */ +deverror(bp, o1, o2) +register struct buf *bp; +{ + + prdev("err", bp->b_dev); + printf("bn=%D er=%o,%o\n", bp->b_blkno, o1, o2); +}