Serenity Operating System
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}