From e11298e56be560de64bbccfe74fef7ff85c623d1 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Mon, 8 Aug 2022 21:25:55 +0200 Subject: stdio.h; gcc $(WARNINGS) --- kernel/src/libk/stdio.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 kernel/src/libk/stdio.c (limited to 'kernel/src/libk/stdio.c') diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c new file mode 100644 index 0000000..b8ddb67 --- /dev/null +++ b/kernel/src/libk/stdio.c @@ -0,0 +1,76 @@ +#include +#include + +#include +#include +#include + +int32_t x; +int32_t y; + +inline void print_char(char c) +{ + if (c == '\n') { + x = 0; + y++; + return; + } + if (c == '\b') { + if (x != 0) { + x--; + } + return; + } + if (x * 8 >= (int32_t)main_fb.width) { + x = 0; + y++; + } + if (y * 16 >= (int32_t)main_fb.height) { + x = 0; + y = 0; + } + fb_draw_character(main_fb, c, x * 8, y * 16, WHITE, BLACK); + x++; +} + +inline void print_string(const char* s) +{ + for (size_t i = 0; i < strlen(s); i++) { + print_char(s[i]); + } +} + +inline void print_int(uint64_t num) +{ + char a[100]; + itos(num, a); + print_string(a); +} + +void 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') print_char((char)va_arg(list, uint32_t)); + else if(s[i] == 's') print_string(va_arg(list, char*)); + else if(s[i] == 'd') print_int((uint64_t)va_arg(list, uint64_t)); + else + { + print_string("Wrong format using printf\n"); + return; + } + } + else print_char(s[i]); + } + + va_end(list); +} -- cgit v1.2.3