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>
21 #include <hilti/rt/types/tuple.h>
22 #include <hilti/rt/util.h>
24 #include <spicy/rt/filter.h>
25 #include <spicy/rt/global-state.h>
26 #include <spicy/rt/mime.h>
27 #include <spicy/rt/parser-fwd.h>
28 #include <spicy/rt/sink.h>
29 #include <spicy/rt/typedefs.h>
34 HILTI_RT_ENUM(Direction, Originator, Responder, Both, Undef);
38 namespace hilti::rt::detail::adl {
40 inline std::string
to_string(const ::spicy::rt::Direction& x, adl::tag ) {
41 switch ( x.value() ) {
42 case spicy::rt::Direction::Originator:
return "originator";
43 case spicy::rt::Direction::Responder:
return "responder";
44 case spicy::rt::Direction::Both:
return "both";
45 case spicy::rt::Direction::Undef:
return "undefined";
55 inline std::ostream& operator<<(std::ostream& out,
const Direction& d) {
return out <<
hilti::rt::to_string(d); }
64 : port(hilti::rt::tuple::get<0>(args)), direction(hilti::rt::tuple::get<1>(args)) {}
71 namespace hilti::rt::detail::adl {
75 if ( x.direction == spicy::rt::Direction::Both )
78 return fmt(
"%s (%s direction)", x.port, x.direction);
94 static auto test(
int) -> decltype(
95 std::declval<U>().__on_0x25_gap(std::declval<uint64_t>(), std::declval<uint64_t>()), std::true_type());
98 static std::false_type test(...);
99 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
105 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_skipped(std::declval<uint64_t>()), std::true_type());
107 static std::false_type test(...);
108 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
114 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_overlap(std::declval<uint64_t>(),
115 std::declval<const hilti::rt::Bytes&>(),
116 std::declval<const hilti::rt::Bytes&>()),
119 static std::false_type test(...);
120 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
126 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_undelivered(std::declval<uint64_t>(),
127 std::declval<const hilti::rt::Bytes&>()),
130 static std::false_type test(...);
131 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
254 std::string prepare_block =
"spicy/prepare/block/";
255 std::string prepare_input =
"spicy/prepare/input/";
256 std::string prepare_stream =
"spicy/prepare/stream/";
258 operator bool()
const {
260 return ! prepare_input.empty();
299 void _initProfiling();
303 inline auto parsers() {
304 const auto& parsers = detail::globalState()->parsers;
306 std::vector<const Parser*> public_parsers;
307 std::ranges::copy_if(parsers, std::back_inserter(public_parsers), [](
const auto& p) {
return p->is_public; });
309 return public_parsers;
313 inline const auto& parserNames() {
return detail::globalState()->parsers_by_name; }
340 const std::optional<uint64_t>& linker_scope = {});
347 ParseError(std::string_view msg, std::string_view location =
"") : RecoverableFailure(msg, location) {}
375 extern void accept_input();
383 extern void decline_input(
const std::string& reason);
400 template<
typename UnitRef>
402 uint64_t linker_scope,
UnitRef ,
409 globalState()->parsers.emplace_back(&p);
411 using unit_type =
typename UnitRef::element_type;
414 ! std::is_base_of_v<hilti::rt::trait::hasParameters, unit_type> )
420 if constexpr ( detail::has_on_gap<unit_type>::value )
422 (u.
as<unit_type>()->__on_0x25_gap)(seq, len);
425 if constexpr ( detail::has_on_skipped<unit_type>::value )
427 (u.
as<unit_type>()->__on_0x25_skipped)(seq);
430 if constexpr ( detail::has_on_overlap<unit_type>::value )
433 (u.
as<unit_type>()->__on_0x25_overlap)(seq, old, new_);
436 if constexpr ( detail::has_on_undelivered<unit_type>::value )
439 (u.
as<unit_type>()->__on_0x25_undelivered)(seq, bytes);
448 const std::optional<hilti::rt::stream::SafeConstIterator>& begin,
451 const std::optional<hilti::rt::RecoverableFailure>& error);
499 std::string_view location,
562 inline void backtrack() {
throw Backtrack(); }
575 std::optional<hilti::rt::stream::SafeConstIterator> unitFind(
577 const std::optional<hilti::rt::stream::SafeConstIterator>& i,
const hilti::rt::Bytes& needle,
578 hilti::rt::stream::Direction d);
594 uint64_t size,
bool eod_ok, std::string_view location,
Definition: reference.h:694
T * as() const
Definition: reference.h:708
Definition: reference.h:376
Definition: stream.h:1167
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:13
std::string to_string(T &&x)
Definition: extension-points.h:26
std::tuple< std::optional< Ts >... > Tuple
Definition: tuple.h:24
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:45
Definition: type-info.h:1273
struct spicy::rt::Parser::@2 profiler_tags
ContextNewFunction context_new
Definition: parser.h:247
bool is_public
Definition: parser.h:213
Parse1Function parse1
Definition: parser.h:227
void(* __hook_undelivered)(const hilti::rt::StrongReferenceGeneric &, uint64_t, const hilti::rt::Bytes &)
Definition: parser.h:296
detail::ParseSinkFunction __parse_sink
Definition: parser.h:283
void(* __hook_skipped)(const hilti::rt::StrongReferenceGeneric &, uint64_t)
Definition: parser.h:293
hilti::rt::Vector< ParserPort > ports
Definition: parser.h:277
std::string_view name
Definition: parser.h:210
std::string description
Definition: parser.h:267
std::optional< UnitContext > createContext() const
Definition: parser.h:202
hilti::rt::any parse2
Definition: parser.h:233
void(* __hook_overlap)(const hilti::rt::StrongReferenceGeneric &, uint64_t, const hilti::rt::Bytes &, const hilti::rt::Bytes &)
Definition: parser.h:289
uint64_t linker_scope
Definition: parser.h:220
void(* __hook_gap)(const hilti::rt::StrongReferenceGeneric &, uint64_t, uint64_t)
Definition: parser.h:286
hilti::rt::Vector< MIMEType > mime_types
Definition: parser.h:272
const hilti::rt::TypeInfo * type_info
Definition: parser.h:250
Parse3Function parse3
Definition: parser.h:241