📄 prf.c
字号:
/* * @(#)prf.c 1.1 92/07/30 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -