aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/hyperscan/src/parser
diff options
context:
space:
mode:
authorthegeorg <thegeorg@yandex-team.ru>2022-02-10 16:45:12 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:45:12 +0300
commit49116032d905455a7b1c994e4a696afc885c1e71 (patch)
treebe835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/hyperscan/src/parser
parent4e839db24a3bbc9f1c610c43d6faaaa99824dcca (diff)
downloadydb-49116032d905455a7b1c994e4a696afc885c1e71.tar.gz
Restoring authorship annotation for <thegeorg@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/hyperscan/src/parser')
-rw-r--r--contrib/libs/hyperscan/src/parser/logical_combination.cpp672
-rw-r--r--contrib/libs/hyperscan/src/parser/logical_combination.h224
-rw-r--r--contrib/libs/hyperscan/src/parser/shortcut_literal.cpp4
-rw-r--r--contrib/libs/hyperscan/src/parser/utf8_validate.cpp2
-rw-r--r--contrib/libs/hyperscan/src/parser/utf8_validate.h6
5 files changed, 454 insertions, 454 deletions
diff --git a/contrib/libs/hyperscan/src/parser/logical_combination.cpp b/contrib/libs/hyperscan/src/parser/logical_combination.cpp
index feacedc263..de017a1108 100644
--- a/contrib/libs/hyperscan/src/parser/logical_combination.cpp
+++ b/contrib/libs/hyperscan/src/parser/logical_combination.cpp
@@ -1,336 +1,336 @@
-/*
- * Copyright (c) 2018-2020, Intel Corporation
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Intel Corporation nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** \file
- * \brief Parse and build ParsedLogical::logicalTree and combInfoMap.
- */
-#include "logical_combination.h"
-#include "parser/parse_error.h"
-#include "util/container.h"
-#include "hs_compile.h"
-#include "allocator.h"
-
-#include <vector>
-
-using namespace std;
-
-namespace ue2 {
-
-u32 ParsedLogical::getLogicalKey(u32 a) {
- auto it = toLogicalKeyMap.find(a);
- if (it == toLogicalKeyMap.end()) {
- // get size before assigning to avoid wacky LHS shenanigans
- u32 size = toLogicalKeyMap.size();
- bool inserted;
- tie(it, inserted) = toLogicalKeyMap.emplace(a, size);
- assert(inserted);
- }
- DEBUG_PRINTF("%u -> lkey %u\n", it->first, it->second);
- return it->second;
-}
-
-u32 ParsedLogical::getCombKey(u32 a) {
- auto it = toCombKeyMap.find(a);
- if (it == toCombKeyMap.end()) {
- u32 size = toCombKeyMap.size();
- bool inserted;
- tie(it, inserted) = toCombKeyMap.emplace(a, size);
- assert(inserted);
- }
- DEBUG_PRINTF("%u -> ckey %u\n", it->first, it->second);
- return it->second;
-}
-
-void ParsedLogical::addRelateCKey(u32 lkey, u32 ckey) {
- auto it = lkey2ckeys.find(lkey);
- if (it == lkey2ckeys.end()) {
- bool inserted;
- tie(it, inserted) = lkey2ckeys.emplace(lkey, set<u32>());
- assert(inserted);
- }
- it->second.insert(ckey);
- DEBUG_PRINTF("lkey %u belongs to combination key %u\n",
- it->first, ckey);
-}
-
-#define TRY_RENUM_OP(ckey) \
-do { \
- if (ckey & LOGICAL_OP_BIT) { \
- ckey = (ckey & ~LOGICAL_OP_BIT) + toLogicalKeyMap.size(); \
- } \
-} while(0)
-
-u32 ParsedLogical::logicalTreeAdd(u32 op, u32 left, u32 right) {
- LogicalOp lop;
- assert((LOGICAL_OP_BIT & (u32)logicalTree.size()) == 0);
- lop.id = LOGICAL_OP_BIT | (u32)logicalTree.size();
- lop.op = op;
- lop.lo = left;
- lop.ro = right;
- logicalTree.push_back(lop);
- return lop.id;
-}
-
-void ParsedLogical::combinationInfoAdd(UNUSED u32 ckey, u32 id, u32 ekey,
- u32 lkey_start, u32 lkey_result,
- u64a min_offset, u64a max_offset) {
- assert(ckey == combInfoMap.size());
- CombInfo ci;
- ci.id = id;
- ci.ekey = ekey;
- ci.start = lkey_start;
- ci.result = lkey_result;
- ci.min_offset = min_offset;
- ci.max_offset = max_offset;
- combInfoMap.push_back(ci);
-
- DEBUG_PRINTF("ckey %u (id %u) -> lkey %u..%u, ekey=0x%x\n", ckey, ci.id,
- ci.start, ci.result, ci.ekey);
-}
-
-void ParsedLogical::validateSubIDs(const unsigned *ids,
- const char *const *expressions,
- const unsigned *flags,
- unsigned elements) {
- for (const auto &it : toLogicalKeyMap) {
- bool unknown = true;
- u32 i = 0;
- for (i = 0; i < elements; i++) {
- if ((ids ? ids[i] : 0) == it.first) {
- unknown = false;
- break;
- }
- }
- if (unknown) {
- throw CompileError("Unknown sub-expression id.");
- }
- if (contains(toCombKeyMap, it.first)) {
- throw CompileError("Have combination of combination.");
- }
- if (flags && (flags[i] & HS_FLAG_SOM_LEFTMOST)) {
- throw CompileError("Have SOM flag in sub-expression.");
- }
- if (flags && (flags[i] & HS_FLAG_PREFILTER)) {
- throw CompileError("Have PREFILTER flag in sub-expression.");
- }
- hs_compile_error_t *compile_err = NULL;
- hs_expr_info_t *info = NULL;
- hs_error_t err = hs_expression_info(expressions[i], flags[i], &info,
- &compile_err);
- if (err != HS_SUCCESS) {
- hs_free_compile_error(compile_err);
- throw CompileError("Run hs_expression_info() failed.");
- }
- if (!info) {
- throw CompileError("Get hs_expr_info_t failed.");
- } else {
- if (info->unordered_matches) {
- throw CompileError("Have unordered match in sub-expressions.");
- }
- hs_misc_free(info);
- }
- }
-}
-
-void ParsedLogical::logicalKeyRenumber() {
- // renumber operation lkey in op vector
- for (auto &op : logicalTree) {
- TRY_RENUM_OP(op.id);
- TRY_RENUM_OP(op.lo);
- TRY_RENUM_OP(op.ro);
- }
- // renumber operation lkey in info map
- for (auto &ci : combInfoMap) {
- TRY_RENUM_OP(ci.start);
- TRY_RENUM_OP(ci.result);
- }
-}
-
-struct LogicalOperator {
- LogicalOperator(u32 op_in, u32 paren_in)
- : op(op_in), paren(paren_in) {}
- u32 op;
- u32 paren;
-};
-
-static
-u32 toOperator(char c) {
- u32 op = UNKNOWN_OP;
- switch (c) {
- case '!' :
- op = LOGICAL_OP_NOT;
- break;
- case '&' :
- op = LOGICAL_OP_AND;
- break;
- case '|' :
- op = LOGICAL_OP_OR;
- break;
- default:
- break;
- };
- return op;
-}
-
-static
-bool cmpOperator(const LogicalOperator &op1, const LogicalOperator &op2) {
- if (op1.paren < op2.paren) {
- return false;
- }
- if (op1.paren > op2.paren) {
- return true;
- }
- assert(op1.paren == op2.paren);
- if (op1.op > op2.op) {
- return false;
- }
- if (op1.op < op2.op) {
- return true;
- }
- return true;
-}
-
-static
-u32 fetchSubID(const char *logical, u32 &digit, u32 end) {
- if (digit == (u32)-1) { // no digit parsing in progress
- return (u32)-1;
- }
- assert(end > digit);
- if (end - digit > 9) {
- throw LocatedParseError("Expression id too large");
- }
- u32 mult = 1;
- u32 sum = 0;
- for (u32 j = end - 1; (j >= digit) && (j != (u32)-1) ; j--) {
- assert(isdigit(logical[j]));
- sum += (logical[j] - '0') * mult;
- mult *= 10;
- }
- digit = (u32)-1;
- return sum;
-}
-
-static
-void popOperator(vector<LogicalOperator> &op_stack, vector<u32> &subid_stack,
- ParsedLogical &pl) {
- if (subid_stack.empty()) {
- throw LocatedParseError("Not enough operand");
- }
- u32 right = subid_stack.back();
- subid_stack.pop_back();
- u32 left = 0;
- if (op_stack.back().op != LOGICAL_OP_NOT) {
- if (subid_stack.empty()) {
- throw LocatedParseError("Not enough operand");
- }
- left = subid_stack.back();
- subid_stack.pop_back();
- }
- subid_stack.push_back(pl.logicalTreeAdd(op_stack.back().op, left, right));
- op_stack.pop_back();
-}
-
-void ParsedLogical::parseLogicalCombination(unsigned id, const char *logical,
- u32 ekey, u64a min_offset,
- u64a max_offset) {
- u32 ckey = getCombKey(id);
- vector<LogicalOperator> op_stack;
- vector<u32> subid_stack;
- u32 lkey_start = INVALID_LKEY; // logical operation's lkey
- u32 paren = 0; // parentheses
- u32 digit = (u32)-1; // digit start offset, invalid offset is -1
- u32 subid = (u32)-1;
- u32 i;
- try {
- for (i = 0; logical[i]; i++) {
- if (isdigit(logical[i])) {
- if (digit == (u32)-1) { // new digit start
- digit = i;
- }
- } else {
- if ((subid = fetchSubID(logical, digit, i)) != (u32)-1) {
- subid_stack.push_back(getLogicalKey(subid));
- addRelateCKey(subid_stack.back(), ckey);
- }
- if (logical[i] == ' ') { // skip whitespace
- continue;
- }
- if (logical[i] == '(') {
- paren += 1;
- } else if (logical[i] == ')') {
- if (paren <= 0) {
- throw LocatedParseError("Not enough left parentheses");
- }
- paren -= 1;
- } else {
- u32 prio = toOperator(logical[i]);
- if (prio != UNKNOWN_OP) {
- LogicalOperator op(prio, paren);
- while (!op_stack.empty()
- && cmpOperator(op_stack.back(), op)) {
- popOperator(op_stack, subid_stack, *this);
- if (lkey_start == INVALID_LKEY) {
- lkey_start = subid_stack.back();
- }
- }
- op_stack.push_back(op);
- } else {
- throw LocatedParseError("Unknown character");
- }
- }
- }
- }
- if (paren != 0) {
- throw LocatedParseError("Not enough right parentheses");
- }
- if ((subid = fetchSubID(logical, digit, i)) != (u32)-1) {
- subid_stack.push_back(getLogicalKey(subid));
- addRelateCKey(subid_stack.back(), ckey);
- }
- while (!op_stack.empty()) {
- popOperator(op_stack, subid_stack, *this);
- if (lkey_start == INVALID_LKEY) {
- lkey_start = subid_stack.back();
- }
- }
- if (subid_stack.size() != 1) {
- throw LocatedParseError("Not enough operator");
- }
- } catch (LocatedParseError &error) {
- error.locate(i);
- throw;
- }
- u32 lkey_result = subid_stack.back(); // logical operation's lkey
- if (lkey_start == INVALID_LKEY) {
- throw CompileError("No logical operation.");
- }
- combinationInfoAdd(ckey, id, ekey, lkey_start, lkey_result,
- min_offset, max_offset);
-}
-
-} // namespace ue2
+/*
+ * Copyright (c) 2018-2020, Intel Corporation
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** \file
+ * \brief Parse and build ParsedLogical::logicalTree and combInfoMap.
+ */
+#include "logical_combination.h"
+#include "parser/parse_error.h"
+#include "util/container.h"
+#include "hs_compile.h"
+#include "allocator.h"
+
+#include <vector>
+
+using namespace std;
+
+namespace ue2 {
+
+u32 ParsedLogical::getLogicalKey(u32 a) {
+ auto it = toLogicalKeyMap.find(a);
+ if (it == toLogicalKeyMap.end()) {
+ // get size before assigning to avoid wacky LHS shenanigans
+ u32 size = toLogicalKeyMap.size();
+ bool inserted;
+ tie(it, inserted) = toLogicalKeyMap.emplace(a, size);
+ assert(inserted);
+ }
+ DEBUG_PRINTF("%u -> lkey %u\n", it->first, it->second);
+ return it->second;
+}
+
+u32 ParsedLogical::getCombKey(u32 a) {
+ auto it = toCombKeyMap.find(a);
+ if (it == toCombKeyMap.end()) {
+ u32 size = toCombKeyMap.size();
+ bool inserted;
+ tie(it, inserted) = toCombKeyMap.emplace(a, size);
+ assert(inserted);
+ }
+ DEBUG_PRINTF("%u -> ckey %u\n", it->first, it->second);
+ return it->second;
+}
+
+void ParsedLogical::addRelateCKey(u32 lkey, u32 ckey) {
+ auto it = lkey2ckeys.find(lkey);
+ if (it == lkey2ckeys.end()) {
+ bool inserted;
+ tie(it, inserted) = lkey2ckeys.emplace(lkey, set<u32>());
+ assert(inserted);
+ }
+ it->second.insert(ckey);
+ DEBUG_PRINTF("lkey %u belongs to combination key %u\n",
+ it->first, ckey);
+}
+
+#define TRY_RENUM_OP(ckey) \
+do { \
+ if (ckey & LOGICAL_OP_BIT) { \
+ ckey = (ckey & ~LOGICAL_OP_BIT) + toLogicalKeyMap.size(); \
+ } \
+} while(0)
+
+u32 ParsedLogical::logicalTreeAdd(u32 op, u32 left, u32 right) {
+ LogicalOp lop;
+ assert((LOGICAL_OP_BIT & (u32)logicalTree.size()) == 0);
+ lop.id = LOGICAL_OP_BIT | (u32)logicalTree.size();
+ lop.op = op;
+ lop.lo = left;
+ lop.ro = right;
+ logicalTree.push_back(lop);
+ return lop.id;
+}
+
+void ParsedLogical::combinationInfoAdd(UNUSED u32 ckey, u32 id, u32 ekey,
+ u32 lkey_start, u32 lkey_result,
+ u64a min_offset, u64a max_offset) {
+ assert(ckey == combInfoMap.size());
+ CombInfo ci;
+ ci.id = id;
+ ci.ekey = ekey;
+ ci.start = lkey_start;
+ ci.result = lkey_result;
+ ci.min_offset = min_offset;
+ ci.max_offset = max_offset;
+ combInfoMap.push_back(ci);
+
+ DEBUG_PRINTF("ckey %u (id %u) -> lkey %u..%u, ekey=0x%x\n", ckey, ci.id,
+ ci.start, ci.result, ci.ekey);
+}
+
+void ParsedLogical::validateSubIDs(const unsigned *ids,
+ const char *const *expressions,
+ const unsigned *flags,
+ unsigned elements) {
+ for (const auto &it : toLogicalKeyMap) {
+ bool unknown = true;
+ u32 i = 0;
+ for (i = 0; i < elements; i++) {
+ if ((ids ? ids[i] : 0) == it.first) {
+ unknown = false;
+ break;
+ }
+ }
+ if (unknown) {
+ throw CompileError("Unknown sub-expression id.");
+ }
+ if (contains(toCombKeyMap, it.first)) {
+ throw CompileError("Have combination of combination.");
+ }
+ if (flags && (flags[i] & HS_FLAG_SOM_LEFTMOST)) {
+ throw CompileError("Have SOM flag in sub-expression.");
+ }
+ if (flags && (flags[i] & HS_FLAG_PREFILTER)) {
+ throw CompileError("Have PREFILTER flag in sub-expression.");
+ }
+ hs_compile_error_t *compile_err = NULL;
+ hs_expr_info_t *info = NULL;
+ hs_error_t err = hs_expression_info(expressions[i], flags[i], &info,
+ &compile_err);
+ if (err != HS_SUCCESS) {
+ hs_free_compile_error(compile_err);
+ throw CompileError("Run hs_expression_info() failed.");
+ }
+ if (!info) {
+ throw CompileError("Get hs_expr_info_t failed.");
+ } else {
+ if (info->unordered_matches) {
+ throw CompileError("Have unordered match in sub-expressions.");
+ }
+ hs_misc_free(info);
+ }
+ }
+}
+
+void ParsedLogical::logicalKeyRenumber() {
+ // renumber operation lkey in op vector
+ for (auto &op : logicalTree) {
+ TRY_RENUM_OP(op.id);
+ TRY_RENUM_OP(op.lo);
+ TRY_RENUM_OP(op.ro);
+ }
+ // renumber operation lkey in info map
+ for (auto &ci : combInfoMap) {
+ TRY_RENUM_OP(ci.start);
+ TRY_RENUM_OP(ci.result);
+ }
+}
+
+struct LogicalOperator {
+ LogicalOperator(u32 op_in, u32 paren_in)
+ : op(op_in), paren(paren_in) {}
+ u32 op;
+ u32 paren;
+};
+
+static
+u32 toOperator(char c) {
+ u32 op = UNKNOWN_OP;
+ switch (c) {
+ case '!' :
+ op = LOGICAL_OP_NOT;
+ break;
+ case '&' :
+ op = LOGICAL_OP_AND;
+ break;
+ case '|' :
+ op = LOGICAL_OP_OR;
+ break;
+ default:
+ break;
+ };
+ return op;
+}
+
+static
+bool cmpOperator(const LogicalOperator &op1, const LogicalOperator &op2) {
+ if (op1.paren < op2.paren) {
+ return false;
+ }
+ if (op1.paren > op2.paren) {
+ return true;
+ }
+ assert(op1.paren == op2.paren);
+ if (op1.op > op2.op) {
+ return false;
+ }
+ if (op1.op < op2.op) {
+ return true;
+ }
+ return true;
+}
+
+static
+u32 fetchSubID(const char *logical, u32 &digit, u32 end) {
+ if (digit == (u32)-1) { // no digit parsing in progress
+ return (u32)-1;
+ }
+ assert(end > digit);
+ if (end - digit > 9) {
+ throw LocatedParseError("Expression id too large");
+ }
+ u32 mult = 1;
+ u32 sum = 0;
+ for (u32 j = end - 1; (j >= digit) && (j != (u32)-1) ; j--) {
+ assert(isdigit(logical[j]));
+ sum += (logical[j] - '0') * mult;
+ mult *= 10;
+ }
+ digit = (u32)-1;
+ return sum;
+}
+
+static
+void popOperator(vector<LogicalOperator> &op_stack, vector<u32> &subid_stack,
+ ParsedLogical &pl) {
+ if (subid_stack.empty()) {
+ throw LocatedParseError("Not enough operand");
+ }
+ u32 right = subid_stack.back();
+ subid_stack.pop_back();
+ u32 left = 0;
+ if (op_stack.back().op != LOGICAL_OP_NOT) {
+ if (subid_stack.empty()) {
+ throw LocatedParseError("Not enough operand");
+ }
+ left = subid_stack.back();
+ subid_stack.pop_back();
+ }
+ subid_stack.push_back(pl.logicalTreeAdd(op_stack.back().op, left, right));
+ op_stack.pop_back();
+}
+
+void ParsedLogical::parseLogicalCombination(unsigned id, const char *logical,
+ u32 ekey, u64a min_offset,
+ u64a max_offset) {
+ u32 ckey = getCombKey(id);
+ vector<LogicalOperator> op_stack;
+ vector<u32> subid_stack;
+ u32 lkey_start = INVALID_LKEY; // logical operation's lkey
+ u32 paren = 0; // parentheses
+ u32 digit = (u32)-1; // digit start offset, invalid offset is -1
+ u32 subid = (u32)-1;
+ u32 i;
+ try {
+ for (i = 0; logical[i]; i++) {
+ if (isdigit(logical[i])) {
+ if (digit == (u32)-1) { // new digit start
+ digit = i;
+ }
+ } else {
+ if ((subid = fetchSubID(logical, digit, i)) != (u32)-1) {
+ subid_stack.push_back(getLogicalKey(subid));
+ addRelateCKey(subid_stack.back(), ckey);
+ }
+ if (logical[i] == ' ') { // skip whitespace
+ continue;
+ }
+ if (logical[i] == '(') {
+ paren += 1;
+ } else if (logical[i] == ')') {
+ if (paren <= 0) {
+ throw LocatedParseError("Not enough left parentheses");
+ }
+ paren -= 1;
+ } else {
+ u32 prio = toOperator(logical[i]);
+ if (prio != UNKNOWN_OP) {
+ LogicalOperator op(prio, paren);
+ while (!op_stack.empty()
+ && cmpOperator(op_stack.back(), op)) {
+ popOperator(op_stack, subid_stack, *this);
+ if (lkey_start == INVALID_LKEY) {
+ lkey_start = subid_stack.back();
+ }
+ }
+ op_stack.push_back(op);
+ } else {
+ throw LocatedParseError("Unknown character");
+ }
+ }
+ }
+ }
+ if (paren != 0) {
+ throw LocatedParseError("Not enough right parentheses");
+ }
+ if ((subid = fetchSubID(logical, digit, i)) != (u32)-1) {
+ subid_stack.push_back(getLogicalKey(subid));
+ addRelateCKey(subid_stack.back(), ckey);
+ }
+ while (!op_stack.empty()) {
+ popOperator(op_stack, subid_stack, *this);
+ if (lkey_start == INVALID_LKEY) {
+ lkey_start = subid_stack.back();
+ }
+ }
+ if (subid_stack.size() != 1) {
+ throw LocatedParseError("Not enough operator");
+ }
+ } catch (LocatedParseError &error) {
+ error.locate(i);
+ throw;
+ }
+ u32 lkey_result = subid_stack.back(); // logical operation's lkey
+ if (lkey_start == INVALID_LKEY) {
+ throw CompileError("No logical operation.");
+ }
+ combinationInfoAdd(ckey, id, ekey, lkey_start, lkey_result,
+ min_offset, max_offset);
+}
+
+} // namespace ue2
diff --git a/contrib/libs/hyperscan/src/parser/logical_combination.h b/contrib/libs/hyperscan/src/parser/logical_combination.h
index b4b994a437..7c8eb36ef7 100644
--- a/contrib/libs/hyperscan/src/parser/logical_combination.h
+++ b/contrib/libs/hyperscan/src/parser/logical_combination.h
@@ -1,112 +1,112 @@
-/*
- * Copyright (c) 2018, Intel Corporation
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of Intel Corporation nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/** \file
- * \brief Parse and build ParsedLogical::logicalTree and combInfoMap.
- */
-
-#ifndef LOGICAL_COMBINATION_H
-#define LOGICAL_COMBINATION_H
-
-#include "util/logical.h"
-
-#include <map>
-#include <set>
-#include <vector>
-
-namespace ue2 {
-
-class ParsedLogical {
- friend class ReportManager;
-public:
- /** \brief Parse 1 logical expression \a logical, assign temporary ckey. */
- void parseLogicalCombination(unsigned id, const char *logical, u32 ekey,
- u64a min_offset, u64a max_offset);
-
- /** \brief Check if all sub-expression id in combinations are valid. */
- void validateSubIDs(const unsigned *ids, const char *const *expressions,
- const unsigned *flags, unsigned elements);
-
- /** \brief Renumber and assign final lkey for each logical operation
- * after parsed all logical expressions. */
- void logicalKeyRenumber();
-
- /** \brief Fetch the lkey associated with the given expression id,
- * assigning one if necessary. */
- u32 getLogicalKey(u32 expressionId);
-
- /** \brief Fetch the ckey associated with the given expression id,
- * assigning one if necessary. */
- u32 getCombKey(u32 expressionId);
-
- /** \brief Add lkey's corresponding combination id. */
- void addRelateCKey(u32 lkey, u32 ckey);
-
- /** \brief Add one Logical Operation. */
- u32 logicalTreeAdd(u32 op, u32 left, u32 right);
-
- /** \brief Assign the combination info associated with the given ckey. */
- void combinationInfoAdd(u32 ckey, u32 id, u32 ekey, u32 lkey_start,
- u32 lkey_result, u64a min_offset, u64a max_offset);
-
- const std::map<u32, u32> &getLkeyMap() const {
- return toLogicalKeyMap;
- }
-
- const std::vector<LogicalOp> &getLogicalTree() const {
- return logicalTree;
- }
-
- CombInfo getCombInfoById(u32 id) const {
- u32 ckey = toCombKeyMap.at(id);
- assert(ckey < combInfoMap.size());
- return combInfoMap.at(ckey);
- }
-
-private:
- /** \brief Mapping from ckey to combination info. */
- std::vector<CombInfo> combInfoMap;
-
- /** \brief Mapping from combination expression id to combination key,
- * combination key is used in combination bit-vector cache. */
- std::map<u32, u32> toCombKeyMap;
-
- /** \brief Mapping from expression id to logical key, logical key is used
- * as index in LogicalOp array. */
- std::map<u32, u32> toLogicalKeyMap;
-
- /** \brief Mapping from logical key to related combination keys. */
- std::map<u32, std::set<u32>> lkey2ckeys;
-
- /** \brief Logical constraints, each operation from postfix notation. */
- std::vector<LogicalOp> logicalTree;
-};
-
-} // namespace ue2
-
-#endif
+/*
+ * Copyright (c) 2018, Intel Corporation
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** \file
+ * \brief Parse and build ParsedLogical::logicalTree and combInfoMap.
+ */
+
+#ifndef LOGICAL_COMBINATION_H
+#define LOGICAL_COMBINATION_H
+
+#include "util/logical.h"
+
+#include <map>
+#include <set>
+#include <vector>
+
+namespace ue2 {
+
+class ParsedLogical {
+ friend class ReportManager;
+public:
+ /** \brief Parse 1 logical expression \a logical, assign temporary ckey. */
+ void parseLogicalCombination(unsigned id, const char *logical, u32 ekey,
+ u64a min_offset, u64a max_offset);
+
+ /** \brief Check if all sub-expression id in combinations are valid. */
+ void validateSubIDs(const unsigned *ids, const char *const *expressions,
+ const unsigned *flags, unsigned elements);
+
+ /** \brief Renumber and assign final lkey for each logical operation
+ * after parsed all logical expressions. */
+ void logicalKeyRenumber();
+
+ /** \brief Fetch the lkey associated with the given expression id,
+ * assigning one if necessary. */
+ u32 getLogicalKey(u32 expressionId);
+
+ /** \brief Fetch the ckey associated with the given expression id,
+ * assigning one if necessary. */
+ u32 getCombKey(u32 expressionId);
+
+ /** \brief Add lkey's corresponding combination id. */
+ void addRelateCKey(u32 lkey, u32 ckey);
+
+ /** \brief Add one Logical Operation. */
+ u32 logicalTreeAdd(u32 op, u32 left, u32 right);
+
+ /** \brief Assign the combination info associated with the given ckey. */
+ void combinationInfoAdd(u32 ckey, u32 id, u32 ekey, u32 lkey_start,
+ u32 lkey_result, u64a min_offset, u64a max_offset);
+
+ const std::map<u32, u32> &getLkeyMap() const {
+ return toLogicalKeyMap;
+ }
+
+ const std::vector<LogicalOp> &getLogicalTree() const {
+ return logicalTree;
+ }
+
+ CombInfo getCombInfoById(u32 id) const {
+ u32 ckey = toCombKeyMap.at(id);
+ assert(ckey < combInfoMap.size());
+ return combInfoMap.at(ckey);
+ }
+
+private:
+ /** \brief Mapping from ckey to combination info. */
+ std::vector<CombInfo> combInfoMap;
+
+ /** \brief Mapping from combination expression id to combination key,
+ * combination key is used in combination bit-vector cache. */
+ std::map<u32, u32> toCombKeyMap;
+
+ /** \brief Mapping from expression id to logical key, logical key is used
+ * as index in LogicalOp array. */
+ std::map<u32, u32> toLogicalKeyMap;
+
+ /** \brief Mapping from logical key to related combination keys. */
+ std::map<u32, std::set<u32>> lkey2ckeys;
+
+ /** \brief Logical constraints, each operation from postfix notation. */
+ std::vector<LogicalOp> logicalTree;
+};
+
+} // namespace ue2
+
+#endif
diff --git a/contrib/libs/hyperscan/src/parser/shortcut_literal.cpp b/contrib/libs/hyperscan/src/parser/shortcut_literal.cpp
index d82f25e2a3..a5d67f30d8 100644
--- a/contrib/libs/hyperscan/src/parser/shortcut_literal.cpp
+++ b/contrib/libs/hyperscan/src/parser/shortcut_literal.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2019, Intel Corporation
+ * Copyright (c) 2015-2019, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@@ -199,7 +199,7 @@ bool shortcutLiteral(NG &ng, const ParsedExpression &pe) {
DEBUG_PRINTF("constructed literal %s\n", dumpString(lit).c_str());
return ng.addLiteral(lit, expr.index, expr.report, expr.highlander,
- expr.som, expr.quiet);
+ expr.som, expr.quiet);
}
} // namespace ue2
diff --git a/contrib/libs/hyperscan/src/parser/utf8_validate.cpp b/contrib/libs/hyperscan/src/parser/utf8_validate.cpp
index db3ae8403f..50aa06d8e7 100644
--- a/contrib/libs/hyperscan/src/parser/utf8_validate.cpp
+++ b/contrib/libs/hyperscan/src/parser/utf8_validate.cpp
@@ -60,7 +60,7 @@ bool isAllowedCodepoint(u32 val) {
return true;
}
-bool isValidUtf8(const char *expression, const size_t len) {
+bool isValidUtf8(const char *expression, const size_t len) {
if (!expression) {
return true;
}
diff --git a/contrib/libs/hyperscan/src/parser/utf8_validate.h b/contrib/libs/hyperscan/src/parser/utf8_validate.h
index 8095c7a4c2..6389a0859f 100644
--- a/contrib/libs/hyperscan/src/parser/utf8_validate.h
+++ b/contrib/libs/hyperscan/src/parser/utf8_validate.h
@@ -29,12 +29,12 @@
#ifndef PARSER_UTF8_VALIDATE_H
#define PARSER_UTF8_VALIDATE_H
-#include <cstddef> // size_t
-
+#include <cstddef> // size_t
+
namespace ue2 {
/** \brief Validate that the given expression is well-formed UTF-8. */
-bool isValidUtf8(const char *expression, const size_t len);
+bool isValidUtf8(const char *expression, const size_t len);
} // namespace ue2