diff options
Diffstat (limited to 'kernel/src/libk')
| -rw-r--r-- | kernel/src/libk/math.c | 1 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 76 | ||||
| -rw-r--r-- | kernel/src/libk/string.c | 7 |
3 files changed, 81 insertions, 3 deletions
diff --git a/kernel/src/libk/math.c b/kernel/src/libk/math.c index c2f9c5e..f625fb5 100644 --- a/kernel/src/libk/math.c +++ b/kernel/src/libk/math.c @@ -1,4 +1,5 @@ #include <types.h> +#include <libk/math.h> int64_t abs(int64_t val) { 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 <types.h> +#include <libk/stdio.h> + +#include <stdarg.h> +#include <libk/string.h> +#include <graphics.h> + +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); +} diff --git a/kernel/src/libk/string.c b/kernel/src/libk/string.c index a4d0191..fde9645 100644 --- a/kernel/src/libk/string.c +++ b/kernel/src/libk/string.c @@ -1,10 +1,11 @@ #include <types.h> +#include <libk/string.h> size_t strlen(const char* s) { char *p = (char*)s; while (*p) p++; - return p - s; + return (size_t)(p - s); } uint64_t stoi(const char *s) @@ -14,7 +15,7 @@ uint64_t stoi(const char *s) for (size_t i = 0; i < n; i++) { num *= 10; - num += s[i] - '0'; + num += (uint64_t)(s[i] - '0'); } return num; @@ -36,7 +37,7 @@ void itos(uint64_t num, char* s) { size_t i; for (i = 0; num; num/=10, i++) { - s[i] = '0' + num%10; + s[i] = (char)('0' + num%10); } s[i] = '\0'; strrev(s); |
