diff options
Diffstat (limited to 'kernel/src/libk/serial_stdio.c')
| -rw-r--r-- | kernel/src/libk/serial_stdio.c | 61 |
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); +} |
