mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-12-31 13:49:07 +03:00
simple offset accel for mcclellan start state
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Intel Corporation
|
||||
* Copyright (c) 2015-2016, Intel Corporation
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
@@ -85,10 +85,11 @@ public:
|
||||
vector<u32> &reports_eod /* out */,
|
||||
u8 *isSingleReport /* out */,
|
||||
ReportID *arbReport /* out */) const override;
|
||||
void find_escape_strings(dstate_id_t this_idx,
|
||||
escape_info *out) const override;
|
||||
escape_info find_escape_strings(dstate_id_t this_idx) const override;
|
||||
size_t accelSize(void) const override { return sizeof(gough_accel); }
|
||||
void buildAccel(dstate_id_t this_idx, void *accel_out) override;
|
||||
void buildAccel(dstate_id_t this_idx, const escape_info &info,
|
||||
void *accel_out) override;
|
||||
u32 max_allowed_offset_accel() const override { return 0; }
|
||||
|
||||
raw_som_dfa &rdfa;
|
||||
const GoughGraph ≫
|
||||
@@ -1145,32 +1146,43 @@ aligned_unique_ptr<NFA> goughCompile(raw_som_dfa &raw, u8 somPrecision,
|
||||
return gough_dfa;
|
||||
}
|
||||
|
||||
void gough_build_strat::find_escape_strings(dstate_id_t this_idx,
|
||||
escape_info *out) const {
|
||||
escape_info gough_build_strat::find_escape_strings(dstate_id_t this_idx) const {
|
||||
escape_info rv;
|
||||
if (!contains(accel_gough_info, this_idx)) {
|
||||
out->outs = CharReach::dot();
|
||||
out->outs2_broken = true;
|
||||
return;
|
||||
rv.outs = CharReach::dot();
|
||||
rv.outs2_broken = true;
|
||||
return rv;
|
||||
}
|
||||
|
||||
mcclellan_build_strat::find_escape_strings(this_idx, out);
|
||||
rv = mcclellan_build_strat::find_escape_strings(this_idx);
|
||||
|
||||
assert(!rv.offset); /* should have been limited by strat */
|
||||
if (rv.offset) {
|
||||
rv.outs = CharReach::dot();
|
||||
rv.outs2_broken = true;
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (!accel_gough_info.at(this_idx).two_byte) {
|
||||
out->outs2_broken = true;
|
||||
rv.outs2_broken = true;
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
void gough_build_strat::buildAccel(dstate_id_t this_idx, void *accel_out) {
|
||||
void gough_build_strat::buildAccel(dstate_id_t this_idx, const escape_info &info,
|
||||
void *accel_out) {
|
||||
assert(mcclellan_build_strat::accelSize() == sizeof(AccelAux));
|
||||
gough_accel *accel = (gough_accel *)accel_out;
|
||||
/* build a plain accelaux so we can work out where we can get to */
|
||||
mcclellan_build_strat::buildAccel(this_idx, &accel->accel);
|
||||
mcclellan_build_strat::buildAccel(this_idx, info, &accel->accel);
|
||||
DEBUG_PRINTF("state %hu is accel with type %hhu\n", this_idx,
|
||||
accel->accel.accel_type);
|
||||
if (accel->accel.accel_type == ACCEL_NONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert(!accel->accel.generic.offset);
|
||||
assert(contains(accel_gough_info, this_idx));
|
||||
accel->margin_dist = verify_u8(accel_gough_info.at(this_idx).margin);
|
||||
built_accel[accel] = this_idx;
|
||||
|
||||
Reference in New Issue
Block a user