3#include "di/container/string/string.h"
4#include "di/container/string/string_view.h"
5#include "di/function/container/function.h"
6#include "di/reflect/prelude.h"
7#include "di/vocab/variant/prelude.h"
17 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<PrintableCharacter>) {
29 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<DCS>) {
41 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<OSC>) {
51 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<APC>) {
52 return di::make_fields<
"APC">(di::field<
"data", &
APC::data>);
63 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<CSI>) {
75 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<Escape>) {
87 constexpr friend auto tag_invoke(di::Tag<di::reflect>, di::InPlaceType<ControlCharacter>) {
93using ParserResult = di::Variant<PrintableCharacter, DCS, OSC, APC, CSI, Escape, ControlCharacter>;
104 -> di::Span<ParserResult>;
112#define __ENUMERATE_STATES(M) \
115 M(EscapeIntermediate, escape_intermediate) \
116 M(CsiEntry, csi_entry) \
117 M(CsiParam, csi_param) \
118 M(CsiIntermediate, csi_intermediate) \
119 M(CsiIgnore, csi_ignore) \
121 M(DcsEntry, dcs_entry) \
122 M(DcsParam, dcs_param) \
123 M(DcsIntermediate, dcs_intermediate) \
124 M(DcsPassthrough, dcs_passthrough) \
125 M(DcsIgnore, dcs_ignore) \
126 M(OscString, osc_string) \
127 M(ApcString, apc_string) \
128 M(SosPmString, sos_pm_string)
131#define __ENUMERATE_STATE(N, n) N,
133#undef __ENUMERATE_STATE
136#define __ENUMERATE_STATE(N, n) void n##_state(c32 code_point);
138#undef __ENUMERATE_STATE
140 void ignore(c32 code_point);
141 void print(c32 code_point);
142 void execute(c32 code_point);
144 void collect(c32 code_point);
145 void param(c32 code_point);
146 void esc_dispatch(c32 code_point);
147 void csi_dispatch(c32 code_point);
149 void put(c32 code_point);
152 void osc_put(c32 code_point);
155 void apc_put(c32 code_point);
157 void output_ss3(c32 code_point);
159 void transition(State state);
161 void on_input(c32 code_point);
163 void add_param(di::Optional<u32> param);
165 State m_last_state { State::Ground };
166 State m_next_state { State::Ground };
167 di::Function<void()> m_on_state_exit;
169 di::String m_intermediate;
170 di::String m_current_param;
173 bool m_last_separator_was_colon {
false };
174 bool m_saw_legacy_string_terminator {
false };
177 di::Vector<ParserResult> m_result;
Definition escape_sequence_parser.h:95
auto parse_application_escape_sequences(di::StringView data) -> di::Span< ParserResult >
Definition escape_sequence_parser.cpp:662
auto parse_input_escape_sequences(di::StringView data, Feature features=Feature::None, bool flush=true) -> di::Span< ParserResult >
Definition escape_sequence_parser.cpp:673
Mode
Definition escape_sequence_parser.h:97
@ Input
Definition escape_sequence_parser.h:99
@ Application
Definition escape_sequence_parser.h:98
#define __ENUMERATE_STATES(M)
Definition escape_sequence_parser.h:112
#define __ENUMERATE_STATE(N, n)
Definition escape_sequence_parser.h:131
Definition clipboard.h:10
di::Variant< PrintableCharacter, DCS, OSC, APC, CSI, Escape, ControlCharacter > ParserResult
Definition escape_sequence_parser.h:93
Feature
Definition features.h:8
@ None
Definition features.h:9
Definition escape_sequence_parser.h:46
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< APC >)
Definition escape_sequence_parser.h:51
auto operator==(APC const &) const -> bool=default
di::String data
Definition escape_sequence_parser.h:47
Definition escape_sequence_parser.h:56
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< CSI >)
Definition escape_sequence_parser.h:63
auto operator==(CSI const &) const -> bool=default
c32 terminator
Definition escape_sequence_parser.h:59
di::String intermediate
Definition escape_sequence_parser.h:57
Params params
Definition escape_sequence_parser.h:58
Definition escape_sequence_parser.h:81
bool was_in_escape
Definition escape_sequence_parser.h:83
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< ControlCharacter >)
Definition escape_sequence_parser.h:87
auto operator==(ControlCharacter const &) const -> bool=default
u32 code_point
Definition escape_sequence_parser.h:82
Definition escape_sequence_parser.h:22
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< DCS >)
Definition escape_sequence_parser.h:29
di::String intermediate
Definition escape_sequence_parser.h:23
auto operator==(DCS const &) const -> bool=default
Params params
Definition escape_sequence_parser.h:24
di::String data
Definition escape_sequence_parser.h:25
Definition escape_sequence_parser.h:69
c32 terminator
Definition escape_sequence_parser.h:71
auto operator==(Escape const &) const -> bool=default
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< Escape >)
Definition escape_sequence_parser.h:75
di::String intermediate
Definition escape_sequence_parser.h:70
Definition escape_sequence_parser.h:35
auto operator==(OSC const &) const -> bool=default
di::StringView terminator
Definition escape_sequence_parser.h:37
di::String data
Definition escape_sequence_parser.h:36
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< OSC >)
Definition escape_sequence_parser.h:41
Definition escape_sequence_parser.h:12
constexpr friend auto tag_invoke(di::Tag< di::reflect >, di::InPlaceType< PrintableCharacter >)
Definition escape_sequence_parser.h:17
c32 code_point
Definition escape_sequence_parser.h:13
auto operator==(PrintableCharacter const &) const -> bool=default