EscapeSequenceParser.h 2.3 KB

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