Serenity Operating System
at master 78 lines 2.4 kB view raw
1/* 2 * Copyright (c) 2021-2022, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Debug.h> 10#include <AK/Format.h> 11#include <AK/Platform.h> 12#include <AK/Span.h> 13#include <AK/Types.h> 14#include <AK/Vector.h> 15#include <LibVT/EscapeSequenceStateMachine.h> 16 17namespace VT { 18class EscapeSequenceExecutor { 19public: 20 virtual ~EscapeSequenceExecutor() = default; 21 22 using Parameters = ReadonlySpan<unsigned>; 23 using Intermediates = ReadonlyBytes; 24 using OscParameter = ReadonlyBytes; 25 using OscParameters = ReadonlySpan<OscParameter>; 26 27 virtual void emit_code_point(u32) = 0; 28 virtual void execute_control_code(u8) = 0; 29 virtual void execute_escape_sequence(Intermediates intermediates, bool ignore, u8 last_byte) = 0; 30 virtual void execute_csi_sequence(Parameters parameters, Intermediates intermediates, bool ignore, u8 last_byte) = 0; 31 virtual void execute_osc_sequence(OscParameters parameters, u8 last_byte) = 0; 32 virtual void dcs_hook(Parameters parameters, Intermediates intermediates, bool ignore, u8 last_byte) = 0; 33 virtual void receive_dcs_char(u8 byte) = 0; 34 virtual void execute_dcs_sequence() = 0; 35}; 36 37class EscapeSequenceParser { 38public: 39 explicit EscapeSequenceParser(EscapeSequenceExecutor&); 40 ~EscapeSequenceParser() = default; 41 42 ALWAYS_INLINE void on_input(u8 byte) 43 { 44 dbgln_if(ESCAPE_SEQUENCE_DEBUG, "on_input {:02x}", byte); 45 m_state_machine.advance(byte); 46 } 47 48private: 49 static constexpr size_t MAX_INTERMEDIATES = 2; 50 static constexpr size_t MAX_PARAMETERS = 16; 51 static constexpr size_t MAX_OSC_PARAMETERS = 16; 52 53 using Intermediates = EscapeSequenceExecutor::Intermediates; 54 using OscParameter = EscapeSequenceExecutor::OscParameter; 55 56 void perform_action(EscapeSequenceStateMachine::Action, u8); 57 58 EscapeSequenceExecutor& m_executor; 59 EscapeSequenceStateMachine m_state_machine; 60 61 u32 m_code_point { 0 }; 62 63 u8 m_intermediates[MAX_INTERMEDIATES]; 64 u8 m_intermediate_idx { 0 }; 65 66 Intermediates intermediates() const { return { m_intermediates, m_intermediate_idx }; } 67 Vector<OscParameter> osc_parameters() const; 68 69 Vector<unsigned, 4> m_param_vector; 70 unsigned m_param { 0 }; 71 72 Vector<u8> m_osc_parameter_indexes; 73 Vector<u8, 16> m_osc_raw; 74 75 bool m_ignoring { false }; 76}; 77 78}