mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2026-01-01 14:15:43 +03:00
eod: more suffix iteration into program
This commit is contained in:
committed by
Matthew Barr
parent
9669e0fe94
commit
2761e0105d
@@ -851,6 +851,48 @@ hwlmcb_rv_t roseEnginesEod(const struct RoseEngine *rose,
|
||||
return HWLM_CONTINUE_MATCHING;
|
||||
}
|
||||
|
||||
static rose_inline
|
||||
hwlmcb_rv_t roseSuffixesEod(const struct RoseEngine *rose,
|
||||
struct hs_scratch *scratch, u64a offset) {
|
||||
const u8 *aa = getActiveLeafArray(rose, scratch->core_info.state);
|
||||
const u32 aaCount = rose->activeArrayCount;
|
||||
|
||||
for (u32 qi = mmbit_iterate(aa, aaCount, MMB_INVALID); qi != MMB_INVALID;
|
||||
qi = mmbit_iterate(aa, aaCount, qi)) {
|
||||
const struct NfaInfo *info = getNfaInfoByQueue(rose, qi);
|
||||
const struct NFA *nfa = getNfaByInfo(rose, info);
|
||||
|
||||
assert(nfaAcceptsEod(nfa));
|
||||
|
||||
DEBUG_PRINTF("checking nfa %u\n", qi);
|
||||
|
||||
/* We have just been triggered. */
|
||||
assert(fatbit_isset(scratch->aqa, rose->queueCount, qi));
|
||||
|
||||
char *fstate = scratch->fullState + info->fullStateOffset;
|
||||
const char *sstate = scratch->core_info.state + info->stateOffset;
|
||||
|
||||
struct mq *q = scratch->queues + qi;
|
||||
|
||||
pushQueueNoMerge(q, MQE_END, scratch->core_info.len);
|
||||
|
||||
q->context = NULL;
|
||||
/* rose exec is used as we don't want to / can't raise matches in the
|
||||
* history buffer. */
|
||||
if (!nfaQueueExecRose(q->nfa, q, MO_INVALID_IDX)) {
|
||||
DEBUG_PRINTF("nfa is dead\n");
|
||||
continue;
|
||||
}
|
||||
if (nfaCheckFinalState(nfa, fstate, sstate, offset, roseReportAdaptor,
|
||||
roseReportSomAdaptor,
|
||||
scratch) == MO_HALT_MATCHING) {
|
||||
DEBUG_PRINTF("user instructed us to stop\n");
|
||||
return HWLM_TERMINATE_MATCHING;
|
||||
}
|
||||
}
|
||||
return HWLM_CONTINUE_MATCHING;
|
||||
}
|
||||
|
||||
static
|
||||
void updateSeqPoint(struct RoseContext *tctxt, u64a offset,
|
||||
const char from_mpv) {
|
||||
@@ -1360,6 +1402,14 @@ hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t,
|
||||
}
|
||||
PROGRAM_NEXT_INSTRUCTION
|
||||
|
||||
PROGRAM_CASE(SUFFIXES_EOD) {
|
||||
if (roseSuffixesEod(t, scratch, end) ==
|
||||
HWLM_TERMINATE_MATCHING) {
|
||||
return HWLM_TERMINATE_MATCHING;
|
||||
}
|
||||
}
|
||||
PROGRAM_NEXT_INSTRUCTION
|
||||
|
||||
PROGRAM_CASE(END) {
|
||||
DEBUG_PRINTF("finished\n");
|
||||
return HWLM_CONTINUE_MATCHING;
|
||||
|
||||
Reference in New Issue
Block a user