10 #include <hilti/rt/exception.h> 11 #include <hilti/rt/fiber.h> 12 #include <hilti/rt/result.h> 13 #include <hilti/rt/type-info.h> 14 #include <hilti/rt/types/bytes.h> 15 #include <hilti/rt/types/null.h> 16 #include <hilti/rt/types/port.h> 17 #include <hilti/rt/types/reference.h> 18 #include <hilti/rt/types/struct.h> 20 #include <spicy/rt/filter.h> 21 #include <spicy/rt/global-state.h> 22 #include <spicy/rt/mime.h> 23 #include <spicy/rt/parser-fwd.h> 24 #include <spicy/rt/sink.h> 25 #include <spicy/rt/typedefs.h> 30 enum class Direction { Originator, Responder, Both, Undef };
36 inline std::string to_string(const ::spicy::rt::Direction& x, adl::tag ) {
38 case spicy::rt::Direction::Originator:
return "originator";
39 case spicy::rt::Direction::Responder:
return "responder";
40 case spicy::rt::Direction::Both:
return "both";
41 case spicy::rt::Direction::Undef:
return "undefined";
51 inline std::ostream& operator<<(std::ostream& out,
const Direction& d) {
return out <<
hilti::rt::to_string(d); }
59 ParserPort(std::tuple<hilti::rt::Port, Direction> args) : port(std::get<0>(args)), direction(std::get<1>(args)) {}
70 if ( x.direction == spicy::rt::Direction::Both )
73 return fmt(
"%s (%s direction)", x.port, x.direction);
89 static auto test(
int) -> decltype(
90 std::declval<U>().__on_0x25_gap(std::declval<uint64_t>(), std::declval<uint64_t>()), std::true_type());
93 static std::false_type test(...);
94 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
100 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_skipped(std::declval<uint64_t>()), std::true_type());
102 static std::false_type test(...);
103 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
109 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_overlap(std::declval<uint64_t>(),
110 std::declval<const hilti::rt::Bytes&>(),
111 std::declval<const hilti::rt::Bytes&>()),
114 static std::false_type test(...);
115 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
121 static auto test(
int) -> decltype(std::declval<U>().__on_0x25_undelivered(std::declval<uint64_t>(),
122 std::declval<const hilti::rt::Bytes&>()),
125 static std::false_type test(...);
126 static constexpr
bool value = std::is_same_v<decltype(test<P>(0)), std::true_type>;
138 Parser(std::string name, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
141 : name(std::move(name)),
143 parse2(std::move(parse2)),
145 context_new(context_new),
147 description(std::move(description)),
148 mime_types(std::move(mime_types)),
149 ports(std::move(ports)) {}
151 Parser(std::string name, Parse1Function parse1, hilti::rt::any parse2, Parse3Function parse3,
154 : name(std::move(name)),
156 parse2(std::move(parse2)),
159 description(std::move(description)),
160 mime_types(std::move(mime_types)),
161 ports(std::move(ports)) {}
166 :
Parser(std::move(name),
nullptr, parse2,
nullptr,
nullptr, type, std::move(description),
167 std::move(mime_types), std::move(ports)) {}
183 return (*context_new)();
203 Parse1Function parse1{};
217 Parse3Function parse3{};
223 ContextNewFunction context_new =
nullptr;
249 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)>>
__hook_gap;
257 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t)>>
__hook_skipped;
260 std::optional<std::function<void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes&)>>
265 inline const auto& parsers() {
return detail::globalState()->parsers; }
306 template<
typename UnitRef>
308 std::string linker_scope,
UnitRef ) {
314 globalState()->parsers.emplace_back(&p);
316 using unit_type =
typename UnitRef::element_type;
319 ! std::is_base_of<hilti::rt::trait::hasParameters, unit_type>::value )
320 p.
__parse_sink = sink::detail::parseFunction<unit_type>();
323 p.
__hook_gap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_gap, uint64_t, uint64_t>();
326 p.
__hook_skipped = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_skipped, uint64_t>();
329 p.
__hook_overlap = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_overlap, uint64_t,
333 p.
__hook_undelivered = sink::detail::hookFunction<unit_type, &unit_type::__on_0x25_undelivered, uint64_t,
334 const hilti::rt::Bytes&>();
436 inline void backtrack() {
throw Backtrack(); }
449 std::optional<hilti::rt::stream::SafeConstIterator> unitFind(
451 const std::optional<hilti::rt::stream::SafeConstIterator>& i,
const hilti::rt::Bytes& needle,
452 hilti::rt::stream::Direction d);
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: reference.h:640
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, uint64_t)> > __hook_gap
Definition: parser.h:249
hilti::rt::Vector< ParserPort > ports
Definition: parser.h:240
std::string linker_scope
Definition: parser.h:196
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &, const hilti::rt::Bytes &)> > __hook_overlap
Definition: parser.h:254
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:52
std::optional< detail::ParseSinkFunction > __parse_sink
Definition: parser.h:246
Definition: reference.h:328
std::optional< UnitContext > createContext() const
Definition: parser.h:181
Definition: deferred-expression.h:41
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t, const hilti::rt::Bytes &)> > __hook_undelivered
Definition: parser.h:261
Definition: location.h:93
Definition: type-info.h:1146
hilti::rt::any parse2
Definition: parser.h:209
std::optional< std::function< void(hilti::rt::StrongReferenceGeneric, uint64_t)> > __hook_skipped
Definition: parser.h:257
hilti::rt::Vector< MIMEType > mime_types
Definition: parser.h:235
std::string description
Definition: parser.h:230
std::string fmt(const char *fmt, const Args &... args)
Definition: fmt.h:13
std::string name
Definition: parser.h:189