summaryrefslogtreecommitdiff
path: root/kernel/src/libk
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/libk')
-rw-r--r--kernel/src/libk/math.c1
-rw-r--r--kernel/src/libk/stdio.c76
-rw-r--r--kernel/src/libk/string.c7
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);