static never_inline void soleOutfixBlockExec(const struct RoseEngine *t, struct hs_scratch *scratch) { assert(t); assert(scratch); initSomState(t, (u8 *)scratch->core_info.state); assert(t->outfixEndQueue == 1); assert(!t->amatcherOffset); assert(!t->ematcherOffset); assert(!t->fmatcherOffset); const struct NFA *nfa = getNfaByQueue(t, 0); size_t len = nfaRevAccelCheck(nfa, scratch->core_info.buf, scratch->core_info.len); if (!len) { return; } struct mq *q = scratch->queues; initQueue(q, 0, t, scratch); q->length = len; /* adjust for rev_accel */ nfaQueueInitState(nfa, q); pushQueueAt(q, 0, MQE_START, 0); pushQueueAt(q, 1, MQE_TOP, 0); pushQueueAt(q, 2, MQE_END, scratch->core_info.len); char rv = nfaQueueExec(q->nfa, q, scratch->core_info.len); if (rv && nfaAcceptsEod(nfa) && len == scratch->core_info.len) { nfaCheckFinalState(nfa, q->state, q->streamState, q->length, q->cb, q->som_cb, scratch); } }
static really_inline void rawBlockExec(const struct RoseEngine *rose, struct hs_scratch *scratch) { assert(rose); assert(scratch); initSomState(rose, scratch->core_info.state); DEBUG_PRINTF("blockmode scan len=%zu\n", scratch->core_info.len); roseBlockExec(rose, scratch); }
static really_inline void init_stream(struct hs_stream *s, const struct RoseEngine *rose) { s->rose = rose; s->offset = 0; u8 *state = (u8 *)getMultiState(s); roseInitState(rose, state); clearEvec((char *)state + rose->stateOffsets.exhausted, rose); // SOM state multibit structures. initSomState(rose, state); }
static really_inline void pureLiteralBlockExec(const struct RoseEngine *rose, struct hs_scratch *scratch) { assert(rose); assert(scratch); const struct HWLM *ftable = getFLiteralMatcher(rose); initSomState(rose, (u8 *)scratch->core_info.state); const u8 *buffer = scratch->core_info.buf; size_t length = scratch->core_info.len; DEBUG_PRINTF("rose engine %d\n", rose->runtimeImpl); hwlmExec(ftable, buffer, length, 0, selectHwlmAdaptor(rose), scratch, rose->initialGroups); }
static really_inline void init_stream(struct hs_stream *s, const struct RoseEngine *rose) { char *state = getMultiState(s); // Make absolutely sure that the 16 bytes leading up to the end of the // history buffer are initialised, as we rely on this (regardless of the // actual values used) in FDR. char *hist_end = state + rose->stateOffsets.history + rose->historyRequired; assert(hist_end - 16 >= (const char *)s); unaligned_store_u64a(hist_end - 16, 0xDEADDEADDEADDEADull); unaligned_store_u64a(hist_end - 8, 0xDEADDEADDEADDEADull); s->rose = rose; s->offset = 0; setStreamStatus(state, 0); roseInitState(rose, state); clearEvec(rose, state + rose->stateOffsets.exhausted); // SOM state multibit structures. initSomState(rose, state); }