summaryrefslogtreecommitdiff
path: root/kernel/src/libk/serial_stdio.c
diff options
context:
space:
mode:
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);
+}