feat: standard vga support (mode switching, framebuffer remapping)
[lunaix-os.git] / lunaix-os / hal / term / lcntls / ansi_cntl.c
1 #include <hal/term.h>
2
3 #include <lunaix/process.h>
4
5 #define CTRL_MNEMO(chr) (chr - 'A' + 1)
6
7 static inline int
8 __ansi_actcontrol(struct term* termdev, char chr)
9 {
10     struct linebuffer* lbuf = &termdev->line;
11     switch (chr) {
12         case '\0':            // EOL
13         case CTRL_MNEMO('D'): // EOF
14             return 0;
15
16         case CTRL_MNEMO('C'): // INTR
17             signal_send(termdev->fggrp, SIGINT);
18             break;
19
20         case '\r': // CR
21             termdev->line.ptr = 0;
22             return 1;
23
24         case '\x08': // ERASE
25             return line_put_next(lbuf, chr, -1);
26
27         case CTRL_MNEMO('Q'): // QUIT
28             signal_send(termdev->fggrp, SIGKILL);
29             return 1;
30
31         case CTRL_MNEMO('Z'): // SUSP
32             signal_send(termdev->fggrp, SIGSTOP);
33             return 1;
34
35         default:
36             if ((int)chr < 32) {
37                 line_put_next(lbuf, '^', 0);
38                 chr += 64;
39             }
40             break;
41     }
42
43     return line_put_next(lbuf, chr, 0);
44 }
45
46 static size_t
47 ansi_lcntl_process(struct term* termdev, char* line, size_t len)
48 {
49     size_t i = 0;
50     while (i < len && __ansi_actcontrol(termdev, line[i])) {
51         i++;
52     }
53
54     return i;
55 }
56
57 struct term_lcntl ansi_line_controller = { .apply = ansi_lcntl_process };