141081Swilliam /*- 241081Swilliam * Copyright (c) 1990 The Regents of the University of California. 341081Swilliam * All rights reserved. 441081Swilliam * 541081Swilliam * This code is derived from software contributed to Berkeley by 641081Swilliam * William Jolitz. 741081Swilliam * 8*48823Swilliam * %sccs.include.redist.c% 941081Swilliam * 10*48823Swilliam * @(#)prf.c 7.3 (Berkeley) 04/28/91 1141081Swilliam */ 1241081Swilliam 1348822Swilliam #include "types.h" 1441081Swilliam 1548822Swilliam 1641081Swilliam /* 1741081Swilliam * Scaled down version of C Library printf. 1841081Swilliam * Used to print diagnostic information directly on console tty. 1941081Swilliam * 2041081Swilliam * One additional format: %b is supported to decode error registers. 2141081Swilliam * Usage is: 2241081Swilliam * printf("reg=%b\n", regval, "<base><arg>*"); 2341081Swilliam * Where <base> is the output base expressed as a control character, 2441081Swilliam * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of 2541081Swilliam * characters, the first of which gives the bit number to be inspected 2641081Swilliam * (origin 1), and the next characters (up to a control character, i.e. 2741081Swilliam * a character <= 32), give the name of the register. Thus 2841081Swilliam * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); 2941081Swilliam * would produce output: 3041081Swilliam * reg=3<BITTWO,BITONE> 3141081Swilliam */ 3241081Swilliam /*VARARGS1*/ 3341081Swilliam printf(fmt, x1) 3441081Swilliam char *fmt; 3541081Swilliam unsigned x1; 3641081Swilliam { 3741081Swilliam 3841081Swilliam prf(fmt, &x1); 3941081Swilliam } 4041081Swilliam 4141081Swilliam prf(fmt, adx) 4241081Swilliam register char *fmt; 4341081Swilliam register *adx; 4441081Swilliam { 4541081Swilliam register int b, c, i; 4641081Swilliam char *s, sep; 4741081Swilliam 4841081Swilliam loop: 4941081Swilliam while ((c = *fmt++) != '%') { 5041081Swilliam if(c == '\0') 5141081Swilliam return; 5241081Swilliam putchar(c); 5341081Swilliam } 5441081Swilliam again: 5541081Swilliam c = *fmt++; 5641081Swilliam switch (c) { 5741081Swilliam 5841081Swilliam case 'l': 5941081Swilliam goto again; 6041081Swilliam case 'x': case 'X': 6141081Swilliam b = 16; 6241081Swilliam goto number; 6341081Swilliam case 'd': case 'D': 6441081Swilliam case 'u': /* what a joke */ 6541081Swilliam b = 10; 6641081Swilliam goto number; 6741081Swilliam case 'o': case 'O': 6841081Swilliam b = 8; 6941081Swilliam number: 7041081Swilliam printn((u_long)*adx, b); 7141081Swilliam break; 7241081Swilliam case 'c': 7341081Swilliam b = *adx; 7441081Swilliam for (i = 24; i >= 0; i -= 8) 7541081Swilliam if (c = (b >> i) & 0x7f) 7641081Swilliam putchar(c); 7741081Swilliam break; 7848822Swilliam #ifdef notyet 7941081Swilliam case 'b': 8041081Swilliam b = *adx++; 8141081Swilliam s = (char *)*adx; 8241081Swilliam printn((u_long)b, *s++); 8341081Swilliam if (b) { 8441081Swilliam sep = '<'; 8541081Swilliam while (i = *s++) { 8641081Swilliam if (b & (1 << (i-1))) { 8741081Swilliam putchar(sep); 8841081Swilliam sep = ','; 8941081Swilliam for (; (c = *s) > 32; s++) 9041081Swilliam putchar(c); 9141081Swilliam } else 9241081Swilliam for (; *s > 32; s++) 9341081Swilliam ; 9441081Swilliam } 9541081Swilliam if (sep != '<') 9641081Swilliam putchar('>'); 9741081Swilliam } 9841081Swilliam break; 9941081Swilliam #endif 10041081Swilliam 10141081Swilliam case 's': 10241081Swilliam s = (char *)*adx; 10341081Swilliam while (c = *s++) 10441081Swilliam putchar(c); 10541081Swilliam break; 10641081Swilliam } 10741081Swilliam adx++; 10841081Swilliam goto loop; 10941081Swilliam } 11041081Swilliam 11141081Swilliam /* 11241081Swilliam * Printn prints a number n in base b. 11341081Swilliam * We don't use recursion to avoid deep kernel stacks. 11441081Swilliam */ 11541081Swilliam printn(n, b) 11641081Swilliam u_long n; 11741081Swilliam { 11841081Swilliam char prbuf[11]; 11941081Swilliam register char *cp; 12041081Swilliam 12141081Swilliam if (b == 10 && (int)n < 0) { 12241081Swilliam putchar('-'); 12341081Swilliam n = (unsigned)(-(int)n); 12441081Swilliam } 12541081Swilliam cp = prbuf; 12641081Swilliam do { 12741081Swilliam *cp++ = "0123456789abcdef"[n%b]; 12841081Swilliam n /= b; 12941081Swilliam } while (n); 13041081Swilliam do 13141081Swilliam putchar(*--cp); 13241081Swilliam while (cp > prbuf); 13341081Swilliam } 13441081Swilliam 13541081Swilliam putchar(c) 13641081Swilliam char c; 13741081Swilliam { 13848822Swilliam if (c == '\n') 13948822Swilliam sput('\r'); 14041081Swilliam sput(c); 14141081Swilliam return(0); 14241081Swilliam } 14341081Swilliam 14441081Swilliam wait(n) { while(n--) ; } 145