summaryrefslogtreecommitdiff
path: root/kernel/vsprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vsprintf.c')
-rw-r--r--kernel/vsprintf.c24
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;
}
}