/*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2016, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
#include "fdr/fdr.h"
#include "nfa/accel.h"
#include "nfa/shufti.h"
+#include "nfa/truffle.h"
#include "nfa/vermicelli.h"
#include <string.h>
case ACCEL_SHUFTI:
DEBUG_PRINTF("single shufti\n");
return shuftiExec(aux->shufti.lo, aux->shufti.hi, ptr, end);
+ case ACCEL_TRUFFLE:
+ DEBUG_PRINTF("truffle\n");
+ return truffleExec(aux->truffle.mask1, aux->truffle.mask2, ptr, end);
default:
/* no acceleration, fall through and return current ptr */
+ DEBUG_PRINTF("no accel; %u\n", (int)aux->accel_type);
+ assert(aux->accel_type == ACCEL_NONE);
return ptr;
}
}
#include "ue2common.h"
#include "fdr/fdr_compile.h"
#include "nfa/shufticompile.h"
+#include "nfa/trufflecompile.h"
#include "util/alloc.h"
#include "util/bitutils.h"
#include "util/charreach.h"
for (u32 i = 0; i < MAX_ACCEL_OFFSET && i < lit.s.length(); i++) {
unsigned char c = lit.s[i];
if (lit.nocase) {
- DEBUG_PRINTF("adding %02hhx to %u\n", mytoupper(c), i);
- DEBUG_PRINTF("adding %02hhx to %u\n", mytolower(c), i);
reach[i].set(mytoupper(c));
reach[i].set(mytolower(c));
} else {
- DEBUG_PRINTF("adding %02hhx to %u\n", c, i);
reach[i].set(c);
}
}
assert(min_offset <= min_len);
if (min_count > MAX_SHUFTI_WIDTH) {
- DEBUG_PRINTF("min shufti with %u chars is too wide\n", min_count);
+ DEBUG_PRINTF("FAIL: min shufti with %u chars is too wide\n", min_count);
return;
}
return;
}
- DEBUG_PRINTF("fail\n");
+ truffleBuildMasks(cr, &aux->truffle.mask1, &aux->truffle.mask2);
+ DEBUG_PRINTF("built truffle for %s (%zu chars, offset %u)\n",
+ describeClass(cr).c_str(), cr.count(), min_offset);
+ aux->truffle.accel_type = ACCEL_TRUFFLE;
+ aux->truffle.offset = verify_u8(min_offset);
}
static