diff options
| author | Mattias Andrée <m@maandree.se> | 2025-12-17 16:20:43 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2025-12-17 16:20:43 +0100 |
| commit | ae89f342b51cb4ef71f18e89b74585cd61b05a60 (patch) | |
| tree | dac1ec69cb74001aacce013bb5879566bb04d845 /libautomata_execute_kmp_automaton.c | |
| download | libautomata-ae89f342b51cb4ef71f18e89b74585cd61b05a60.tar.gz libautomata-ae89f342b51cb4ef71f18e89b74585cd61b05a60.tar.bz2 libautomata-ae89f342b51cb4ef71f18e89b74585cd61b05a60.tar.xz | |
First commit
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'libautomata_execute_kmp_automaton.c')
| -rw-r--r-- | libautomata_execute_kmp_automaton.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/libautomata_execute_kmp_automaton.c b/libautomata_execute_kmp_automaton.c new file mode 100644 index 0000000..69ffcce --- /dev/null +++ b/libautomata_execute_kmp_automaton.c @@ -0,0 +1,40 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + + +void * +libautomata_execute_kmp_automaton(const void *haystack, size_t length, LIBAUTOMATA_KMP_AUTOMATON *automaton) +{ + const void *pattern = (void *)&automaton->next[automaton->length + 1U]; + size_t i = 0; + +#define INTRINSIC(TYPE)\ + (((const TYPE *)pattern)[automaton->position] == ((const TYPE *)haystack)[i]) + +#define MEMCMP(WIDTH)\ + (!memcmp(&((const char *)pattern)[automaton->position * automaton->elemsize],\ + &((const char *)haystack)[i * automaton->elemsize],\ + automaton->elemsize)) + +#define IMPLEMENT(EQ, EQ_PARAM)\ + while (i < length) {\ + while (automaton->position != SIZE_MAX && !(EQ(EQ_PARAM)))\ + automaton->position = automaton->next[automaton->position];\ + i++;\ + if (++automaton->position == automaton->length)\ + goto found;\ + }\ + return NULL + + switch (automaton->elemsize) { + case sizeof(uint8_t): IMPLEMENT(INTRINSIC, uint8_t); + case sizeof(uint16_t): IMPLEMENT(INTRINSIC, uint16_t); + case sizeof(uint32_t): IMPLEMENT(INTRINSIC, uint32_t); + case sizeof(uint64_t): IMPLEMENT(INTRINSIC, uint64_t); + default: IMPLEMENT(MEMCMP, elemsize); + } + +found: + automaton->position = automaton->next[automaton->position]; + return &(*(char **)(void *)&haystack)[i]; +} |
