feat: experimental tty console with scrollback buffer.
[lunaix-os.git] / lunaix-os / kernel / kprintf.c
1 #include <klibc/stdio.h>
2 #include <lunaix/lxconsole.h>
3 #include <lunaix/syslog.h>
4 #include <lunaix/tty/tty.h>
5
6 #define MAX_KPRINTF_BUF_SIZE 1024
7 #define MAX_XFMT_SIZE 1024
8
9 static char buf[MAX_KPRINTF_BUF_SIZE];
10
11 void
12 __kprintf(const char* component, const char* fmt, va_list args)
13 {
14     if (!fmt)
15         return;
16     char log_level = '0';
17     char expanded_fmt[MAX_XFMT_SIZE];
18
19     if (*fmt == '\x1b') {
20         log_level = *(++fmt);
21         fmt++;
22     }
23
24     switch (log_level) {
25         case '0':
26             snprintf(expanded_fmt,
27                      MAX_XFMT_SIZE,
28                      "[%s] (%s) %s",
29                      "INFO",
30                      component,
31                      fmt);
32             break;
33         case '1':
34             // tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12);
35             snprintf(expanded_fmt,
36                      MAX_XFMT_SIZE,
37                      "\x033[6;0m[%s] (%s) %s\x033[39;49m",
38                      "WARN",
39                      component,
40                      fmt);
41             break;
42         case '2':
43             // tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12);
44             snprintf(expanded_fmt,
45                      MAX_XFMT_SIZE,
46                      "\x033[12;0m[%s] (%s) %s\x033[39;49m",
47                      "EROR",
48                      component,
49                      fmt);
50             break;
51         case '3':
52             // tty_set_theme(VGA_COLOR_LIGHT_BLUE, current_theme >> 12);
53             snprintf(expanded_fmt,
54                      MAX_XFMT_SIZE,
55                      "\x033[9;0m[%s] (%s) %s\x033[39;49m",
56                      "DEBG",
57                      component,
58                      fmt);
59             break;
60         default:
61             snprintf(expanded_fmt,
62                      MAX_XFMT_SIZE,
63                      "[%s] (%s) %s",
64                      "LOG",
65                      component,
66                      fmt);
67             break;
68     }
69
70     __sprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
71     console_write_str(buf);
72 }
73
74 void
75 kprint_panic(const char* fmt, ...)
76 {
77     va_list args;
78     va_start(args, fmt);
79
80     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
81     tty_clear_line(10);
82     tty_clear_line(11);
83     tty_clear_line(12);
84
85     __sprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
86     tty_put_str_at(buf, 0, 11);
87
88     va_end(args);
89 }