diff options
author | Ivan Blinkov <ivan@blinkov.ru> | 2022-02-10 16:47:11 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:47:11 +0300 |
commit | 5b283123c882433dafbaf6b338adeea16c1a0ea0 (patch) | |
tree | 339adc63bce23800021202ae4a8328a843dc447a /contrib/libs/hyperscan/src/hwlm/noodle_build.cpp | |
parent | 1aeb9a455974457866f78722ad98114bafc84e8a (diff) | |
download | ydb-5b283123c882433dafbaf6b338adeea16c1a0ea0.tar.gz |
Restoring authorship annotation for Ivan Blinkov <ivan@blinkov.ru>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/hyperscan/src/hwlm/noodle_build.cpp')
-rw-r--r-- | contrib/libs/hyperscan/src/hwlm/noodle_build.cpp | 184 |
1 files changed, 92 insertions, 92 deletions
diff --git a/contrib/libs/hyperscan/src/hwlm/noodle_build.cpp b/contrib/libs/hyperscan/src/hwlm/noodle_build.cpp index 4bd3af0103..a0128d0ad7 100644 --- a/contrib/libs/hyperscan/src/hwlm/noodle_build.cpp +++ b/contrib/libs/hyperscan/src/hwlm/noodle_build.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: @@ -26,53 +26,53 @@ * POSSIBILITY OF SUCH DAMAGE. */ -/** - * \file +/** + * \file * \brief Noodle literal matcher: build code. */ #include "noodle_build.h" - -#include "hwlm_literal.h" + +#include "hwlm_literal.h" #include "noodle_internal.h" -#include "util/bitutils.h" +#include "util/bitutils.h" #include "util/compare.h" #include "util/verify_types.h" -#include "ue2common.h" +#include "ue2common.h" + +#include <cstring> // for memcpy +#include <vector> + +using std::vector; -#include <cstring> // for memcpy -#include <vector> - -using std::vector; - namespace ue2 { static -u64a make_u64a_mask(const vector<u8> &v) { - assert(v.size() <= sizeof(u64a)); - if (v.size() > sizeof(u64a)) { - throw std::exception(); - } - - u64a mask = 0; - size_t len = v.size(); - unsigned char *m = (unsigned char *)&mask; - DEBUG_PRINTF("making mask len %zu\n", len); - memcpy(m, &v[0], len); - return mask; -} - -static -size_t findNoodFragOffset(const hwlmLiteral &lit) { - const auto &s = lit.s; - const size_t len = lit.s.length(); - +u64a make_u64a_mask(const vector<u8> &v) { + assert(v.size() <= sizeof(u64a)); + if (v.size() > sizeof(u64a)) { + throw std::exception(); + } + + u64a mask = 0; + size_t len = v.size(); + unsigned char *m = (unsigned char *)&mask; + DEBUG_PRINTF("making mask len %zu\n", len); + memcpy(m, &v[0], len); + return mask; +} + +static +size_t findNoodFragOffset(const hwlmLiteral &lit) { + const auto &s = lit.s; + const size_t len = lit.s.length(); + size_t offset = 0; for (size_t i = 0; i + 1 < len; i++) { int diff = 0; - const char c = s[i]; - const char d = s[i + 1]; - if (lit.nocase && ourisalpha(c)) { + const char c = s[i]; + const char d = s[i + 1]; + if (lit.nocase && ourisalpha(c)) { diff = (mytoupper(c) != mytoupper(d)); } else { diff = (c != d); @@ -85,60 +85,60 @@ size_t findNoodFragOffset(const hwlmLiteral &lit) { return offset; } -bytecode_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit) { - const auto &s = lit.s; - - size_t mask_len = std::max(s.length(), lit.msk.size()); - DEBUG_PRINTF("mask is %zu bytes\n", lit.msk.size()); - assert(mask_len <= 8); - assert(lit.msk.size() == lit.cmp.size()); - - vector<u8> n_msk(mask_len); - vector<u8> n_cmp(mask_len); - - for (unsigned i = mask_len - lit.msk.size(), j = 0; i < mask_len; - i++, j++) { - DEBUG_PRINTF("m[%u] %hhx c[%u] %hhx\n", i, lit.msk[j], i, lit.cmp[j]); - n_msk[i] = lit.msk[j]; - n_cmp[i] = lit.cmp[j]; - } - - size_t s_off = mask_len - s.length(); - for (unsigned i = s_off; i < mask_len; i++) { - u8 c = s[i - s_off]; - u8 si_msk = lit.nocase && ourisalpha(c) ? (u8)CASE_CLEAR : (u8)0xff; - n_msk[i] |= si_msk; - n_cmp[i] |= c & si_msk; - assert((n_cmp[i] & si_msk) == c); - DEBUG_PRINTF("m[%u] %hhx c[%u] %hhx '%c'\n", i, n_msk[i], i, n_cmp[i], - ourisprint(c) ? (char)c : '.'); - } - - auto n = make_zeroed_bytecode_ptr<noodTable>(sizeof(noodTable)); +bytecode_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit) { + const auto &s = lit.s; + + size_t mask_len = std::max(s.length(), lit.msk.size()); + DEBUG_PRINTF("mask is %zu bytes\n", lit.msk.size()); + assert(mask_len <= 8); + assert(lit.msk.size() == lit.cmp.size()); + + vector<u8> n_msk(mask_len); + vector<u8> n_cmp(mask_len); + + for (unsigned i = mask_len - lit.msk.size(), j = 0; i < mask_len; + i++, j++) { + DEBUG_PRINTF("m[%u] %hhx c[%u] %hhx\n", i, lit.msk[j], i, lit.cmp[j]); + n_msk[i] = lit.msk[j]; + n_cmp[i] = lit.cmp[j]; + } + + size_t s_off = mask_len - s.length(); + for (unsigned i = s_off; i < mask_len; i++) { + u8 c = s[i - s_off]; + u8 si_msk = lit.nocase && ourisalpha(c) ? (u8)CASE_CLEAR : (u8)0xff; + n_msk[i] |= si_msk; + n_cmp[i] |= c & si_msk; + assert((n_cmp[i] & si_msk) == c); + DEBUG_PRINTF("m[%u] %hhx c[%u] %hhx '%c'\n", i, n_msk[i], i, n_cmp[i], + ourisprint(c) ? (char)c : '.'); + } + + auto n = make_zeroed_bytecode_ptr<noodTable>(sizeof(noodTable)); assert(n); - DEBUG_PRINTF("size of nood %zu\n", sizeof(noodTable)); - - size_t key_offset = findNoodFragOffset(lit); - - n->id = lit.id; - n->single = s.length() == 1 ? 1 : 0; - n->key_offset = verify_u8(s.length() - key_offset); - n->nocase = lit.nocase ? 1 : 0; - n->key0 = s[key_offset]; - if (n->single) { - n->key1 = 0; - } else { - n->key1 = s[key_offset + 1]; - } - n->msk = make_u64a_mask(n_msk); - n->cmp = make_u64a_mask(n_cmp); - n->msk_len = mask_len; + DEBUG_PRINTF("size of nood %zu\n", sizeof(noodTable)); + + size_t key_offset = findNoodFragOffset(lit); + + n->id = lit.id; + n->single = s.length() == 1 ? 1 : 0; + n->key_offset = verify_u8(s.length() - key_offset); + n->nocase = lit.nocase ? 1 : 0; + n->key0 = s[key_offset]; + if (n->single) { + n->key1 = 0; + } else { + n->key1 = s[key_offset + 1]; + } + n->msk = make_u64a_mask(n_msk); + n->cmp = make_u64a_mask(n_cmp); + n->msk_len = mask_len; return n; } -size_t noodSize(const noodTable *) { - return sizeof(noodTable); +size_t noodSize(const noodTable *) { + return sizeof(noodTable); } } // namespace ue2 @@ -150,17 +150,17 @@ namespace ue2 { void noodPrintStats(const noodTable *n, FILE *f) { fprintf(f, "Noodle table\n"); - fprintf(f, "Key Offset: %u\n", n->key_offset); - fprintf(f, "Msk: %llx Cmp: %llx MskLen %u\n", - n->msk >> 8 * (8 - n->msk_len), n->cmp >> 8 * (8 - n->msk_len), - n->msk_len); + fprintf(f, "Key Offset: %u\n", n->key_offset); + fprintf(f, "Msk: %llx Cmp: %llx MskLen %u\n", + n->msk >> 8 * (8 - n->msk_len), n->cmp >> 8 * (8 - n->msk_len), + n->msk_len); fprintf(f, "String: "); - for (u32 i = 0; i < n->msk_len; i++) { - const u8 *m = (const u8 *)&n->cmp; - if (isgraph(m[i]) && m[i] != '\\') { - fprintf(f, "%c", m[i]); + for (u32 i = 0; i < n->msk_len; i++) { + const u8 *m = (const u8 *)&n->cmp; + if (isgraph(m[i]) && m[i] != '\\') { + fprintf(f, "%c", m[i]); } else { - fprintf(f, "\\x%02hhx", m[i]); + fprintf(f, "\\x%02hhx", m[i]); } } fprintf(f, "\n"); |