1*41081Swilliam /*- 2*41081Swilliam * Copyright (c) 1990 The Regents of the University of California. 3*41081Swilliam * All rights reserved. 4*41081Swilliam * 5*41081Swilliam * This code is derived from software contributed to Berkeley by 6*41081Swilliam * William Jolitz. 7*41081Swilliam * 8*41081Swilliam * %sccs.include.noredist.c% 9*41081Swilliam * 10*41081Swilliam * @(#)prf.c 7.1 (Berkeley) 04/24/90 11*41081Swilliam */ 12*41081Swilliam 13*41081Swilliam #include <sys/types.h> 14*41081Swilliam 15*41081Swilliam /* 16*41081Swilliam * Scaled down version of C Library printf. 17*41081Swilliam * Used to print diagnostic information directly on console tty. 18*41081Swilliam * 19*41081Swilliam * One additional format: %b is supported to decode error registers. 20*41081Swilliam * Usage is: 21*41081Swilliam * printf("reg=%b\n", regval, "<base><arg>*"); 22*41081Swilliam * Where <base> is the output base expressed as a control character, 23*41081Swilliam * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of 24*41081Swilliam * characters, the first of which gives the bit number to be inspected 25*41081Swilliam * (origin 1), and the next characters (up to a control character, i.e. 26*41081Swilliam * a character <= 32), give the name of the register. Thus 27*41081Swilliam * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); 28*41081Swilliam * would produce output: 29*41081Swilliam * reg=3<BITTWO,BITONE> 30*41081Swilliam */ 31*41081Swilliam /*VARARGS1*/ 32*41081Swilliam printf(fmt, x1) 33*41081Swilliam char *fmt; 34*41081Swilliam unsigned x1; 35*41081Swilliam { 36*41081Swilliam 37*41081Swilliam prf(fmt, &x1); 38*41081Swilliam } 39*41081Swilliam 40*41081Swilliam prf(fmt, adx) 41*41081Swilliam register char *fmt; 42*41081Swilliam register *adx; 43*41081Swilliam { 44*41081Swilliam register int b, c, i; 45*41081Swilliam char *s, sep; 46*41081Swilliam 47*41081Swilliam loop: 48*41081Swilliam while ((c = *fmt++) != '%') { 49*41081Swilliam if(c == '\0') 50*41081Swilliam return; 51*41081Swilliam putchar(c); 52*41081Swilliam } 53*41081Swilliam again: 54*41081Swilliam c = *fmt++; 55*41081Swilliam /* 56*41081Swilliam * THIS CODE IS BYTE-ORDER DEPENDENT IN HANDLING %c 57*41081Swilliam * AND IGNORES SHORT/LONG DISTINCTIONS. 58*41081Swilliam */ 59*41081Swilliam switch (c) { 60*41081Swilliam 61*41081Swilliam case 'l': 62*41081Swilliam goto again; 63*41081Swilliam case 'x': case 'X': 64*41081Swilliam b = 16; 65*41081Swilliam goto number; 66*41081Swilliam case 'd': case 'D': 67*41081Swilliam case 'u': /* what a joke */ 68*41081Swilliam b = 10; 69*41081Swilliam goto number; 70*41081Swilliam case 'o': case 'O': 71*41081Swilliam b = 8; 72*41081Swilliam number: 73*41081Swilliam printn((u_long)*adx, b); 74*41081Swilliam break; 75*41081Swilliam case 'c': 76*41081Swilliam b = *adx; 77*41081Swilliam for (i = 24; i >= 0; i -= 8) 78*41081Swilliam if (c = (b >> i) & 0x7f) 79*41081Swilliam putchar(c); 80*41081Swilliam break; 81*41081Swilliam #ifndef notyet 82*41081Swilliam case 'b': 83*41081Swilliam b = *adx++; 84*41081Swilliam s = (char *)*adx; 85*41081Swilliam printn((u_long)b, *s++); 86*41081Swilliam if (b) { 87*41081Swilliam sep = '<'; 88*41081Swilliam while (i = *s++) { 89*41081Swilliam if (b & (1 << (i-1))) { 90*41081Swilliam putchar(sep); 91*41081Swilliam sep = ','; 92*41081Swilliam for (; (c = *s) > 32; s++) 93*41081Swilliam putchar(c); 94*41081Swilliam } else 95*41081Swilliam for (; *s > 32; s++) 96*41081Swilliam ; 97*41081Swilliam } 98*41081Swilliam if (sep != '<') 99*41081Swilliam putchar('>'); 100*41081Swilliam } 101*41081Swilliam break; 102*41081Swilliam #endif 103*41081Swilliam 104*41081Swilliam case 's': 105*41081Swilliam s = (char *)*adx; 106*41081Swilliam while (c = *s++) 107*41081Swilliam putchar(c); 108*41081Swilliam break; 109*41081Swilliam } 110*41081Swilliam adx++; 111*41081Swilliam goto loop; 112*41081Swilliam } 113*41081Swilliam 114*41081Swilliam /* 115*41081Swilliam * Printn prints a number n in base b. 116*41081Swilliam * We don't use recursion to avoid deep kernel stacks. 117*41081Swilliam */ 118*41081Swilliam printn(n, b) 119*41081Swilliam u_long n; 120*41081Swilliam { 121*41081Swilliam char prbuf[11]; 122*41081Swilliam register char *cp; 123*41081Swilliam 124*41081Swilliam if (b == 10 && (int)n < 0) { 125*41081Swilliam putchar('-'); 126*41081Swilliam n = (unsigned)(-(int)n); 127*41081Swilliam } 128*41081Swilliam cp = prbuf; 129*41081Swilliam do { 130*41081Swilliam *cp++ = "0123456789abcdef"[n%b]; 131*41081Swilliam n /= b; 132*41081Swilliam } while (n); 133*41081Swilliam do 134*41081Swilliam putchar(*--cp); 135*41081Swilliam while (cp > prbuf); 136*41081Swilliam } 137*41081Swilliam 138*41081Swilliam #define lf 10 139*41081Swilliam #define cr 13 140*41081Swilliam 141*41081Swilliam putchar(c) 142*41081Swilliam char c; 143*41081Swilliam { 144*41081Swilliam if (c == lf) 145*41081Swilliam { 146*41081Swilliam sput(cr); 147*41081Swilliam wait(60000); 148*41081Swilliam } 149*41081Swilliam sput(c); 150*41081Swilliam return(0); 151*41081Swilliam } 152*41081Swilliam 153*41081Swilliam wait(n) { while(n--) ; } 154