aboutsummaryrefslogtreecommitdiff
path: root/lib/libstand/printf.c
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2006-03-09 22:37:34 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2006-03-09 22:37:34 +0000
commit0d84d9ebb5c1e869f3bb849e2e8f35f8f460a4b6 (patch)
tree8901b3a21cdbc0f088470b2d29de5adabbbcc041 /lib/libstand/printf.c
parent15b7ca11cdc777ef9780d715e3c9051707a50453 (diff)
downloadsrc-0d84d9ebb5c1e869f3bb849e2e8f35f8f460a4b6.tar.gz
src-0d84d9ebb5c1e869f3bb849e2e8f35f8f460a4b6.zip
Implement printf 'X' conversion for both libstand and kernel.
Notes
Notes: svn path=/head/; revision=156518
Diffstat (limited to 'lib/libstand/printf.c')
-rw-r--r--lib/libstand/printf.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/libstand/printf.c b/lib/libstand/printf.c
index e877a537418c..ebc2c0f95db4 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++;