]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
smallwrite: don't recompile the dfa if prune fails
authorAlex Coyte <a.coyte@intel.com>
Tue, 5 Apr 2016 01:07:26 +0000 (11:07 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 20 Apr 2016 03:34:56 +0000 (13:34 +1000)
src/nfa/mcclellancompile_util.cpp
src/nfa/mcclellancompile_util.h
src/smallwrite/smallwrite_build.cpp

index 2c9465208551f6314b98073ae1cd89635e5b7cb9..234574d84d41010a405a6891dc8ff36f986e816a 100644 (file)
@@ -228,13 +228,13 @@ void calc_min_dist_to_accept(const raw_dfa &raw,
     }
 }
 
-void prune_overlong(raw_dfa &raw, u32 max_offset) {
+bool prune_overlong(raw_dfa &raw, u32 max_offset) {
     DEBUG_PRINTF("pruning to at most %u\n", max_offset);
     vector<u32> bob_dist;
     u32 max_min_dist_bob = calc_min_dist_from_bob(raw, &bob_dist);
 
     if (max_min_dist_bob <= max_offset) {
-        return;
+        return false;
     }
 
     vector<vector<dstate_id_t> > in_edges;
@@ -282,6 +282,8 @@ void prune_overlong(raw_dfa &raw, u32 max_offset) {
     /* update specials */
     raw.start_floating = new_ids[raw.start_floating];
     raw.start_anchored = new_ids[raw.start_anchored];
+
+    return true;
 }
 
 set<ReportID> all_reports(const raw_dfa &rdfa) {
index 7015893b5151b3a7e4097834dd9f9e0495ef8990..7b6c033a9c09b1b2e24b5b7fefc1d9582c460bb6 100644 (file)
 namespace ue2 {
 
 u32 remove_leading_dots(raw_dfa &raw);
-void prune_overlong(raw_dfa &raw, u32 max_offset);
+
+/**
+ * Prunes any states which cannot be reached within max_offset from start of
+ * stream. Returns false if no changes are made to the rdfa
+ */
+bool prune_overlong(raw_dfa &raw, u32 max_offset);
+
 std::set<ReportID> all_reports(const raw_dfa &rdfa);
 bool has_eod_accepts(const raw_dfa &rdfa);
 bool has_non_eod_accepts(const raw_dfa &rdfa);
index 097e043207470dedb5ee94d45f1834494f52184a..dfefe5e8d8ee3c39da356417fb0da218c1421fab 100644 (file)
@@ -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:
@@ -317,21 +317,23 @@ aligned_unique_ptr<NFA> prepEngine(raw_dfa &rdfa, u32 roseQuality,
     }
 
     if (is_slow(rdfa, accel_states, roseQuality)) {
+        DEBUG_PRINTF("is slow\n");
         *small_region = cc.grey.smallWriteLargestBufferBad;
         if (*small_region <= *start_offset) {
             return nullptr;
         }
-        prune_overlong(rdfa, *small_region - *start_offset);
-        if (rdfa.start_anchored == DEAD_STATE) {
-            DEBUG_PRINTF("all patterns pruned out\n");
-            return nullptr;
-        }
+        if (prune_overlong(rdfa, *small_region - *start_offset)) {
+            if (rdfa.start_anchored == DEAD_STATE) {
+                DEBUG_PRINTF("all patterns pruned out\n");
+                return nullptr;
+            }
 
-        nfa = mcclellanCompile(rdfa, cc, &accel_states);
-        if (!nfa) {
-            DEBUG_PRINTF("mcclellan compile failed for smallwrite NFA\n");
-            assert(0); /* we were able to build orig dfa but not the trimmed? */
-            return nullptr;
+            nfa = mcclellanCompile(rdfa, cc, &accel_states);
+            if (!nfa) {
+                DEBUG_PRINTF("mcclellan compile failed for smallwrite NFA\n");
+                assert(0); /* able to build orig dfa but not the trimmed? */
+                return nullptr;
+            }
         }
     } else {
         *small_region = cc.grey.smallWriteLargestBuffer;