From 1b347298f118e4e78e7cef41096623913c9e640e Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Sat, 8 May 2021 19:07:29 +0200 Subject: [PATCH] LibVT: Add state machine file for the new parser The parser itself will be included in a later commit. --- Userland/Libraries/LibVT/StateMachine.txt | 233 ++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 Userland/Libraries/LibVT/StateMachine.txt diff --git a/Userland/Libraries/LibVT/StateMachine.txt b/Userland/Libraries/LibVT/StateMachine.txt new file mode 100644 index 0000000000..ffa300ec01 --- /dev/null +++ b/Userland/Libraries/LibVT/StateMachine.txt @@ -0,0 +1,233 @@ +// This file is used for automatically generating the ANSI escape sequence state machine +// +// The description of the state machine is taken from https://vt100.net/emu/dec_ansi_parser +// with added support for UTF-8 parsing + +@name VTParserStateMachine +@namespace VT +@begin Ground + +@anywhere { + 0x18 => (Ground, Execute) + 0x1a => (Ground, Execute) + [0x80..0x8f] => (Ground, Execute) + [0x91..0x97] => (Ground, Execute) + 0x99 => (Ground, Execute) + 0x9a => (Ground, Execute) + 0x9c => (Ground, _) + + 0x1b => (Escape, _) + + 0x90 => (DcsEntry, _) + + 0x98 => (SosPmApcString, _) + 0x9e => (SosPmApcString, _) + 0x9f => (SosPmApcString, _) + + 0x9d => (OscString, _) + + 0x9b => (CsiEntry, _) +} + +Ground { + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x7f] => (_, Print) + + [0xa0..0xc1] => (Ground, FailUTF8) + [0xc2..0xdf] => (UTF81ByteNeeded, BeginUTF8) + [0xe0..0xef] => (UTF82BytesNeeded, BeginUTF8) + [0xf0..0xf4] => (UTF83BytesNeeded, BeginUTF8) + [0xf5..0xff] => (Ground, FailUTF8) +} + +UTF81ByteNeeded { + [0x00..0x7f] => (Ground, FailUTF8) + [0x80..0xbf] => (Ground, PrintUTF8) + [0xc0..0xff] => (Ground, FailUTF8) +} + +UTF82BytesNeeded { + [0x00..0x7f] => (Ground, FailUTF8) + [0x80..0xbf] => (UTF81ByteNeeded, AdvanceUTF8) + [0xc0..0xff] => (Ground, FailUTF8) +} + +UTF83BytesNeeded { + [0x00..0x7f] => (Ground, FailUTF8) + [0x80..0xbf] => (UTF82BytesNeeded, AdvanceUTF8) + [0xc0..0xff] => (Ground, FailUTF8) +} + +Escape { + @entry Clear + + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x2f] => (EscapeIntermediate, Collect) + [0x30..0x4f] => (Ground, EscDispatch) + 0x50 => (DcsEntry, _) + [0x51..0x57] => (Ground, EscDispatch) + 0x58 => (SosPmApcString, _) + 0x59 => (Ground, EscDispatch) + 0x5a => (Ground, EscDispatch) + 0x5b => (CsiEntry, _) + 0x5c => (Ground, EscDispatch) + 0x5d => (OscString, _) + 0x5e => (SosPmApcString, _) + 0x5f => (SosPmApcString, _) + [0x60..0x7e] => (Ground, EscDispatch) + 0x7f => (_, _) +} + +EscapeIntermediate { + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + [0x20..0x2f] => (_, Collect) + [0x30..0x7e] => (Ground, EscDispatch) + 0x7f => (_, _) +} + +CsiEntry { + @entry Clear + + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x2f] => (CsiIntermediate, Execute) + [0x30..0x39] => (CsiParam, Param) + 0x3a => (CsiIgnore, _) + 0x3b => (CsiParam, Param) + [0x3c..0x3f] => (CsiParam, Collect) + [0x40..0x7e] => (Ground, CsiDispatch) + 0x7f => (_, _) +} + +CsiIgnore { + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x3f] => (_, _) + [0x40..0x7e] => (Ground, _) + 0x7f => (_, _) +} + +CsiParam { + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x2f] => (CsiIntermediate, Collect) + [0x30..0x39] => (_, Param) + 0x3a => (CsiIgnore, _) + 0x3b => (_, Param) + [0x3c..0x3f] => (CsiIgnore, _) + [0x40..0x7e] => (Ground, CsiDispatch) + 0x7f => (_, _) +} + +CsiIntermediate { + [0x00..0x17] => (_, Execute) + 0x19 => (_, Execute) + [0x1c..0x1f] => (_, Execute) + + [0x20..0x2f] => (_, Collect) + [0x30..0x3f] => (CsiIgnore, _) + [0x40..0x7e] => (Ground, CsiDispatch) + 0x7f => (_, _) +} + +DcsEntry { + @entry Clear + + [0x00..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + + [0x20..0x2f] => (DcsIntermediate, Collect) + [0x30..0x39] => (DcsParam, Param) + 0x3a => (DcsIgnore, _) + 0x3b => (DcsParam, Param) + [0x3c..0x3f] => (DcsParam, Collect) + [0x40..0x7e] => (DcsPassthrough, _) + 0x7f => (_, _) +} + +DcsIntermediate { + [0x00..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + + [0x20..0x2f] => (_, Collect) + [0x30..0x3f] => (DcsIgnore, _) + [0x40..0x7e] => (DcsPassthrough, _) + 0x7f => (_, _) +} + +DcsIgnore { + [0x00..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + [0x20..0x7f] => (_, _) + 0x9c => (Ground, _) +} + +DcsParam { + [0x00..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + + [0x20..0x2f] => (DcsIntermediate, Collect) + [0x30..0x39] => (_, Param) + 0x3a => (DcsIgnore, _) + 0x3b => (_, Param) + [0x3c..0x3f] => (DcsIgnore, _) + [0x40..0x7e] => (DcsPassthrough, _) + 0x7f => (_, _) +} + +DcsPassthrough { + @entry Hook + + [0x00..0x17] => (_, Put) + 0x19 => (_, Put) + [0x1c..0x1f] => (_, Put) + [0x20..0x7e] => (_, Put) + 0x7f => (_, _) + 0x9c => (Ground, _) + + @exit Unhook +} + +SosPmApcString { + [0x00..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + [0x20..0x7f] => (_, _) + 0x9c => (Ground, _) +} + +OscString { + @entry OscStart + + [0x00..0x06] => (_, _) + + // While the standard says that only ST can terminate the string, + // xterm uses BEL (0x07) + 0x07 => (Ground, _) + + [0x08..0x17] => (_, _) + 0x19 => (_, _) + [0x1c..0x1f] => (_, _) + + [0x20..0x7f] => (_, OscPut) + 0x9c => (Ground, _) + @exit OscEnd +}