diff options
author | Daniel Bertalan <dani@danielbertalan.dev> | 2021-05-08 20:37:43 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-16 11:50:56 +0200 |
commit | be519022c3326f7d5cec964b6d3b72d419b0f522 (patch) | |
tree | e8d4698840276142443a0d0b1c99022bc6ccb2cf /Kernel | |
parent | 1b347298f118e4e78e7cef41096623913c9e640e (diff) | |
download | serenity-be519022c3326f7d5cec964b6d3b72d419b0f522.zip |
LibVT: Implement new ANSI escape sequence parser
This commit replaces the former, hand-written parser with a new one that
can be generated automatically according to a state change diagram.
The new `EscapeSequenceParser` class provides a more ergonomic interface
to dealing with escape sequences. This interface has been inspired by
Alacritty's [vte library](https://github.com/alacritty/vte/).
I tried to avoid changing the application logic inside the `Terminal`
class. While this code has not been thoroughly tested, I can't find
regressions in the basic command line utilities or `vttest`.
`Terminal` now displays nicer debug messages when it encounters an
unknown escape sequence. Defensive programming and bounds checks have
been added where we access parameters, and as a result, we can now
endure 4-5 seconds of `cat /dev/urandom`. :D
We generate EscapeSequenceStateMachine.h when building the in-kernel
LibVT, and we assume that the file is already in place when the userland
library is being built. This will probably cause problems later on, but
I can't find a way to do it nicely.
Diffstat (limited to 'Kernel')
-rw-r--r-- | Kernel/CMakeLists.txt | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 5bb5e189b7..c2c3a4cc34 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -278,9 +278,13 @@ set(ELF_SOURCES ../Userland/Libraries/LibELF/Validation.cpp ) +generate_state_machine(../Userland/Libraries/LibVT/StateMachine.txt ../Userland/Libraries/LibVT/EscapeSequenceStateMachine.h) + set(VT_SOURCES ../Userland/Libraries/LibVT/Terminal.cpp ../Userland/Libraries/LibVT/Line.cpp + ../Userland/Libraries/LibVT/EscapeSequenceStateMachine.h + ../Userland/Libraries/LibVT/EscapeSequenceParser.cpp ) set(KEYBOARD_SOURCES |