]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
smallwrite: use failure map to set dfa daddy state
authorJustin Viiret <justin.viiret@intel.com>
Tue, 11 Apr 2017 03:37:56 +0000 (13:37 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Tue, 30 May 2017 03:57:32 +0000 (13:57 +1000)
src/nfa/mcclellancompile.cpp
src/smallwrite/smallwrite_build.cpp

index 29642dde39cd8a13d7edfef7f336cd442628d662..e2466000e128a241554d08c45a2dc103a2178a9d 100644 (file)
@@ -842,6 +842,8 @@ void find_better_daddy(dfa_info &info, dstate_id_t curr_id, bool using8bit,
     flat_set<dstate_id_t> hinted;
     if (trust_daddy_states) {
         hinted.insert(currState.daddy);
+        addIfEarlier(hinted, info.raw.start_floating, curr_id);
+        addIfEarlier(hinted, info.raw.start_anchored, curr_id);
     } else {
         hinted = find_daddy_candidates(info, curr_id);
     }
@@ -896,7 +898,7 @@ void find_better_daddy(dfa_info &info, dstate_id_t curr_id, bool using8bit,
 
     if (self_loop_width > MAX_SHERMAN_SELF_LOOP) {
         DEBUG_PRINTF("%hu is banned wide self loop (%u)\n", curr_id,
-                      self_loop_width);
+                     self_loop_width);
         return;
     }
 
index 829c72e570d0c088545cfe9e6fd3e4cae05209fa..fac8d012b9904c3a721c2317aad500f5c82aa498 100644 (file)
@@ -443,11 +443,11 @@ bool isSaneTrie(const LitTrie &trie) {
  * edges and reports.
  */
 static
-void buildAutomaton(LitTrie &trie) {
+void buildAutomaton(LitTrie &trie,
+                    map<LitTrieVertex, LitTrieVertex> &failure_map) {
     assert(isSaneTrie(trie));
 
     // Find our failure transitions and reports.
-    map<LitTrieVertex, LitTrieVertex> failure_map;
     vector<LitTrieVertex> ordering;
     ACVisitor ac_vis(trie, failure_map, ordering);
     boost::breadth_first_search(trie, trie.root, visitor(ac_vis));
@@ -535,7 +535,8 @@ static
 unique_ptr<raw_dfa> buildDfa(LitTrie &trie, bool nocase) {
     DEBUG_PRINTF("trie has %zu states\n", num_vertices(trie));
 
-    buildAutomaton(trie);
+    map<LitTrieVertex, LitTrieVertex> failure_map;
+    buildAutomaton(trie, failure_map);
 
     auto rdfa = make_unique<raw_dfa>(NFA_OUTFIX);
 
@@ -559,13 +560,19 @@ unique_ptr<raw_dfa> buildDfa(LitTrie &trie, bool nocase) {
         DEBUG_PRINTF("state %zu\n", u_state);
         assert(u_state < rdfa->states.size());
         auto &ds = rdfa->states[u_state];
-        ds.daddy = root_state;
         ds.reports = trie[u].reports;
-
         if (!ds.reports.empty()) {
             DEBUG_PRINTF("reports: %s\n", as_string_list(ds.reports).c_str());
         }
 
+        // Set daddy state from failure map.
+        if (u == trie.root) {
+            ds.daddy = DEAD_STATE;
+        } else {
+            assert(contains(failure_map, u));
+            ds.daddy = trie[failure_map.at(u)].index + 1;
+        }
+
         // By default, transition back to the root.
         fill(ds.next.begin(), ds.next.end(), root_state);
         // TOP should be a self-loop.