noodle_build: update interface to use hwlmLiteral

This commit is contained in:
Justin Viiret 2016-04-22 16:09:39 +10:00 committed by Matthew Barr
parent 31b1114f76
commit d7774f3d69
4 changed files with 38 additions and 31 deletions

View 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
@ -526,8 +526,7 @@ aligned_unique_ptr<HWLM> hwlmBuild(const vector<hwlmLiteral> &lits,
DEBUG_PRINTF("build noodle table\n"); DEBUG_PRINTF("build noodle table\n");
engType = HWLM_ENGINE_NOOD; engType = HWLM_ENGINE_NOOD;
const hwlmLiteral &lit = lits.front(); const hwlmLiteral &lit = lits.front();
auto noodle = noodBuildTable((const u8 *)lit.s.c_str(), lit.s.length(), auto noodle = noodBuildTable(lit);
lit.nocase, lit.id);
if (noodle) { if (noodle) {
engSize = noodSize(noodle.get()); engSize = noodSize(noodle.get());
} }

View File

@ -26,28 +26,35 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
/** \file /**
* \file
* \brief Noodle literal matcher: build code. * \brief Noodle literal matcher: build code.
*/ */
#include <cstring> // for memcpy
#include "noodle_build.h" #include "noodle_build.h"
#include "hwlm_literal.h"
#include "noodle_internal.h" #include "noodle_internal.h"
#include "ue2common.h"
#include "util/alloc.h" #include "util/alloc.h"
#include "util/compare.h" #include "util/compare.h"
#include "util/verify_types.h" #include "util/verify_types.h"
#include "ue2common.h"
#include <cstring> // for memcpy
namespace ue2 { namespace ue2 {
static static
size_t findNoodFragOffset(const u8 *lit, size_t len, bool nocase) { size_t findNoodFragOffset(const hwlmLiteral &lit) {
const auto &s = lit.s;
const size_t len = lit.s.length();
size_t offset = 0; size_t offset = 0;
for (size_t i = 0; i + 1 < len; i++) { for (size_t i = 0; i + 1 < len; i++) {
int diff = 0; int diff = 0;
const char c = lit[i]; const char c = s[i];
const char d = lit[i + 1]; const char d = s[i + 1];
if (nocase && ourisalpha(c)) { if (lit.nocase && ourisalpha(c)) {
diff = (mytoupper(c) != mytoupper(d)); diff = (mytoupper(c) != mytoupper(d));
} else { } else {
diff = (c != d); diff = (c != d);
@ -60,21 +67,24 @@ size_t findNoodFragOffset(const u8 *lit, size_t len, bool nocase) {
return offset; return offset;
} }
/** \brief Construct a Noodle matcher for the given literal. */ aligned_unique_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit) {
aligned_unique_ptr<noodTable> noodBuildTable(const u8 *lit, size_t len, if (!lit.msk.empty()) {
bool nocase, u32 id) { DEBUG_PRINTF("noodle can't handle supplementary masks\n");
size_t noodle_len = sizeof(noodTable) + len; return nullptr;
aligned_unique_ptr<noodTable> n = }
aligned_zmalloc_unique<noodTable>(noodle_len);
const auto &s = lit.s;
size_t noodle_len = sizeof(noodTable) + s.length();
auto n = aligned_zmalloc_unique<noodTable>(noodle_len);
assert(n); assert(n);
size_t key_offset = findNoodFragOffset(lit, len, nocase); size_t key_offset = findNoodFragOffset(lit);
n->id = id; n->id = lit.id;
n->len = verify_u32(len); n->len = verify_u32(s.length());
n->key_offset = verify_u32(key_offset); n->key_offset = verify_u32(key_offset);
n->nocase = nocase ? 1 : 0; n->nocase = lit.nocase ? 1 : 0;
memcpy(n->str, lit, len); memcpy(n->str, s.c_str(), s.length());
return n; return n;
} }

View File

@ -40,9 +40,10 @@ struct noodTable;
namespace ue2 { namespace ue2 {
struct hwlmLiteral;
/** \brief Construct a Noodle matcher for the given literal. */ /** \brief Construct a Noodle matcher for the given literal. */
ue2::aligned_unique_ptr<noodTable> noodBuildTable(const u8 *lit, size_t len, ue2::aligned_unique_ptr<noodTable> noodBuildTable(const hwlmLiteral &lit);
bool nocase, u32 id);
size_t noodSize(const noodTable *n); size_t noodSize(const noodTable *n);

View File

@ -32,6 +32,7 @@
#include "hwlm/noodle_build.h" #include "hwlm/noodle_build.h"
#include "hwlm/noodle_engine.h" #include "hwlm/noodle_engine.h"
#include "hwlm/hwlm.h" #include "hwlm/hwlm.h"
#include "hwlm/hwlm_literal.h"
#include "util/alloc.h" #include "util/alloc.h"
#include "util/ue2string.h" #include "util/ue2string.h"
@ -65,15 +66,11 @@ hwlmcb_rv_t hlmSimpleCallback(size_t from, size_t to, u32 id, void *context) {
} }
static static
void noodleMatch(const u8 *data, size_t data_len, const char *lit, void noodleMatch(const u8 *data, size_t data_len, const char *lit_str,
size_t lit_len, char nocase, HWLMCallback cb, void *ctxt) { size_t lit_len, char nocase, HWLMCallback cb, void *ctxt) {
// Coerce to upper-case if nocase. u32 id = 1000;
std::string s(lit, lit_len); hwlmLiteral lit(std::string(lit_str, lit_len), nocase, id);
if (nocase) { auto n = noodBuildTable(lit);
upperString(s);
}
auto n = noodBuildTable((const u8 *)s.c_str(), s.length(), nocase, 0);
ASSERT_TRUE(n != nullptr); ASSERT_TRUE(n != nullptr);
hwlm_error_t rv; hwlm_error_t rv;