aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp
diff options
context:
space:
mode:
authorIvan Blinkov <ivan@blinkov.ru>2022-02-10 16:47:10 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:47:10 +0300
commit1aeb9a455974457866f78722ad98114bafc84e8a (patch)
treee4340eaf1668684d83a0a58c36947c5def5350ad /contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp
parentbd5ef432f5cfb1e18851381329d94665a4c22470 (diff)
downloadydb-1aeb9a455974457866f78722ad98114bafc84e8a.tar.gz
Restoring authorship annotation for Ivan Blinkov <ivan@blinkov.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp')
-rw-r--r--contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp206
1 files changed, 103 insertions, 103 deletions
diff --git a/contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp b/contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp
index f8abbd04a2..85f5933d21 100644
--- a/contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp
+++ b/contrib/libs/hyperscan/src/nfagraph/ng_expr_info.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2017, Intel Corporation
+ * Copyright (c) 2015-2017, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -27,8 +27,8 @@
*/
/** \file
- * \brief Code for discovering properties of an NFA graph used by
- * hs_expression_info().
+ * \brief Code for discovering properties of an NFA graph used by
+ * hs_expression_info().
*/
#include "ng_expr_info.h"
@@ -37,14 +37,14 @@
#include "ng_asserts.h"
#include "ng_depth.h"
#include "ng_edge_redundancy.h"
-#include "ng_extparam.h"
-#include "ng_fuzzy.h"
+#include "ng_extparam.h"
+#include "ng_fuzzy.h"
#include "ng_holder.h"
-#include "ng_prune.h"
+#include "ng_prune.h"
#include "ng_reports.h"
#include "ng_util.h"
#include "ue2common.h"
-#include "compiler/expression_info.h"
+#include "compiler/expression_info.h"
#include "parser/position.h" // for POS flags
#include "util/boundary_reports.h"
#include "util/compile_context.h"
@@ -62,76 +62,76 @@ namespace ue2 {
/* get rid of leading \b and multiline ^ vertices */
static
-void removeLeadingVirtualVerticesFromRoot(NGHolder &g, NFAVertex root) {
+void removeLeadingVirtualVerticesFromRoot(NGHolder &g, NFAVertex root) {
vector<NFAVertex> victims;
- for (auto v : adjacent_vertices_range(root, g)) {
- if (g[v].assert_flags & POS_FLAG_VIRTUAL_START) {
+ for (auto v : adjacent_vertices_range(root, g)) {
+ if (g[v].assert_flags & POS_FLAG_VIRTUAL_START) {
DEBUG_PRINTF("(?m)^ vertex or leading \\[bB] vertex\n");
victims.push_back(v);
}
}
for (auto u : victims) {
- for (auto v : adjacent_vertices_range(u, g)) {
- add_edge_if_not_present(root, v, g);
+ for (auto v : adjacent_vertices_range(u, g)) {
+ add_edge_if_not_present(root, v, g);
}
}
- remove_vertices(victims, g);
+ remove_vertices(victims, g);
}
static
-void checkVertex(const ReportManager &rm, const NGHolder &g, NFAVertex v,
+void checkVertex(const ReportManager &rm, const NGHolder &g, NFAVertex v,
const vector<DepthMinMax> &depths, DepthMinMax &info) {
- if (is_any_accept(v, g)) {
+ if (is_any_accept(v, g)) {
return;
}
- if (is_any_start(v, g)) {
- info.min = depth(0);
+ if (is_any_start(v, g)) {
+ info.min = depth(0);
info.max = max(info.max, depth(0));
return;
}
- u32 idx = g[v].index;
+ u32 idx = g[v].index;
assert(idx < depths.size());
const DepthMinMax &d = depths.at(idx);
- for (ReportID report_id : g[v].reports) {
- const Report &report = rm.getReport(report_id);
- assert(report.type == EXTERNAL_CALLBACK);
-
- DepthMinMax rd = d;
-
- // Compute graph width to this report, taking any offset adjustment
- // into account.
- rd.min += report.offsetAdjust;
- rd.max += report.offsetAdjust;
-
- // A min_length param is a lower bound for match width.
- if (report.minLength && report.minLength <= depth::max_value()) {
- depth min_len((u32)report.minLength);
- rd.min = max(rd.min, min_len);
- rd.max = max(rd.max, min_len);
- }
-
- // A max_offset param is an upper bound for match width.
- if (report.maxOffset && report.maxOffset <= depth::max_value()) {
- depth max_offset((u32)report.maxOffset);
- rd.min = min(rd.min, max_offset);
- rd.max = min(rd.max, max_offset);
- }
-
- DEBUG_PRINTF("vertex %zu report %u: %s\n", g[v].index, report_id,
- rd.str().c_str());
-
- info = unionDepthMinMax(info, rd);
+ for (ReportID report_id : g[v].reports) {
+ const Report &report = rm.getReport(report_id);
+ assert(report.type == EXTERNAL_CALLBACK);
+
+ DepthMinMax rd = d;
+
+ // Compute graph width to this report, taking any offset adjustment
+ // into account.
+ rd.min += report.offsetAdjust;
+ rd.max += report.offsetAdjust;
+
+ // A min_length param is a lower bound for match width.
+ if (report.minLength && report.minLength <= depth::max_value()) {
+ depth min_len((u32)report.minLength);
+ rd.min = max(rd.min, min_len);
+ rd.max = max(rd.max, min_len);
+ }
+
+ // A max_offset param is an upper bound for match width.
+ if (report.maxOffset && report.maxOffset <= depth::max_value()) {
+ depth max_offset((u32)report.maxOffset);
+ rd.min = min(rd.min, max_offset);
+ rd.max = min(rd.max, max_offset);
+ }
+
+ DEBUG_PRINTF("vertex %zu report %u: %s\n", g[v].index, report_id,
+ rd.str().c_str());
+
+ info = unionDepthMinMax(info, rd);
}
}
static
-bool hasOffsetAdjust(const ReportManager &rm, const NGHolder &g) {
- for (const auto &report_id : all_reports(g)) {
+bool hasOffsetAdjust(const ReportManager &rm, const NGHolder &g) {
+ for (const auto &report_id : all_reports(g)) {
if (rm.getReport(report_id).offsetAdjust) {
return true;
}
@@ -139,64 +139,64 @@ bool hasOffsetAdjust(const ReportManager &rm, const NGHolder &g) {
return false;
}
-void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
- NGHolder &g, ExpressionInfo &expr,
- hs_expr_info *info) {
+void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
+ NGHolder &g, ExpressionInfo &expr,
+ hs_expr_info *info) {
assert(info);
- // remove reports that aren't on vertices connected to accept.
- clearReports(g);
-
- assert(allMatchStatesHaveReports(g));
-
- /*
- * Note: the following set of analysis passes / transformations should
- * match those in NG::addGraph().
- */
-
+ // remove reports that aren't on vertices connected to accept.
+ clearReports(g);
+
+ assert(allMatchStatesHaveReports(g));
+
+ /*
+ * Note: the following set of analysis passes / transformations should
+ * match those in NG::addGraph().
+ */
+
/* ensure utf8 starts at cp boundary */
- ensureCodePointStart(rm, g, expr);
-
- if (can_never_match(g)) {
- throw CompileError(expr.index, "Pattern can never match.");
- }
-
- bool hamming = expr.hamm_distance > 0;
- u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance;
-
- // validate graph's suitability for fuzzing
- validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey);
-
- resolveAsserts(rm, g, expr);
- assert(allMatchStatesHaveReports(g));
-
- // fuzz graph - this must happen before any transformations are made
- make_fuzzy(g, e_dist, hamming, cc.grey);
-
- pruneUseless(g);
- pruneEmptyVertices(g);
-
- if (can_never_match(g)) {
- throw CompileError(expr.index, "Pattern can never match.");
- }
-
- optimiseVirtualStarts(g);
-
- propagateExtendedParams(g, expr, rm);
-
- removeLeadingVirtualVerticesFromRoot(g, g.start);
- removeLeadingVirtualVerticesFromRoot(g, g.startDs);
-
- auto depths = calcDepthsFrom(g, g.start);
-
+ ensureCodePointStart(rm, g, expr);
+
+ if (can_never_match(g)) {
+ throw CompileError(expr.index, "Pattern can never match.");
+ }
+
+ bool hamming = expr.hamm_distance > 0;
+ u32 e_dist = hamming ? expr.hamm_distance : expr.edit_distance;
+
+ // validate graph's suitability for fuzzing
+ validate_fuzzy_compile(g, e_dist, hamming, expr.utf8, cc.grey);
+
+ resolveAsserts(rm, g, expr);
+ assert(allMatchStatesHaveReports(g));
+
+ // fuzz graph - this must happen before any transformations are made
+ make_fuzzy(g, e_dist, hamming, cc.grey);
+
+ pruneUseless(g);
+ pruneEmptyVertices(g);
+
+ if (can_never_match(g)) {
+ throw CompileError(expr.index, "Pattern can never match.");
+ }
+
+ optimiseVirtualStarts(g);
+
+ propagateExtendedParams(g, expr, rm);
+
+ removeLeadingVirtualVerticesFromRoot(g, g.start);
+ removeLeadingVirtualVerticesFromRoot(g, g.startDs);
+
+ auto depths = calcDepthsFrom(g, g.start);
+
DepthMinMax d;
- for (auto u : inv_adjacent_vertices_range(g.accept, g)) {
- checkVertex(rm, g, u, depths, d);
+ for (auto u : inv_adjacent_vertices_range(g.accept, g)) {
+ checkVertex(rm, g, u, depths, d);
}
- for (auto u : inv_adjacent_vertices_range(g.acceptEod, g)) {
- checkVertex(rm, g, u, depths, d);
+ for (auto u : inv_adjacent_vertices_range(g.acceptEod, g)) {
+ checkVertex(rm, g, u, depths, d);
}
if (d.max.is_finite()) {
@@ -210,9 +210,9 @@ void fillExpressionInfo(ReportManager &rm, const CompileContext &cc,
info->min_width = UINT_MAX;
}
- info->unordered_matches = hasOffsetAdjust(rm, g);
- info->matches_at_eod = can_match_at_eod(g);
- info->matches_only_at_eod = can_only_match_at_eod(g);
+ info->unordered_matches = hasOffsetAdjust(rm, g);
+ info->matches_at_eod = can_match_at_eod(g);
+ info->matches_only_at_eod = can_only_match_at_eod(g);
}
} // namespace ue2