1*53998Sfujita /* 2*53998Sfujita * Copyright (c) 1992 OMRON Corporation. 3*53998Sfujita * Copyright (c) 1992 The Regents of the University of California. 4*53998Sfujita * All rights reserved. 5*53998Sfujita * 6*53998Sfujita * This code is derived from software contributed to Berkeley by 7*53998Sfujita * OMRON Corporation. 8*53998Sfujita * 9*53998Sfujita * %sccs.include.redist.c% 10*53998Sfujita * 11*53998Sfujita * @(#)dbgprf.c 7.1 (Berkeley) 06/15/92 12*53998Sfujita */ 13*53998Sfujita 14*53998Sfujita /* 15*53998Sfujita * dbgprf.c -- batched printf for device driver debugging 16*53998Sfujita * by A.Fujita, May-3-1992 17*53998Sfujita */ 18*53998Sfujita 19*53998Sfujita #ifdef DEBUGPRINT 20*53998Sfujita 21*53998Sfujita #include "sys/param.h" 22*53998Sfujita #include "sys/systm.h" 23*53998Sfujita 24*53998Sfujita #include "machine/stdarg.h" 25*53998Sfujita 26*53998Sfujita static char *sprintn __P((u_long num, int base, int *len)); 27*53998Sfujita 28*53998Sfujita #define DBG_LINES 80 29*53998Sfujita #define DBG_BUFS 300 30*53998Sfujita 31*53998Sfujita struct dbgprf { 32*53998Sfujita struct dbgprf *dbg_forw; 33*53998Sfujita struct dbgprf *dbg_back; 34*53998Sfujita char dbg_buf[DBG_LINES]; 35*53998Sfujita }; 36*53998Sfujita 37*53998Sfujita struct dbgprf dbgprf[DBG_BUFS]; 38*53998Sfujita 39*53998Sfujita struct dbgprf dbgroot = { 40*53998Sfujita &dbgroot, 41*53998Sfujita &dbgroot, 42*53998Sfujita }; 43*53998Sfujita 44*53998Sfujita int dbg_used = 0; 45*53998Sfujita 46*53998Sfujita void 47*53998Sfujita dbgprintall() 48*53998Sfujita { 49*53998Sfujita register struct dbgprf *dbgp; 50*53998Sfujita 51*53998Sfujita for (dbgp = dbgroot.dbg_forw; dbgp != &dbgroot; dbgp = dbgp->dbg_forw) { 52*53998Sfujita printf("%s", dbgp->dbg_buf); 53*53998Sfujita } 54*53998Sfujita } 55*53998Sfujita 56*53998Sfujita void 57*53998Sfujita #ifdef __STDC__ 58*53998Sfujita dbgprintf(const char *cfmt, ...) 59*53998Sfujita #else 60*53998Sfujita dbgprintf(cfmt /*, va_alist */) 61*53998Sfujita char *cfmt; 62*53998Sfujita #endif 63*53998Sfujita { 64*53998Sfujita register struct dbgprf *dbgp; 65*53998Sfujita register const char *fmt = cfmt; 66*53998Sfujita register char *p, *bp; 67*53998Sfujita register int ch, base; 68*53998Sfujita u_long ul; 69*53998Sfujita int lflag; 70*53998Sfujita va_list ap; 71*53998Sfujita 72*53998Sfujita if (dbg_used < DBG_BUFS) { 73*53998Sfujita dbgp = &dbgprf[dbg_used++]; 74*53998Sfujita } else { 75*53998Sfujita dbgp = dbgroot.dbg_forw; 76*53998Sfujita remque(dbgp); 77*53998Sfujita } 78*53998Sfujita 79*53998Sfujita va_start(ap, cfmt); 80*53998Sfujita for (bp = dbgp->dbg_buf; ; ) { 81*53998Sfujita while ((ch = *(u_char *)fmt++) != '%') 82*53998Sfujita if ((*bp++ = ch) == '\0') 83*53998Sfujita goto done; 84*53998Sfujita 85*53998Sfujita lflag = 0; 86*53998Sfujita reswitch: switch (ch = *(u_char *)fmt++) { 87*53998Sfujita case 'l': 88*53998Sfujita lflag = 1; 89*53998Sfujita goto reswitch; 90*53998Sfujita case 'c': 91*53998Sfujita *bp++ = va_arg(ap, int); 92*53998Sfujita break; 93*53998Sfujita case 's': 94*53998Sfujita p = va_arg(ap, char *); 95*53998Sfujita while (*bp++ = *p++) 96*53998Sfujita ; 97*53998Sfujita --bp; 98*53998Sfujita break; 99*53998Sfujita case 'd': 100*53998Sfujita ul = lflag ? va_arg(ap, long) : va_arg(ap, int); 101*53998Sfujita if ((long)ul < 0) { 102*53998Sfujita *bp++ = '-'; 103*53998Sfujita ul = -(long)ul; 104*53998Sfujita } 105*53998Sfujita base = 10; 106*53998Sfujita goto number; 107*53998Sfujita break; 108*53998Sfujita case 'o': 109*53998Sfujita ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int); 110*53998Sfujita base = 8; 111*53998Sfujita goto number; 112*53998Sfujita break; 113*53998Sfujita case 'u': 114*53998Sfujita ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int); 115*53998Sfujita base = 10; 116*53998Sfujita goto number; 117*53998Sfujita break; 118*53998Sfujita case 'x': 119*53998Sfujita ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int); 120*53998Sfujita base = 16; 121*53998Sfujita number: for (p = sprintn(ul, base, NULL); ch = *p--;) 122*53998Sfujita *bp++ = ch; 123*53998Sfujita break; 124*53998Sfujita default: 125*53998Sfujita *bp++ = '%'; 126*53998Sfujita if (lflag) 127*53998Sfujita *bp++ = 'l'; 128*53998Sfujita /* FALLTHROUGH */ 129*53998Sfujita case '%': 130*53998Sfujita *bp++ = ch; 131*53998Sfujita } 132*53998Sfujita } 133*53998Sfujita va_end(ap); 134*53998Sfujita 135*53998Sfujita done: 136*53998Sfujita insque(dbgp, dbgroot.dbg_back); 137*53998Sfujita 138*53998Sfujita /* printf("%s", dbgp->dbg_buf); */ 139*53998Sfujita } 140*53998Sfujita 141*53998Sfujita /* 142*53998Sfujita * Put a number (base <= 16) in a buffer in reverse order; return an 143*53998Sfujita * optional length and a pointer to the NULL terminated (preceded?) 144*53998Sfujita * buffer. 145*53998Sfujita */ 146*53998Sfujita static char * 147*53998Sfujita sprintn(ul, base, lenp) 148*53998Sfujita register u_long ul; 149*53998Sfujita register int base, *lenp; 150*53998Sfujita { /* A long in base 8, plus NULL. */ 151*53998Sfujita static char buf[sizeof(long) * NBBY / 3 + 2]; 152*53998Sfujita register char *p; 153*53998Sfujita 154*53998Sfujita p = buf; 155*53998Sfujita do { 156*53998Sfujita *++p = "0123456789abcdef"[ul % base]; 157*53998Sfujita } while (ul /= base); 158*53998Sfujita if (lenp) 159*53998Sfujita *lenp = p - buf; 160*53998Sfujita return (p); 161*53998Sfujita } 162*53998Sfujita #endif 163