mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-06-28 16:41:01 +03:00
limex: make NFAAccept::squash rel to LimEx base
This commit is contained in:
parent
77fe1ef6e5
commit
5e3fa7a266
@ -115,8 +115,7 @@ void SQUASH_UNTUG_BR_FN(const IMPL_NFA_T *limex,
|
|||||||
|
|
||||||
static really_inline
|
static really_inline
|
||||||
char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s,
|
char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s,
|
||||||
STATE_T *squash, const ENG_STATE_T *squashMasks,
|
STATE_T *squash, const STATE_T *acceptMask,
|
||||||
const STATE_T *acceptMask,
|
|
||||||
const struct NFAAccept *acceptTable, u64a offset,
|
const struct NFAAccept *acceptTable, u64a offset,
|
||||||
NfaCallback callback, void *context) {
|
NfaCallback callback, void *context) {
|
||||||
assert(s);
|
assert(s);
|
||||||
@ -151,10 +150,9 @@ char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (squash != NULL && a->squash != MO_INVALID_IDX) {
|
if (squash != NULL && a->squash != MO_INVALID_IDX) {
|
||||||
assert(squashMasks);
|
DEBUG_PRINTF("applying squash mask at offset %u\n", a->squash);
|
||||||
assert(a->squash < limex->squashCount);
|
const ENG_STATE_T *sq =
|
||||||
const ENG_STATE_T *sq = &squashMasks[a->squash];
|
(const ENG_STATE_T *)((const char *)limex + a->squash);
|
||||||
DEBUG_PRINTF("squash mask %u @ %p\n", a->squash, sq);
|
|
||||||
*squash = AND_STATE(*squash, LOAD_FROM_ENG(sq));
|
*squash = AND_STATE(*squash, LOAD_FROM_ENG(sq));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,11 +169,8 @@ char PROCESS_ACCEPTS_FN(const IMPL_NFA_T *limex, STATE_T *s,
|
|||||||
NfaCallback callback, void *context) {
|
NfaCallback callback, void *context) {
|
||||||
// We have squash masks we might have to apply after firing reports.
|
// We have squash masks we might have to apply after firing reports.
|
||||||
STATE_T squash = ONES_STATE;
|
STATE_T squash = ONES_STATE;
|
||||||
const ENG_STATE_T *squashMasks = (const ENG_STATE_T *)
|
return PROCESS_ACCEPTS_IMPL_FN(limex, s, &squash, acceptMask, acceptTable,
|
||||||
((const char *)limex + limex->squashOffset);
|
offset, callback, context);
|
||||||
|
|
||||||
return PROCESS_ACCEPTS_IMPL_FN(limex, s, &squash, squashMasks, acceptMask,
|
|
||||||
acceptTable, offset, callback, context);
|
|
||||||
|
|
||||||
*s = AND_STATE(*s, squash);
|
*s = AND_STATE(*s, squash);
|
||||||
}
|
}
|
||||||
@ -187,10 +182,8 @@ char PROCESS_ACCEPTS_NOSQUASH_FN(const IMPL_NFA_T *limex, const STATE_T *s,
|
|||||||
u64a offset, NfaCallback callback,
|
u64a offset, NfaCallback callback,
|
||||||
void *context) {
|
void *context) {
|
||||||
STATE_T *squash = NULL;
|
STATE_T *squash = NULL;
|
||||||
const ENG_STATE_T *squashMasks = NULL;
|
return PROCESS_ACCEPTS_IMPL_FN(limex, s, squash, acceptMask, acceptTable,
|
||||||
|
offset, callback, context);
|
||||||
return PROCESS_ACCEPTS_IMPL_FN(limex, s, squash, squashMasks, acceptMask,
|
|
||||||
acceptTable, offset, callback, context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run EOD accepts. Note that repeat_ctrl and repeat_state may be NULL if this
|
// Run EOD accepts. Note that repeat_ctrl and repeat_state may be NULL if this
|
||||||
|
@ -2020,12 +2020,13 @@ struct Factory {
|
|||||||
maskSetBits(limex->accept, acceptMask);
|
maskSetBits(limex->accept, acceptMask);
|
||||||
maskSetBits(limex->acceptAtEOD, acceptEodMask);
|
maskSetBits(limex->acceptAtEOD, acceptEodMask);
|
||||||
|
|
||||||
// Transforms the index into the report list into an offset relative to
|
// Transforms the indices (report list, squash mask) into offsets
|
||||||
// the base of the limex.
|
// relative to the base of the limex.
|
||||||
auto report_offset_fn = [&](NFAAccept a) {
|
auto transform_offset_fn = [&](NFAAccept a) {
|
||||||
if (!a.single_report) {
|
if (!a.single_report) {
|
||||||
a.reports = reportListOffset + a.reports * sizeof(ReportID);
|
a.reports = reportListOffset + a.reports * sizeof(ReportID);
|
||||||
}
|
}
|
||||||
|
a.squash = squashOffset + a.squash * sizeof(tableRow_t);
|
||||||
return a;
|
return a;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2036,7 +2037,7 @@ struct Factory {
|
|||||||
NFAAccept *acceptsTable = (NFAAccept *)(limex_base + acceptsOffset);
|
NFAAccept *acceptsTable = (NFAAccept *)(limex_base + acceptsOffset);
|
||||||
assert(ISALIGNED(acceptsTable));
|
assert(ISALIGNED(acceptsTable));
|
||||||
transform(accepts.begin(), accepts.end(), acceptsTable,
|
transform(accepts.begin(), accepts.end(), acceptsTable,
|
||||||
report_offset_fn);
|
transform_offset_fn);
|
||||||
|
|
||||||
// Write eod accept table.
|
// Write eod accept table.
|
||||||
limex->acceptEodOffset = acceptsEodOffset;
|
limex->acceptEodOffset = acceptsEodOffset;
|
||||||
@ -2045,7 +2046,7 @@ struct Factory {
|
|||||||
NFAAccept *acceptsEodTable = (NFAAccept *)(limex_base + acceptsEodOffset);
|
NFAAccept *acceptsEodTable = (NFAAccept *)(limex_base + acceptsEodOffset);
|
||||||
assert(ISALIGNED(acceptsEodTable));
|
assert(ISALIGNED(acceptsEodTable));
|
||||||
transform(acceptsEod.begin(), acceptsEod.end(), acceptsEodTable,
|
transform(acceptsEod.begin(), acceptsEod.end(), acceptsEodTable,
|
||||||
report_offset_fn);
|
transform_offset_fn);
|
||||||
|
|
||||||
// Write squash mask table.
|
// Write squash mask table.
|
||||||
limex->squashCount = verify_u32(squash.size());
|
limex->squashCount = verify_u32(squash.size());
|
||||||
|
@ -192,7 +192,7 @@ struct NFAAccept {
|
|||||||
*/
|
*/
|
||||||
u32 reports;
|
u32 reports;
|
||||||
|
|
||||||
u32 squash; //!< Offset into squash masks, or MO_INVALID_IDX.
|
u32 squash; //!< Offset (from LimEx) into squash masks, or MO_INVALID_IDX.
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user