From 6a6f31db520177d15a604ebd77ec68b7fc94dce6 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Sun, 17 Jun 2018 04:10:41 +1000 Subject: Added basic implmementation of %x to vsprintf. --- kernel/vsprintf.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'kernel/vsprintf.c') diff --git a/kernel/vsprintf.c b/kernel/vsprintf.c index dca2906..20489f4 100644 --- a/kernel/vsprintf.c +++ b/kernel/vsprintf.c @@ -8,7 +8,22 @@ enum TYPE { TYPE_STRING = 4 }; +static void hex(char **str, int x) { + int n; + char *s = "0x"; + + while(*s) + *(*str)++ = *s++; + + n = sizeof(x) << 1; + while(n--) { + *(*str)++ = ((unsigned int) x >> 28) + 0x30; + x = x << 4; + } +} + int vsprintf(char *str, char *fmt, va_list ap) { + int x; char *s; char *start = str; uint8_t type; @@ -29,6 +44,11 @@ int vsprintf(char *str, char *fmt, va_list ap) { goto done; type = TYPE_STRING; break; + case 'x': + if(type) + goto done; + type = TYPE_HEX; + break; default: goto done; break; @@ -44,6 +64,10 @@ done: while(*s) *str++ = *s++; break; + case TYPE_HEX: + x = va_arg(ap, int); + hex(&str, x); + break; } } -- cgit v1.3