xref: /csrg-svn/sys/luna68k/dev/dbgprf.c (revision 53998)
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