diff options
| author | Jake Mannens <jake72360@gmail.com> | 2018-06-17 04:10:41 +1000 |
|---|---|---|
| committer | Jake Mannens <jake72360@gmail.com> | 2018-06-17 04:10:41 +1000 |
| commit | 6a6f31db520177d15a604ebd77ec68b7fc94dce6 (patch) | |
| tree | 9b850c5eb1ad178e6fa1d063eecb0ea70c6778cf /kernel/vsprintf.c | |
| parent | fb24378c58a3bd5260920a1e9762c027fdbe5cec (diff) | |
Added basic implmementation of %x to vsprintf.
Diffstat (limited to 'kernel/vsprintf.c')
| -rw-r--r-- | kernel/vsprintf.c | 24 |
1 files changed, 24 insertions, 0 deletions
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; } } |
