EscapeSequenceParser.h 2.3 KB

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