diff options
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; } } |
