diff --git a/src/nfa/dfa_build_strat.cpp b/src/nfa/dfa_build_strat.cpp index 1d31feb1..d4d418aa 100755 --- a/src/nfa/dfa_build_strat.cpp +++ b/src/nfa/dfa_build_strat.cpp @@ -28,184 +28,13 @@ #include "dfa_build_strat.h" -#include "accel.h" -#include "accelcompile.h" -#include "grey.h" -#include "mcclellan_internal.h" -#include "mcclellancompile_util.h" -#include "nfa_internal.h" -#include "shufticompile.h" -#include "trufflecompile.h" -#include "ue2common.h" -#include "util/alloc.h" -#include "util/bitutils.h" -#include "util/charreach.h" -#include "util/compare.h" -#include "util/compile_context.h" -#include "util/container.h" -#include "util/make_unique.h" -#include "util/order_check.h" -#include "util/report_manager.h" -#include "util/ue2_containers.h" -#include "util/unaligned.h" -#include "util/verify_types.h" - -#include - -using namespace std; - namespace ue2 { // prevent weak vtables for raw_report_info, dfa_build_strat and raw_dfa -raw_report_info::~raw_report_info() { -} +raw_report_info::~raw_report_info() {} -dfa_build_strat::~dfa_build_strat() { -} +dfa_build_strat::~dfa_build_strat() {} -raw_dfa::~raw_dfa() { -} - -namespace { - -struct raw_report_list { - flat_set reports; - - raw_report_list(const flat_set &reports_in, - const ReportManager &rm, bool do_remap) { - if (do_remap) { - for (auto &id : reports_in) { - reports.insert(rm.getProgramOffset(id)); - } - } else { - reports = reports_in; - } - } - - bool operator<(const raw_report_list &b) const { - return reports < b.reports; - } -}; - -struct raw_report_info_impl : public raw_report_info { - vector rl; - u32 getReportListSize() const override; - size_t size() const override; - void fillReportLists(NFA *n, size_t base_offset, - std::vector &ro /* out */) const override; -}; -} - -unique_ptr -dfa_build_strat::gatherReports(vector &reports, vector &reports_eod, - u8 *isSingleReport, ReportID *arbReport) const { - auto &rdfa = get_raw(); - DEBUG_PRINTF("gathering reports\n"); - - const bool remap_reports = has_managed_reports(rdfa.kind); - - auto ri = ue2::make_unique(); - map rev; - - for (const dstate &s : rdfa.states) { - if (s.reports.empty()) { - reports.push_back(MO_INVALID_IDX); - continue; - } - - raw_report_list rrl(s.reports, rm, remap_reports); - DEBUG_PRINTF("non empty r\n"); - if (rev.find(rrl) != rev.end()) { - reports.push_back(rev[rrl]); - } else { - DEBUG_PRINTF("adding to rl %zu\n", ri->size()); - rev[rrl] = ri->size(); - reports.push_back(ri->size()); - ri->rl.push_back(rrl); - } - } - - for (const dstate &s : rdfa.states) { - if (s.reports_eod.empty()) { - reports_eod.push_back(MO_INVALID_IDX); - continue; - } - - DEBUG_PRINTF("non empty r eod\n"); - raw_report_list rrl(s.reports_eod, rm, remap_reports); - if (rev.find(rrl) != rev.end()) { - reports_eod.push_back(rev[rrl]); - continue; - } - - DEBUG_PRINTF("adding to rl eod %zu\n", s.reports_eod.size()); - rev[rrl] = ri->size(); - reports_eod.push_back(ri->size()); - ri->rl.push_back(rrl); - } - - assert(!ri->rl.empty()); /* all components should be able to generate - reports */ - if (!ri->rl.empty()) { - *arbReport = *ri->rl.begin()->reports.begin(); - } else { - *arbReport = 0; - } - - /* if we have only a single report id generated from all accepts (not eod) - * we can take some short cuts */ - set reps; - - for (u32 rl_index : reports) { - if (rl_index == MO_INVALID_IDX) { - continue; - } - assert(rl_index < ri->size()); - insert(&reps, ri->rl[rl_index].reports); - } - - if (reps.size() == 1) { - *isSingleReport = 1; - *arbReport = *reps.begin(); - DEBUG_PRINTF("single -- %u\n", *arbReport); - } else { - *isSingleReport = 0; - } - - return move(ri); -} - -u32 raw_report_info_impl::getReportListSize() const { - u32 rv = 0; - - for (const auto &reps : rl) { - rv += sizeof(report_list); - rv += sizeof(ReportID) * reps.reports.size(); - } - - return rv; -} - -size_t raw_report_info_impl::size() const { - return rl.size(); -} - -void raw_report_info_impl::fillReportLists(NFA *n, size_t base_offset, - vector &ro) const { - for (const auto &reps : rl) { - ro.push_back(base_offset); - - report_list *p = (report_list *)((char *)n + base_offset); - - u32 i = 0; - for (const ReportID report : reps.reports) { - p->report[i++] = report; - } - p->count = verify_u32(reps.reports.size()); - - base_offset += sizeof(report_list); - base_offset += sizeof(ReportID) * reps.reports.size(); - } -} +raw_dfa::~raw_dfa() {} } // namespace ue2