summaryrefslogtreecommitdiff
path: root/kernel/src/libk/serial_stdio.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-11-25 23:44:40 +0100
committerAleksa Vuckovic <aleksav013@gmail.com>2022-11-25 23:44:40 +0100
commit5d56d1a5b4d52702eb4e4ea6f05e4b6eebf41ca8 (patch)
tree1ddc17cf4524254edf322da50e5c12261715b648 /kernel/src/libk/serial_stdio.c
parent3ec35b5abeb9765c419cf896338de7d95143bc9b (diff)
UBSAN - FINALLY FIXING UNDEFINED BEHAVIOUR
Diffstat (limited to 'kernel/src/libk/serial_stdio.c')
-rw-r--r--kernel/src/libk/serial_stdio.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/kernel/src/libk/serial_stdio.c b/kernel/src/libk/serial_stdio.c
new file mode 100644
index 0000000..a56750b
--- /dev/null
+++ b/kernel/src/libk/serial_stdio.c
@@ -0,0 +1,61 @@
+#include <types.h>
+#include <libk/serial_stdio.h>
+#include <stdarg.h>
+#include <libk/string.h>
+#include <graphics.h>
+#include <serial.h>
+
+void serial_print_char(char c)
+{
+ write_serial(c);
+}
+
+void serial_print_string(const char* s)
+{
+ for (size_t i = 0; i < strlen(s); i++) {
+ serial_print_char(s[i]);
+ }
+}
+
+void serial_print_int(uint64_t num)
+{
+ char a[100];
+ itos(num, a);
+ serial_print_string(a);
+}
+
+void serial_print_hex(uint64_t num)
+{
+ char a[100];
+ itoh(num, a);
+ serial_print_string(a);
+}
+
+void serial_printf(const char *s, ...)
+{
+ size_t count = 0;
+ for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++;
+
+ va_list list;
+ va_start(list, s);
+
+ for(size_t i = 0; i < strlen(s); i++)
+ {
+ if(s[i] == '%')
+ {
+ i++;
+ if(s[i] == 'c') serial_print_char((char)va_arg(list, uint32_t));
+ else if(s[i] == 's') serial_print_string(va_arg(list, char*));
+ else if(s[i] == 'd') serial_print_int((uint64_t)va_arg(list, uint64_t));
+ else if(s[i] == 'x') serial_print_hex((uint64_t)va_arg(list, uint64_t));
+ else
+ {
+ serial_print_string("Wrong format using printf\n");
+ return;
+ }
+ }
+ else serial_print_char(s[i]);
+ }
+
+ va_end(list);
+}