Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions hyperscan/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
class Hyperscan(object):
"""The Hyperscan class."""

def __init__(self, patterns=None, flags=None, mode=None):
def __init__(self, patterns=None, flags=None, mode=None, ids=None):
"""Init.

Args:
Expand All @@ -46,14 +46,16 @@ def __init__(self, patterns=None, flags=None, mode=None):

if mode is None:
mode = self._hs.HS_MODE_BLOCK

if ids is None:
ids = [0] * len(patterns)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about making the default a NULL pointer here instead of replicating Hyperscan's default? Seems more robust to me even if you'd have to special case it in _CompilePatterns then.

self.patterns = patterns
self.flags = flags
self.mode = mode
self.ids = ids

self._CompilePatterns(self.patterns, self.flags, self.mode)
self._CompilePatterns(self.patterns, self.flags, self.mode, self.ids)

def _CompilePatterns(self, patterns, flags, mode):
def _CompilePatterns(self, patterns, flags, mode, ids):
"""Compiles the patterns/flags given into a database."""
try:
res = self._hs.hs_free_database(self._database_p[0])
Expand All @@ -68,12 +70,15 @@ def _CompilePatterns(self, patterns, flags, mode):
cffi_flags = self._ffi.new("int []", flags)
cffi_flags_p = self._ffi.cast("unsigned int *", cffi_flags)

cffi_ids = self._ffi.new("int []", ids)
cffi_ids_p = self._ffi.cast("unsigned int *", cffi_ids)

database_p = self._ffi.new("hs_database_t **")

compile_error_p = self._ffi.new("hs_compile_error_t **")

res = self._hs.hs_compile_multi(cffi_array, cffi_flags_p,
self._ffi.cast("unsigned int *", 0),
cffi_ids_p,
len(patterns), mode,
self._ffi.cast("hs_platform_info_t *", 0),
database_p, compile_error_p)
Expand Down Expand Up @@ -101,7 +106,7 @@ def _FreeScratch(self, scratch_p):
def _EnsureMode(self, mode):
if self.mode != mode:
self.mode = mode
self._CompilePatterns(self.patterns, self.flags, self.mode)
self._CompilePatterns(self.patterns, self.flags, self.mode, self.ids)

def ScanBlock(self, data, callback=None):
"""Scans a single block of data for the patterns."""
Expand Down
2 changes: 1 addition & 1 deletion hyperscan/hyperscan_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
typedef struct hs_scratch hs_scratch_t;

struct hs_stream;
typedef struct hs_scratch hs_stream_t;
typedef struct hs_stream hs_stream_t;

#define HS_SUCCESS 0
#define HS_INVALID -1
Expand Down