xref: /freebsd/sys/ddb/db_output.c (revision 8a129caed5f1b834a2d3f825478f5f0273f9cb9d)
15b81b6b3SRodney W. Grimes /*
25b81b6b3SRodney W. Grimes  * Mach Operating System
35b81b6b3SRodney W. Grimes  * Copyright (c) 1991,1990 Carnegie Mellon University
45b81b6b3SRodney W. Grimes  * All Rights Reserved.
55b81b6b3SRodney W. Grimes  *
65b81b6b3SRodney W. Grimes  * Permission to use, copy, modify and distribute this software and its
75b81b6b3SRodney W. Grimes  * documentation is hereby granted, provided that both the copyright
85b81b6b3SRodney W. Grimes  * notice and this permission notice appear in all copies of the
95b81b6b3SRodney W. Grimes  * software, derivative works or modified versions, and any portions
105b81b6b3SRodney W. Grimes  * thereof, and that both notices appear in supporting documentation.
115b81b6b3SRodney W. Grimes  *
125b81b6b3SRodney W. Grimes  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
135b81b6b3SRodney W. Grimes  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
145b81b6b3SRodney W. Grimes  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
155b81b6b3SRodney W. Grimes  *
165b81b6b3SRodney W. Grimes  * Carnegie Mellon requests users of this software to return to
175b81b6b3SRodney W. Grimes  *
185b81b6b3SRodney W. Grimes  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
195b81b6b3SRodney W. Grimes  *  School of Computer Science
205b81b6b3SRodney W. Grimes  *  Carnegie Mellon University
215b81b6b3SRodney W. Grimes  *  Pittsburgh PA 15213-3890
225b81b6b3SRodney W. Grimes  *
235b81b6b3SRodney W. Grimes  * any improvements or extensions that they make and grant Carnegie the
245b81b6b3SRodney W. Grimes  * rights to redistribute these changes.
255b81b6b3SRodney W. Grimes  *
268a129caeSDavid Greenman  *	$Id: db_output.c,v 1.7 1994/08/13 03:49:21 wollman Exp $
275b81b6b3SRodney W. Grimes  */
280edf66ecSRodney W. Grimes 
295b81b6b3SRodney W. Grimes /*
305b81b6b3SRodney W. Grimes  * 	Author: David B. Golub, Carnegie Mellon University
315b81b6b3SRodney W. Grimes  *	Date:	7/90
325b81b6b3SRodney W. Grimes  */
335b81b6b3SRodney W. Grimes 
345b81b6b3SRodney W. Grimes /*
355b81b6b3SRodney W. Grimes  * Printf and character output for debugger.
365b81b6b3SRodney W. Grimes  */
375b81b6b3SRodney W. Grimes 
38f540b106SGarrett Wollman #include <sys/param.h>
39f540b106SGarrett Wollman #include <sys/systm.h>
40f540b106SGarrett Wollman #include <machine/stdarg.h>
41f540b106SGarrett Wollman #include <ddb/ddb.h>
42f540b106SGarrett Wollman #include <machine/cons.h>
435b81b6b3SRodney W. Grimes 
445b81b6b3SRodney W. Grimes /*
455b81b6b3SRodney W. Grimes  *	Character output - tracks position in line.
465b81b6b3SRodney W. Grimes  *	To do this correctly, we should know how wide
475b81b6b3SRodney W. Grimes  *	the output device is - then we could zero
485b81b6b3SRodney W. Grimes  *	the line position when the output device wraps
495b81b6b3SRodney W. Grimes  *	around to the start of the next line.
505b81b6b3SRodney W. Grimes  *
515b81b6b3SRodney W. Grimes  *	Instead, we count the number of spaces printed
525b81b6b3SRodney W. Grimes  *	since the last printing character so that we
535b81b6b3SRodney W. Grimes  *	don't print trailing spaces.  This avoids most
545b81b6b3SRodney W. Grimes  *	of the wraparounds.
555b81b6b3SRodney W. Grimes  */
565b81b6b3SRodney W. Grimes int	db_output_position = 0;		/* output column */
575b81b6b3SRodney W. Grimes int	db_last_non_space = 0;		/* last non-space character */
585b81b6b3SRodney W. Grimes int	db_tab_stop_width = 8;		/* how wide are tab stops? */
595b81b6b3SRodney W. Grimes #define	NEXT_TAB(i) \
605b81b6b3SRodney W. Grimes 	((((i) + db_tab_stop_width) / db_tab_stop_width) * db_tab_stop_width)
615b81b6b3SRodney W. Grimes int	db_max_width = 80;		/* output line width */
625b81b6b3SRodney W. Grimes 
63381fe1aaSGarrett Wollman 
64381fe1aaSGarrett Wollman static void db_printf_guts(const char *, va_list);
655b81b6b3SRodney W. Grimes 
665b81b6b3SRodney W. Grimes /*
675b81b6b3SRodney W. Grimes  * Force pending whitespace.
685b81b6b3SRodney W. Grimes  */
695b81b6b3SRodney W. Grimes void
705b81b6b3SRodney W. Grimes db_force_whitespace()
715b81b6b3SRodney W. Grimes {
725b81b6b3SRodney W. Grimes 	register int last_print, next_tab;
735b81b6b3SRodney W. Grimes 
745b81b6b3SRodney W. Grimes 	last_print = db_last_non_space;
755b81b6b3SRodney W. Grimes 	while (last_print < db_output_position) {
765b81b6b3SRodney W. Grimes 	    next_tab = NEXT_TAB(last_print);
775b81b6b3SRodney W. Grimes 	    if (next_tab <= db_output_position) {
785b81b6b3SRodney W. Grimes 		while (last_print < next_tab) { /* DON'T send a tab!!! */
795b81b6b3SRodney W. Grimes 			cnputc(' ');
805b81b6b3SRodney W. Grimes 			last_print++;
815b81b6b3SRodney W. Grimes 		}
825b81b6b3SRodney W. Grimes 	    }
835b81b6b3SRodney W. Grimes 	    else {
845b81b6b3SRodney W. Grimes 		cnputc(' ');
855b81b6b3SRodney W. Grimes 		last_print++;
865b81b6b3SRodney W. Grimes 	    }
875b81b6b3SRodney W. Grimes 	}
885b81b6b3SRodney W. Grimes 	db_last_non_space = db_output_position;
895b81b6b3SRodney W. Grimes }
905b81b6b3SRodney W. Grimes 
915b81b6b3SRodney W. Grimes /*
925b81b6b3SRodney W. Grimes  * Output character.  Buffer whitespace.
935b81b6b3SRodney W. Grimes  */
94381fe1aaSGarrett Wollman void
955b81b6b3SRodney W. Grimes db_putchar(c)
965b81b6b3SRodney W. Grimes 	int	c;		/* character to output */
975b81b6b3SRodney W. Grimes {
985b81b6b3SRodney W. Grimes 	if (c > ' ' && c <= '~') {
995b81b6b3SRodney W. Grimes 	    /*
1005b81b6b3SRodney W. Grimes 	     * Printing character.
1015b81b6b3SRodney W. Grimes 	     * If we have spaces to print, print them first.
1025b81b6b3SRodney W. Grimes 	     * Use tabs if possible.
1035b81b6b3SRodney W. Grimes 	     */
1045b81b6b3SRodney W. Grimes 	    db_force_whitespace();
1055b81b6b3SRodney W. Grimes 	    cnputc(c);
1065b81b6b3SRodney W. Grimes 	    db_output_position++;
1075b81b6b3SRodney W. Grimes 	    db_last_non_space = db_output_position;
1085b81b6b3SRodney W. Grimes 	}
1095b81b6b3SRodney W. Grimes 	else if (c == '\n') {
1108a129caeSDavid Greenman 	    /* Newline */
1118a129caeSDavid Greenman 	    cnputc(c);
1128a129caeSDavid Greenman 	    db_output_position = 0;
1138a129caeSDavid Greenman 	    db_last_non_space = 0;
1148a129caeSDavid Greenman 	    db_check_interrupt();
1158a129caeSDavid Greenman 	}
1168a129caeSDavid Greenman 	else if (c == '\r') {
1175b81b6b3SRodney W. Grimes 	    /* Return */
1185b81b6b3SRodney W. Grimes 	    cnputc(c);
1195b81b6b3SRodney W. Grimes 	    db_output_position = 0;
1205b81b6b3SRodney W. Grimes 	    db_last_non_space = 0;
1215b81b6b3SRodney W. Grimes 	    db_check_interrupt();
1225b81b6b3SRodney W. Grimes 	}
1235b81b6b3SRodney W. Grimes 	else if (c == '\t') {
1245b81b6b3SRodney W. Grimes 	    /* assume tabs every 8 positions */
1255b81b6b3SRodney W. Grimes 	    db_output_position = NEXT_TAB(db_output_position);
1265b81b6b3SRodney W. Grimes 	}
1275b81b6b3SRodney W. Grimes 	else if (c == ' ') {
1285b81b6b3SRodney W. Grimes 	    /* space */
1295b81b6b3SRodney W. Grimes 	    db_output_position++;
1305b81b6b3SRodney W. Grimes 	}
1315b81b6b3SRodney W. Grimes 	else if (c == '\007') {
1325b81b6b3SRodney W. Grimes 	    /* bell */
1335b81b6b3SRodney W. Grimes 	    cnputc(c);
1345b81b6b3SRodney W. Grimes 	}
1355b81b6b3SRodney W. Grimes 	/* other characters are assumed non-printing */
1365b81b6b3SRodney W. Grimes }
1375b81b6b3SRodney W. Grimes 
1385b81b6b3SRodney W. Grimes /*
1395b81b6b3SRodney W. Grimes  * Return output position
1405b81b6b3SRodney W. Grimes  */
1415b81b6b3SRodney W. Grimes int
1425b81b6b3SRodney W. Grimes db_print_position()
1435b81b6b3SRodney W. Grimes {
1445b81b6b3SRodney W. Grimes 	return (db_output_position);
1455b81b6b3SRodney W. Grimes }
1465b81b6b3SRodney W. Grimes 
1475b81b6b3SRodney W. Grimes /*
1485b81b6b3SRodney W. Grimes  * Printing
1495b81b6b3SRodney W. Grimes  */
150381fe1aaSGarrett Wollman void
151381fe1aaSGarrett Wollman db_printf(const char *fmt, ...)
1525b81b6b3SRodney W. Grimes {
1535b81b6b3SRodney W. Grimes 	va_list	listp;
1545b81b6b3SRodney W. Grimes 	va_start(listp, fmt);
1555b81b6b3SRodney W. Grimes 	db_printf_guts (fmt, listp);
1565b81b6b3SRodney W. Grimes 	va_end(listp);
1575b81b6b3SRodney W. Grimes }
1585b81b6b3SRodney W. Grimes 
1595b81b6b3SRodney W. Grimes /* alternate name */
1605b81b6b3SRodney W. Grimes 
1615b81b6b3SRodney W. Grimes /*VARARGS1*/
162381fe1aaSGarrett Wollman void
1635b81b6b3SRodney W. Grimes kdbprintf(char *fmt, ...)
1645b81b6b3SRodney W. Grimes {
1655b81b6b3SRodney W. Grimes 	va_list	listp;
1665b81b6b3SRodney W. Grimes 	va_start(listp, fmt);
1675b81b6b3SRodney W. Grimes 	db_printf_guts (fmt, listp);
1685b81b6b3SRodney W. Grimes 	va_end(listp);
1695b81b6b3SRodney W. Grimes }
1705b81b6b3SRodney W. Grimes 
1715b81b6b3SRodney W. Grimes /*
172572de915SRodney W. Grimes  * End line if too long.
173572de915SRodney W. Grimes  */
174572de915SRodney W. Grimes void
175572de915SRodney W. Grimes db_end_line()
176572de915SRodney W. Grimes {
177572de915SRodney W. Grimes 	if (db_output_position >= db_max_width)
178572de915SRodney W. Grimes 	    db_printf("\n");
179572de915SRodney W. Grimes }
180572de915SRodney W. Grimes 
181572de915SRodney W. Grimes /*
1825b81b6b3SRodney W. Grimes  * Put a number (base <= 16) in a buffer in reverse order; return an
1835b81b6b3SRodney W. Grimes  * optional length and a pointer to the NULL terminated (preceded?)
1845b81b6b3SRodney W. Grimes  * buffer.
1855b81b6b3SRodney W. Grimes  */
1865b81b6b3SRodney W. Grimes static char *
1875b81b6b3SRodney W. Grimes db_ksprintn(ul, base, lenp)
1885b81b6b3SRodney W. Grimes 	register u_long ul;
1895b81b6b3SRodney W. Grimes 	register int base, *lenp;
1905b81b6b3SRodney W. Grimes {					/* A long in base 8, plus NULL. */
1915b81b6b3SRodney W. Grimes 	static char buf[sizeof(long) * NBBY / 3 + 2];
1925b81b6b3SRodney W. Grimes 	register char *p;
1935b81b6b3SRodney W. Grimes 
1945b81b6b3SRodney W. Grimes 	p = buf;
1955b81b6b3SRodney W. Grimes 	do {
1965b81b6b3SRodney W. Grimes 		*++p = "0123456789abcdef"[ul % base];
1975b81b6b3SRodney W. Grimes 	} while (ul /= base);
1985b81b6b3SRodney W. Grimes 	if (lenp)
1995b81b6b3SRodney W. Grimes 		*lenp = p - buf;
2005b81b6b3SRodney W. Grimes 	return (p);
2015b81b6b3SRodney W. Grimes }
2025b81b6b3SRodney W. Grimes 
203381fe1aaSGarrett Wollman static void
2045b81b6b3SRodney W. Grimes db_printf_guts(fmt, ap)
2055b81b6b3SRodney W. Grimes 	register const char *fmt;
2065b81b6b3SRodney W. Grimes 	va_list ap;
2075b81b6b3SRodney W. Grimes {
2085b81b6b3SRodney W. Grimes 	register char *p;
2095b81b6b3SRodney W. Grimes 	register int ch, n;
2105b81b6b3SRodney W. Grimes 	u_long ul;
2115b81b6b3SRodney W. Grimes 	int base, lflag, tmp, width;
2125b81b6b3SRodney W. Grimes 	char padc;
2135b81b6b3SRodney W. Grimes 	int ladjust;
2145b81b6b3SRodney W. Grimes 	int sharpflag;
2155b81b6b3SRodney W. Grimes 	int neg;
2165b81b6b3SRodney W. Grimes 
2175b81b6b3SRodney W. Grimes 	for (;;) {
2185b81b6b3SRodney W. Grimes 		padc = ' ';
2195b81b6b3SRodney W. Grimes 		width = 0;
2205b81b6b3SRodney W. Grimes 		while ((ch = *(u_char *)fmt++) != '%') {
2215b81b6b3SRodney W. Grimes 			if (ch == '\0')
2225b81b6b3SRodney W. Grimes 				return;
2235b81b6b3SRodney W. Grimes 			db_putchar(ch);
2245b81b6b3SRodney W. Grimes 		}
2255b81b6b3SRodney W. Grimes 		lflag = 0;
2265b81b6b3SRodney W. Grimes 		ladjust = 0;
2275b81b6b3SRodney W. Grimes 		sharpflag = 0;
2285b81b6b3SRodney W. Grimes 		neg = 0;
2295b81b6b3SRodney W. Grimes reswitch:	switch (ch = *(u_char *)fmt++) {
2305b81b6b3SRodney W. Grimes 		case '0':
2315b81b6b3SRodney W. Grimes 			padc = '0';
2325b81b6b3SRodney W. Grimes 			goto reswitch;
2335b81b6b3SRodney W. Grimes 		case '1': case '2': case '3': case '4':
2345b81b6b3SRodney W. Grimes 		case '5': case '6': case '7': case '8': case '9':
2355b81b6b3SRodney W. Grimes 			for (width = 0;; ++fmt) {
2365b81b6b3SRodney W. Grimes 				width = width * 10 + ch - '0';
2375b81b6b3SRodney W. Grimes 				ch = *fmt;
2385b81b6b3SRodney W. Grimes 				if (ch < '0' || ch > '9')
2395b81b6b3SRodney W. Grimes 					break;
2405b81b6b3SRodney W. Grimes 			}
2415b81b6b3SRodney W. Grimes 			goto reswitch;
2425b81b6b3SRodney W. Grimes 		case 'l':
2435b81b6b3SRodney W. Grimes 			lflag = 1;
2445b81b6b3SRodney W. Grimes 			goto reswitch;
2455b81b6b3SRodney W. Grimes 		case '-':
2465b81b6b3SRodney W. Grimes 			ladjust = 1;
2475b81b6b3SRodney W. Grimes 			goto reswitch;
2485b81b6b3SRodney W. Grimes 		case '#':
2495b81b6b3SRodney W. Grimes 			sharpflag = 1;
2505b81b6b3SRodney W. Grimes 			goto reswitch;
2515b81b6b3SRodney W. Grimes 		case 'b':
2525b81b6b3SRodney W. Grimes 			ul = va_arg(ap, int);
2535b81b6b3SRodney W. Grimes 			p = va_arg(ap, char *);
2545b81b6b3SRodney W. Grimes 			for (p = db_ksprintn(ul, *p++, NULL); ch = *p--;)
2555b81b6b3SRodney W. Grimes 				db_putchar(ch);
2565b81b6b3SRodney W. Grimes 
2575b81b6b3SRodney W. Grimes 			if (!ul)
2585b81b6b3SRodney W. Grimes 				break;
2595b81b6b3SRodney W. Grimes 
2605b81b6b3SRodney W. Grimes 			for (tmp = 0; n = *p++;) {
2615b81b6b3SRodney W. Grimes 				if (ul & (1 << (n - 1))) {
2625b81b6b3SRodney W. Grimes 					db_putchar(tmp ? ',' : '<');
2635b81b6b3SRodney W. Grimes 					for (; (n = *p) > ' '; ++p)
2645b81b6b3SRodney W. Grimes 						db_putchar(n);
2655b81b6b3SRodney W. Grimes 					tmp = 1;
2665b81b6b3SRodney W. Grimes 				} else
2675b81b6b3SRodney W. Grimes 					for (; *p > ' '; ++p);
2685b81b6b3SRodney W. Grimes 			}
2695b81b6b3SRodney W. Grimes 			if (tmp)
2705b81b6b3SRodney W. Grimes 				db_putchar('>');
2715b81b6b3SRodney W. Grimes 			break;
2725b81b6b3SRodney W. Grimes 		case '*':
2735b81b6b3SRodney W. Grimes 			width = va_arg (ap, int);
2745b81b6b3SRodney W. Grimes 			if (width < 0) {
2755b81b6b3SRodney W. Grimes 				ladjust = !ladjust;
2765b81b6b3SRodney W. Grimes 				width = -width;
2775b81b6b3SRodney W. Grimes 			}
2785b81b6b3SRodney W. Grimes 			goto reswitch;
2795b81b6b3SRodney W. Grimes 		case 'c':
2805b81b6b3SRodney W. Grimes 			db_putchar(va_arg(ap, int));
2815b81b6b3SRodney W. Grimes 			break;
2825b81b6b3SRodney W. Grimes 		case 's':
2835b81b6b3SRodney W. Grimes 			p = va_arg(ap, char *);
2845b81b6b3SRodney W. Grimes 			width -= strlen (p);
2855b81b6b3SRodney W. Grimes 			if (!ladjust && width > 0)
2865b81b6b3SRodney W. Grimes 				while (width--)
2875b81b6b3SRodney W. Grimes 					db_putchar (padc);
2885b81b6b3SRodney W. Grimes 			while (ch = *p++)
2895b81b6b3SRodney W. Grimes 				db_putchar(ch);
2905b81b6b3SRodney W. Grimes 			if (ladjust && width > 0)
2915b81b6b3SRodney W. Grimes 				while (width--)
2925b81b6b3SRodney W. Grimes 					db_putchar (padc);
2935b81b6b3SRodney W. Grimes 			break;
2945b81b6b3SRodney W. Grimes 		case 'r':
2955b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
2965b81b6b3SRodney W. Grimes 			if ((long)ul < 0) {
2975b81b6b3SRodney W. Grimes 				neg = 1;
2985b81b6b3SRodney W. Grimes 				ul = -(long)ul;
2995b81b6b3SRodney W. Grimes 			}
3005b81b6b3SRodney W. Grimes 			base = db_radix;
3015b81b6b3SRodney W. Grimes 			if (base < 8 || base > 16)
3025b81b6b3SRodney W. Grimes 				base = 10;
3035b81b6b3SRodney W. Grimes 			goto number;
3045b81b6b3SRodney W. Grimes 		case 'n':
3055b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
3065b81b6b3SRodney W. Grimes 			base = db_radix;
3075b81b6b3SRodney W. Grimes 			if (base < 8 || base > 16)
3085b81b6b3SRodney W. Grimes 				base = 10;
3095b81b6b3SRodney W. Grimes 			goto number;
3105b81b6b3SRodney W. Grimes 		case 'd':
3115b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, long) : va_arg(ap, int);
3125b81b6b3SRodney W. Grimes 			if ((long)ul < 0) {
3135b81b6b3SRodney W. Grimes 				neg = 1;
3145b81b6b3SRodney W. Grimes 				ul = -(long)ul;
3155b81b6b3SRodney W. Grimes 			}
3165b81b6b3SRodney W. Grimes 			base = 10;
3175b81b6b3SRodney W. Grimes 			goto number;
3185b81b6b3SRodney W. Grimes 		case 'o':
3195b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
3205b81b6b3SRodney W. Grimes 			base = 8;
3215b81b6b3SRodney W. Grimes 			goto number;
3225b81b6b3SRodney W. Grimes 		case 'u':
3235b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
3245b81b6b3SRodney W. Grimes 			base = 10;
3255b81b6b3SRodney W. Grimes 			goto number;
3265b81b6b3SRodney W. Grimes 		case 'z':
3275b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
3285b81b6b3SRodney W. Grimes 			if ((long)ul < 0) {
3295b81b6b3SRodney W. Grimes 				neg = 1;
3305b81b6b3SRodney W. Grimes 				ul = -(long)ul;
3315b81b6b3SRodney W. Grimes 			}
3325b81b6b3SRodney W. Grimes 			base = 16;
3335b81b6b3SRodney W. Grimes 			goto number;
3345b81b6b3SRodney W. Grimes 		case 'x':
3355b81b6b3SRodney W. Grimes 			ul = lflag ? va_arg(ap, u_long) : va_arg(ap, u_int);
3365b81b6b3SRodney W. Grimes 			base = 16;
3375b81b6b3SRodney W. Grimes number:			p = (char *)db_ksprintn(ul, base, &tmp);
3385b81b6b3SRodney W. Grimes 			if (sharpflag && ul != 0) {
3395b81b6b3SRodney W. Grimes 				if (base == 8)
3405b81b6b3SRodney W. Grimes 					tmp++;
3415b81b6b3SRodney W. Grimes 				else if (base == 16)
3425b81b6b3SRodney W. Grimes 					tmp += 2;
3435b81b6b3SRodney W. Grimes 			}
3445b81b6b3SRodney W. Grimes 			if (neg)
3455b81b6b3SRodney W. Grimes 				tmp++;
3465b81b6b3SRodney W. Grimes 
3475b81b6b3SRodney W. Grimes 			if (!ladjust && width && (width -= tmp) > 0)
3485b81b6b3SRodney W. Grimes 				while (width--)
3495b81b6b3SRodney W. Grimes 					db_putchar(padc);
3505b81b6b3SRodney W. Grimes 			if (neg)
3515b81b6b3SRodney W. Grimes 				db_putchar ('-');
3525b81b6b3SRodney W. Grimes 			if (sharpflag && ul != 0) {
3535b81b6b3SRodney W. Grimes 				if (base == 8) {
3545b81b6b3SRodney W. Grimes 					db_putchar ('0');
3555b81b6b3SRodney W. Grimes 				} else if (base == 16) {
3565b81b6b3SRodney W. Grimes 					db_putchar ('0');
3575b81b6b3SRodney W. Grimes 					db_putchar ('x');
3585b81b6b3SRodney W. Grimes 				}
3595b81b6b3SRodney W. Grimes 			}
3605b81b6b3SRodney W. Grimes 			if (ladjust && width && (width -= tmp) > 0)
3615b81b6b3SRodney W. Grimes 				while (width--)
3625b81b6b3SRodney W. Grimes 					db_putchar(padc);
3635b81b6b3SRodney W. Grimes 
3645b81b6b3SRodney W. Grimes 			while (ch = *p--)
3655b81b6b3SRodney W. Grimes 				db_putchar(ch);
3665b81b6b3SRodney W. Grimes 			break;
3675b81b6b3SRodney W. Grimes 		default:
3685b81b6b3SRodney W. Grimes 			db_putchar('%');
3695b81b6b3SRodney W. Grimes 			if (lflag)
3705b81b6b3SRodney W. Grimes 				db_putchar('l');
3715b81b6b3SRodney W. Grimes 			/* FALLTHROUGH */
3725b81b6b3SRodney W. Grimes 		case '%':
3735b81b6b3SRodney W. Grimes 			db_putchar(ch);
3745b81b6b3SRodney W. Grimes 		}
3755b81b6b3SRodney W. Grimes 	}
3765b81b6b3SRodney W. Grimes }
3775b81b6b3SRodney W. Grimes 
378