summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorJake Mannens <jake72360@gmail.com>2018-06-17 04:10:41 +1000
committerJake Mannens <jake72360@gmail.com>2018-06-17 04:10:41 +1000
commit6a6f31db520177d15a604ebd77ec68b7fc94dce6 (patch)
tree9b850c5eb1ad178e6fa1d063eecb0ea70c6778cf /kernel
parentfb24378c58a3bd5260920a1e9762c027fdbe5cec (diff)
Added basic implmementation of %x to vsprintf.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kmain.c2
-rw-r--r--kernel/vsprintf.c24
2 files changed, 25 insertions, 1 deletions
diff --git a/kernel/kmain.c b/kernel/kmain.c
index 52c41d1..a854c12 100644
--- a/kernel/kmain.c
+++ b/kernel/kmain.c
@@ -8,5 +8,5 @@ void kmain(void) {
printf("Kernel booting...\n");
printf("Kernel booted!\n");
- printf("%s %s %s\n%s %s %s\n", "first", "second", "third", "fourth", "fifth", "sixth");
+ printf("Number: %x\n", 0x80);
}
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;
}
}