summaryrefslogtreecommitdiff
path: root/kernel/src/print/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/print/print.c')
-rw-r--r--kernel/src/print/print.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/kernel/src/print/print.c b/kernel/src/print/print.c
new file mode 100644
index 0000000..46ec047
--- /dev/null
+++ b/kernel/src/print/print.c
@@ -0,0 +1,128 @@
+#include "tty/color.h"
+#include "tty/term.h"
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <print.h>
+
+void printk(const char *restrict format, ...) {
+ va_list args;
+ va_start(args, format);
+ vprintk(format, args);
+ va_end(args);
+}
+
+void vprintk(const char *restrict format, va_list args) {
+ char buf[80];
+ for (; *format; format++) {
+ if (*format == '%') {
+ bool l = false;
+ char c = *++format;
+ if (c == 'l') {
+ l = true;
+ c = *++format;
+ }
+ switch(c) {
+ case '%':
+ putchar('%');
+ break;
+ case 's':
+ puts(va_arg(args, char*));
+ break;
+ case 'c':
+ putchar(va_arg(args, int));
+ break;
+ case 'd':
+ if (l) ltoa(va_arg(args, long long), buf, 10);
+ else itoa(va_arg(args, int), buf, 10);
+ puts(buf);
+ break;
+ case 'u':
+ if (l) ultoa(va_arg(args, unsigned long long), buf, 10);
+ else utoa(va_arg(args, unsigned int), buf, 10);
+ puts(buf);
+ break;
+ case 'f':
+ case 'F':
+ ftoa(va_arg(args, double), buf);
+ puts(buf);
+ break;
+ case 'x':
+ case 'X':
+ utoa(va_arg(args, unsigned int), buf, 16);
+ puts(buf);
+ break;
+ case 'b':
+ va_arg(args, int) ? puts("true") : puts("false");
+ break;
+ case 'k': {
+ static char disp[] = {'B', 'K', 'M', 'G'};
+ uint32_t size = va_arg(args, unsigned int);
+ size_t i = 0;
+ while (size / 1024 > 0) {
+ size /= 1024;
+ i++;
+ }
+ utoa(size, buf, 10);
+ puts(buf);
+ putchar(disp[i]);
+ if (i > 0) putchar('B');
+ break;
+ }
+ default:
+ break;
+ }
+ } else {
+ putchar(*format);
+ }
+ }
+}
+
+void puts(const char *s) {
+ for(; *s; s++) putchar(*s);
+}
+
+void printl(enum VGAColor color, const char* msg) {
+ term_setbg(VGA_BLACK);
+ term_setfg(VGA_WHITE);
+ putchar('[');
+ term_setfg(color);
+ printk("%s", msg);
+ term_setfg(VGA_WHITE);
+ putchar(']');
+ putchar(' ');
+}
+
+void _debugk_impl(char *format, ...) {
+ uint16_t color = term_save_col();
+ printl(VGA_LIGHT_CYAN, "LOG");
+ va_list args;
+ va_start(args, format);
+ vprintk(format, args);
+ va_end(args);
+ if (!term_newline()) putchar('\n');
+ term_load_col(color);
+}
+
+void _succek_impl(char *format, ...) {
+ uint16_t color = term_save_col();
+ printl(VGA_LIGHT_GREEN, "OK");
+ va_list args;
+ va_start(args, format);
+ vprintk(format, args);
+ va_end(args);
+ if (!term_newline()) putchar('\n');
+ term_load_col(color);
+}
+
+void _errork_impl(char *format, ...) {
+ uint16_t color = term_save_col();
+ printl(VGA_LIGHT_RED, "ERR");
+ va_list args;
+ va_start(args, format);
+ vprintk(format, args);
+ va_end(args);
+ if (!term_newline()) putchar('\n');
+ term_load_col(color);
+}