12 #include <hilti/rt/exception.h> 13 #include <hilti/rt/fiber.h> 14 #include <hilti/rt/result.h> 15 #include <hilti/rt/type-info.h> 16 #include <hilti/rt/types/bytes.h> 17 #include <hilti/rt/types/null.h> 18 #include <hilti/rt/types/port.h> 19 #include <hilti/rt/types/reference.h> 20 #include <hilti/rt/types/struct.h> 22 #include <spicy/rt/filter.h> 23 #include <spicy/rt/global-state.h> 24 #include <spicy/rt/mime.h> 25 #include <spicy/rt/parser-fwd.h> 26 #include <spicy/rt/sink.h> 27 #include <spicy/rt/typedefs.h> 32 enum class Direction { Originator, Responder, Both, Undef };
38 inline std::string to_string(const ::spicy::rt::Direction& x, adl::tag ) {
40 case spicy::rt::Direction::Originator:
return "originator";
41 case spicy::rt::Direction::Responder:
return "responder";
42 case spicy::rt::Direction::Both:
return "both";
43 case spicy::rt::Direction::Undef:
return "undefined";
53 inline std::ostream& operator<<(std::ostream& out,
const Direction& d) {
return out <<
hilti::rt::to_string(d); }
61 ParserPort(std::tuple<hilti::rt::Port, Direction> args) : port(std::get<0>(args)), direction(std::get<1>(args)) {}
72 if ( x.direction == spicy::rt::Direction::Both )
75 return fmt(
"%s (%s direction)", x.port, x.direction);
91 static auto test(
int) -> decltype(
92 std::declval<U>().__on_0x25_gap(std::declval<uint64_t>(), std::declval<uint64_t>()), std::true_type());
95 static std::false_type test(...);
96 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
102 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_skipped(std::declval<uint64_t>()), std::true_type());
104 static std::false_type test(...);
105 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
111 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_overlap(std::declval<uint64_t>(),
112 std::declval<const hilti::rt::Bytes&>(),
113 std::declval<const hilti::rt::Bytes&>()),
116 static std::false_type test(...);
117 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
123 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_undelivered(std::declval<uint64_t>(),
124 std::declval<const hilti::rt::Bytes&>()),
127 static std::false_type test(...);
128 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
140 Parser(std::string name,
bool is_public, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
143 : name(std::move(name)),
144 is_public(is_public),
146 parse2(std::move(parse2)),
148 context_new(context_new),
150 description(std::move(description)),
151 mime_types(std::move(mime_types)),
152 ports(std::move(ports)) {}
154 Parser(std::string name,
bool is_public, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
157 : name(std::move(name)),
158 is_public(is_public),
160 parse2(std::move(parse2)),
163 description(std::move(description)),
164 mime_types(std::move(mime_types)),
165 ports(std::move(ports)) {}
170 :
Parser(std::move(name), is_public,
nullptr, std::move(parse2),
nullptr,
nullptr, type, std::move(description),
171 std::move(mime_types), std::move(ports)) {}
176 :
Parser(std::move(name), is_public,
nullptr, std::move(parse2),
nullptr, context_new, type,
177 std::move(description), std::move(mime_types), std::move(ports)) {}
193 return (*context_new)();
216 Parse1Function parse1{};
230 Parse3Function parse3{};
236 ContextNewFunction context_new =
nullptr;
262 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)>>
__hook_gap;
270 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t)>>
__hook_skipped;
273 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes&)>>
278 inline auto parsers() {
279 const auto& parsers = detail::globalState()->parsers;
281 std::vector<const Parser*> public_parsers;
282 std::copy_if(parsers.begin(), parsers.end(), std::back_inserter(public_parsers),
283 [](
const auto& p) {
return p->is_public; });
285 return public_parsers;
333 template<
typename UnitRef>
335 std::string linker_scope,
UnitRef ) {
341 globalState()->parsers.emplace_back(&p);
343 using unit_type =
typename UnitRef::element_type;
346 ! std::is_base_of<hilti::rt::trait::hasParameters, unit_type>::value )
347 p.
__parse_sink = sink::detail::parseFunction<unit_type>();
350 p.
__hook_gap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_gap, uint64_t, uint64_t>();
353 p.
__hook_skipped = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_skipped, uint64_t>();
356 p.
__hook_overlap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_overlap, uint64_t,
360 p.
__hook_undelivered = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_undelivered, uint64_t,
361 const hilti::rt::Bytes&>();
371 bool trim,
const std::optional<hilti::rt::RecoverableFailure>& error);
463 inline void backtrack() {
throw Backtrack(); }
476 std::optional<hilti::rt::stream::SafeConstIterator> unitFind(
478 const std::optional<hilti::rt::stream::SafeConstIterator>& i,
const hilti::rt::Bytes& needle,
479 hilti::rt::stream::Direction d);
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: reference.h:663
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)> > __hook_gap
Definition: parser.h:262
hilti::rt::Vector< ParserPort > ports
Definition: parser.h:253
std::string linker_scope
Definition: parser.h:209
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &, const hilti::rt::Bytes &)> > __hook_overlap
Definition: parser.h:267
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:42
Definition: stream.h:1001
std::optional< detail::ParseSinkFunction > __parse_sink
Definition: parser.h:259
Definition: reference.h:345
std::optional< UnitContext > createContext() const
Definition: parser.h:191
Definition: deferred-expression.h:41
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &)> > __hook_undelivered
Definition: parser.h:274
Definition: location.h:94
bool is_public
Definition: parser.h:202
Definition: type-info.h:1143
hilti::rt::any parse2
Definition: parser.h:222
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t)> > __hook_skipped
Definition: parser.h:270
hilti::rt::Vector< MIMEType > mime_types
Definition: parser.h:248
std::string description
Definition: parser.h:243
std::string name
Definition: parser.h:199