feat: a pseudo shell environment for basic interacting and testing purpose
[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 512
7 #define MAX_XFMT_SIZE 512
8
9 void
10 __kprintf(const char* component, const char* fmt, va_list args)
11 {
12     char buf[MAX_KPRINTF_BUF_SIZE];
13     if (!fmt)
14         return;
15     char log_level = '0';
16     char expanded_fmt[MAX_XFMT_SIZE];
17
18     if (*fmt == '\x1b') {
19         log_level = *(++fmt);
20         fmt++;
21     }
22
23     switch (log_level) {
24         case '0':
25             ksnprintf(expanded_fmt,
26                       MAX_XFMT_SIZE,
27                       "[%s] (%s) %s",
28                       "INFO",
29                       component,
30                       fmt);
31             break;
32         case '1':
33             // tty_set_theme(VGA_COLOR_BROWN, current_theme >> 12);
34             ksnprintf(expanded_fmt,
35                       MAX_XFMT_SIZE,
36                       "\033[6;0m[%s] (%s) %s\033[39;49m",
37                       "WARN",
38                       component,
39                       fmt);
40             break;
41         case '2':
42             // tty_set_theme(VGA_COLOR_LIGHT_RED, current_theme >> 12);
43             ksnprintf(expanded_fmt,
44                       MAX_XFMT_SIZE,
45                       "\033[12;0m[%s] (%s) %s\033[39;49m",
46                       "EROR",
47                       component,
48                       fmt);
49             break;
50         case '3':
51             // tty_set_theme(VGA_COLOR_LIGHT_BLUE, current_theme >> 12);
52             ksnprintf(expanded_fmt,
53                       MAX_XFMT_SIZE,
54                       "\033[9;0m[%s] (%s) %s\033[39;49m",
55                       "DEBG",
56                       component,
57                       fmt);
58             break;
59         default:
60             ksnprintf(expanded_fmt,
61                       MAX_XFMT_SIZE,
62                       "[%s] (%s) %s",
63                       "LOG",
64                       component,
65                       fmt);
66             break;
67     }
68
69     __ksprintf_internal(buf, expanded_fmt, MAX_KPRINTF_BUF_SIZE, args);
70     console_write_str(buf);
71 }
72
73 void
74 kprint_panic(const char* fmt, ...)
75 {
76     char buf[MAX_KPRINTF_BUF_SIZE];
77     va_list args;
78     va_start(args, fmt);
79
80     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
81     tty_clear_line(24);
82
83     __ksprintf_internal(buf, fmt, MAX_KPRINTF_BUF_SIZE, args);
84     tty_put_str_at(buf, 0, 24);
85
86     va_end(args);
87 }
88
89 void
90 kprint_hex(const void* buffer, unsigned int size)
91 {
92     unsigned char* data = (unsigned char*)buffer;
93     char buf[16];
94     char ch_cache[16];
95     unsigned int ptr = 0;
96     int i;
97
98     ch_cache[0] = '|';
99     ch_cache[1] = ' ';
100     while (size) {
101         ksnprintf(buf, 64, " %.4p: ", ptr);
102         console_write_str(buf);
103         for (i = 0; i < 8 && size; i++, size--, ptr++) {
104             unsigned char c = *(data + ptr) & 0xff;
105             ch_cache[2 + i] = (32 <= c && c < 127) ? c : '.';
106             ksnprintf(buf, 64, "%.2x  ", c);
107             console_write_str(buf);
108         }
109         ch_cache[2 + i] = '\0';
110         console_write_str(ch_cache);
111         console_write_char('\n');
112     }
113 }