// finish off tail
if (d != buf_end) {
- SuperVector<S> chars = SuperVector<S>::Zeroes();
- const u8 *end_buf;
- if (buf_end - buf < S) {
- memcpy(&chars.u, buf, buf_end - buf);
- end_buf = buf;
- } else {
- chars = SuperVector<S>::loadu(buf_end - S);
- end_buf = buf_end - S;
- }
- rv = fwdBlockDouble(wide_mask1_lo, wide_mask1_hi, wide_mask2_lo, wide_mask2_hi, chars, end_buf);
+ SuperVector<S> chars = SuperVector<S>::loadu(d);
+ rv = fwdBlockDouble(wide_mask1_lo, wide_mask1_hi, wide_mask2_lo, wide_mask2_hi, chars, d);
DEBUG_PRINTF("rv %p \n", rv);
if (rv && rv < buf_end) return rv;
}
hs_free_database(db);
err = hs_free_scratch(scratch);
ASSERT_EQ(HS_SUCCESS, err);
-}
\ No newline at end of file
+}
+
+
+const char *patterns[] = {
+ "^muvoy-nyemcynjywynamlahi/nyzye/khjdrehko-(qjhn|lyol)-.*/0$",
+ "^cop/devel/workflows-(prod|test)-.*/[0-9]+$", // Regex pattern that will match our fixture
+
+};
+
+TEST(bug317, regressionOnx86Bug317) {
+ hs_database_t *database;
+ hs_compile_error_t *compile_err;
+
+ unsigned ids[2] = {0};
+ ids[0]=0;
+ ids[1]=1;
+
+ const unsigned flag = HS_FLAG_SINGLEMATCH | HS_FLAG_ALLOWEMPTY | HS_FLAG_UTF8 | HS_FLAG_PREFILTER;
+ std::vector<unsigned> flags;
+ for (size_t i = 0; i < 2; ++i) {
+ flags.push_back(flag);
+ }
+ hs_error_t err = hs_compile_multi(patterns, flags.data(), ids, 2, HS_MODE_BLOCK, NULL, &database, &compile_err);
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_TRUE(database != nullptr);
+
+ // Allocate scratch space
+ hs_scratch_t *scratch = NULL;
+ err = hs_alloc_scratch(database, &scratch);
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_TRUE(scratch != nullptr);
+ // This input should match
+ const char* input = "cop/devel/workflows-prod-build-cop-cop-ingestor/0";
+
+ // Scan the input
+ bool matchFound = false;
+ auto matchHandler = [](unsigned int, unsigned long long, unsigned long long, unsigned int, void *ctx) -> int {
+ bool *matchFound = static_cast<bool*>(ctx);
+ *matchFound = true;
+ return 0;
+ };
+
+ err= hs_scan(database, input, strlen(input), 0, scratch, matchHandler, reinterpret_cast<void *>(&matchFound));
+ ASSERT_EQ(HS_SUCCESS, err);
+ ASSERT_EQ(true, matchFound);
+ // Clean up
+ hs_free_database(database);
+ err = hs_free_scratch(scratch);
+}