diff options
author | jkim <jkim@FreeBSD.org> | 2006-03-09 22:37:34 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2006-03-09 22:37:34 +0000 |
commit | 7e4fc3b8f97d1bb977eef30e3d8d163162d0f9f7 (patch) | |
tree | 8901b3a21cdbc0f088470b2d29de5adabbbcc041 /lib/libstand/printf.c | |
parent | 83bdb1ecb3666b936f0361a5c6996740f193558d (diff) | |
download | FreeBSD-src-7e4fc3b8f97d1bb977eef30e3d8d163162d0f9f7.zip FreeBSD-src-7e4fc3b8f97d1bb977eef30e3d8d163162d0f9f7.tar.gz |
Implement printf 'X' conversion for both libstand and kernel.
Diffstat (limited to 'lib/libstand/printf.c')
-rw-r--r-- | lib/libstand/printf.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/libstand/printf.c b/lib/libstand/printf.c index e877a53..ebc2c0f 100644 --- a/lib/libstand/printf.c +++ b/lib/libstand/printf.c @@ -60,7 +60,7 @@ __FBSDID("$FreeBSD$"); #define MAXNBUF (sizeof(intmax_t) * CHAR_BIT + 1) -static char *ksprintn (char *buf, uintmax_t num, int base, int *len); +static char *ksprintn (char *buf, uintmax_t num, int base, int *len, int upper); static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap); int @@ -111,14 +111,15 @@ vsprintf(char *buf, const char *cfmt, va_list ap) * The buffer pointed to by `nbuf' must have length >= MAXNBUF. */ static char * -ksprintn(char *nbuf, uintmax_t num, int base, int *lenp) +ksprintn(char *nbuf, uintmax_t num, int base, int *lenp, int upper) { - char *p; + char *p, c; p = nbuf; *p = '\0'; do { - *++p = hex2ascii(num % base); + c = hex2ascii(num % base); + *++p = upper ? toupper(c) : c; } while (num /= base); if (lenp) *lenp = p - nbuf; @@ -163,7 +164,7 @@ kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap) uintmax_t num; int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot; int jflag, tflag, zflag; - int dwidth; + int dwidth, upper; char padc; int retval = 0; @@ -189,7 +190,7 @@ kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap) } percent = fmt - 1; qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0; - sign = 0; dot = 0; dwidth = 0; + sign = 0; dot = 0; dwidth = 0; upper = 0; jflag = 0; tflag = 0; zflag = 0; reswitch: switch (ch = (u_char)*fmt++) { case '.': @@ -239,7 +240,7 @@ reswitch: switch (ch = (u_char)*fmt++) { case 'b': num = va_arg(ap, int); p = va_arg(ap, char *); - for (q = ksprintn(nbuf, num, *p++, NULL); *q;) + for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;) PCHAR(*q--); if (num == 0) @@ -347,8 +348,9 @@ reswitch: switch (ch = (u_char)*fmt++) { case 'u': base = 10; goto handle_nosign; - case 'x': case 'X': + upper = 1; + case 'x': base = 16; goto handle_nosign; case 'y': @@ -391,7 +393,7 @@ number: neg = 1; num = -(intmax_t)num; } - p = ksprintn(nbuf, num, base, &tmp); + p = ksprintn(nbuf, num, base, &tmp, upper); if (sharpflag && num != 0) { if (base == 8) tmp++; |