Iros
 
Loading...
Searching...
No Matches
escape_sequence_parser.h
Go to the documentation of this file.
1#pragma once
2
8#include "ttx/params.h"
9
10namespace ttx {
13
14 auto operator==(PrintableCharacter const&) const -> bool = default;
15
17 return di::make_fields<"PrintableCharacter">(di::field<"code_point", &PrintableCharacter::code_point>);
18 }
19};
20
21struct DCS {
25
26 auto operator==(DCS const&) const -> bool = default;
27
29 return di::make_fields<"DCS">(di::field<"intermediate", &DCS::intermediate>, di::field<"params", &DCS::params>,
30 di::field<"data", &DCS::data>);
31 }
32};
33
34struct CSI {
38
39 auto operator==(CSI const&) const -> bool = default;
40
42 return di::make_fields<"CSI">(di::field<"intermediate", &CSI::intermediate>, di::field<"params", &CSI::params>,
43 di::field<"terminator", &CSI::terminator>);
44 }
45};
46
47struct Escape {
50
51 auto operator==(Escape const&) const -> bool = default;
52
54 return di::make_fields<"Escape">(di::field<"intermediate", &Escape::intermediate>,
55 di::field<"terminator", &Escape::terminator>);
56 }
57};
58
60 u32 code_point { 0 }; // Not a c32, so that it will be printed as a decimal.
61 bool was_in_escape { false }; // This is true if the control character occurred in the middle of an escape sequence.
62
63 auto operator==(ControlCharacter const&) const -> bool = default;
64
66 return di::make_fields<"ControlCharacter">(di::field<"code_point", &ControlCharacter::code_point>,
68 }
69};
70
72
74public:
75 enum class Mode {
78 };
79
82
83private:
84// VT500-Series parser states from https://vt100.net/emu/dec_ansi_parser
85// For parsing input escape sequences, the following state is added:
86// - SS3
87// Additionally, non CSI related states are ignored when parsing input
88// sequences.
89#define __ENUMERATE_STATES(M) \
90 M(Ground, ground) \
91 M(Escape, escape) \
92 M(EscapeIntermediate, escape_intermediate) \
93 M(CsiEntry, csi_entry) \
94 M(CsiParam, csi_param) \
95 M(CsiIntermediate, csi_intermediate) \
96 M(CsiIgnore, csi_ignore) \
97 M(DcsEntry, dcs_entry) \
98 M(DcsParam, dcs_param) \
99 M(DcsIntermediate, dcs_intermediate) \
100 M(DcsPassthrough, dcs_passthrough) \
101 M(DcsIgnore, dcs_ignore) \
102 M(OscString, osc_string) \
103 M(SosPmApcString, sos_pm_apc_string) \
104 M(Ss3, ss3)
105
106 enum class State {
107#define __ENUMERATE_STATE(N, n) N,
109#undef __ENUMERATE_STATE
110 };
111
112#define __ENUMERATE_STATE(N, n) void n##_state(c32 code_point);
113 __ENUMERATE_STATES(__ENUMERATE_STATE)
114#undef __ENUMERATE_STATE
115
116 void ignore(c32 code_point);
117 void print(c32 code_point);
118 void execute(c32 code_point);
119 void clear();
120 void collect(c32 code_point);
121 void param(c32 code_point);
122 void esc_dispatch(c32 code_point);
123 void csi_dispatch(c32 code_point);
124 void hook();
125 void put(c32 code_point);
126 void unhook();
127 void osc_start();
128 void osc_put(c32 code_point);
129 void osc_end();
130 void output_ss3(c32 code_point);
131
132 void transition(State state);
133
134 void on_input(c32 code_point);
135
136 void add_param(di::Optional<u32> param);
137
138 State m_last_state { State::Ground };
139 State m_next_state { State::Ground };
140 di::Function<void()> m_on_state_exit;
141
142 di::String m_intermediate;
143 di::String m_current_param;
144 di::String m_data;
145 Params m_params;
146 bool m_last_separator_was_colon { false };
147 Mode m_mode { Mode::Application };
148 di::Vector<ParserResult> m_result;
149};
150}
Definition vector_forward_declaration.h:8
Definition variant_forward_declaration.h:6
Definition escape_sequence_parser.h:73
auto parse_input_escape_sequences(di::StringView data, bool flush=true) -> di::Vector< ParserResult >
Definition escape_sequence_parser.cpp:612
auto parse_application_escape_sequences(di::StringView data) -> di::Vector< ParserResult >
Definition escape_sequence_parser.cpp:603
Mode
Definition escape_sequence_parser.h:75
@ Input
Definition escape_sequence_parser.h:77
@ Application
Definition escape_sequence_parser.h:76
Definition params.h:67
#define __ENUMERATE_STATE(N, n)
#define __ENUMERATE_STATES(M)
Definition escape_sequence_parser.h:89
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
char32_t c32
Definition char.h:6
__UINT32_TYPE__ u32
Definition integers.h:11
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto make_fields
Definition field.h:80
constexpr auto field
Definition field.h:42
Definition escape_sequence_parser.cpp:18
di::Variant< PrintableCharacter, DCS, CSI, Escape, ControlCharacter > ParserResult
Definition escape_sequence_parser.h:71
Definition in_place_type.h:5
Definition escape_sequence_parser.h:34
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< CSI >)
Definition escape_sequence_parser.h:41
auto operator==(CSI const &) const -> bool=default
c32 terminator
Definition escape_sequence_parser.h:37
di::String intermediate
Definition escape_sequence_parser.h:35
Params params
Definition escape_sequence_parser.h:36
Definition escape_sequence_parser.h:59
bool was_in_escape
Definition escape_sequence_parser.h:61
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< ControlCharacter >)
Definition escape_sequence_parser.h:65
auto operator==(ControlCharacter const &) const -> bool=default
u32 code_point
Definition escape_sequence_parser.h:60
Definition escape_sequence_parser.h:21
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< DCS >)
Definition escape_sequence_parser.h:28
di::String intermediate
Definition escape_sequence_parser.h:22
auto operator==(DCS const &) const -> bool=default
Params params
Definition escape_sequence_parser.h:23
di::String data
Definition escape_sequence_parser.h:24
Definition escape_sequence_parser.h:47
c32 terminator
Definition escape_sequence_parser.h:49
auto operator==(Escape const &) const -> bool=default
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Escape >)
Definition escape_sequence_parser.h:53
di::String intermediate
Definition escape_sequence_parser.h:48
Definition escape_sequence_parser.h:11
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< PrintableCharacter >)
Definition escape_sequence_parser.h:16
c32 code_point
Definition escape_sequence_parser.h:12
auto operator==(PrintableCharacter const &) const -> bool=default