/* See LICENSE file for copyright and license details. */ #ifndef LIBAUTOMATA_H #define LIBAUTOMATA_H #include #include /* Generic automaton */ struct libautomata_automaton; enum libautomata_automaton_state { LIBAUTOMATA_AUTOMATON_RUNNING, LIBAUTOMATA_AUTOMATON_ABORTED, LIBAUTOMATA_AUTOMATON_FINISHED }; union libautomata_node_state { intmax_t sint; uintmax_t uint; void *ptr; }; struct libautomata_node { struct libautomata_node *(*execute)(struct libautomata_automaton *, const void *input, void **input_out, size_t *lengthp); void (*reset)(struct libautomata_node *); int (*clone)(const struct libautomata_node *, struct libautomata_node *clone); void (*destory)(struct libautomata_node *); union libautomata_node_state state; size_t index; }; struct libautomata_automaton { struct libautomata_node *start; struct libautomata_node *current; struct libautomata_node *nodes; size_t nnodes; enum libautomata_automaton_state state; }; int libautomata_grow_automaton(struct libautomata_automaton *automaton, size_t n); void libautomata_reset_automaton(struct libautomata_automaton *automaton); int libautomata_clone_automaton(const struct libautomata_automaton *automaton, struct libautomata_automaton *clone); void libautomata_destroy_automaton(struct libautomata_automaton *automaton); void libautomata_free_automaton(struct libautomata_automaton *automaton); inline void libautomata_execute_automaton(struct libautomata_automaton *automaton, const void *input, void **input_out, size_t *lengthp) { automaton->current->execute(automaton, input, input_out, lengthp); } /* Knuth–Morris–Pratt substring search (finds end of substring) */ typedef struct libautomata_kmp_automaton LIBAUTOMATA_KMP_AUTOMATON; void libautomata_reset_kmp_automaton(LIBAUTOMATA_KMP_AUTOMATON *automaton); LIBAUTOMATA_KMP_AUTOMATON *libautomata_clone_kmp_automaton(const LIBAUTOMATA_KMP_AUTOMATON *automaton); LIBAUTOMATA_KMP_AUTOMATON *libautomata_compile_kmp_automaton(const void *pattern, size_t length, size_t elemsize); void *libautomata_execute_kmp_automaton(LIBAUTOMATA_KMP_AUTOMATON *automaton, const void *haystack, size_t length); /* Morris–Pratt substring search (finds end of substring) */ typedef struct libautomata_mp_automaton LIBAUTOMATA_MP_AUTOMATON; void libautomata_reset_mp_automaton(LIBAUTOMATA_MP_AUTOMATON *automaton); LIBAUTOMATA_MP_AUTOMATON *libautomata_clone_mp_automaton(const LIBAUTOMATA_MP_AUTOMATON *automaton); LIBAUTOMATA_MP_AUTOMATON *libautomata_compile_mp_automaton(const void *pattern, size_t length, size_t elemsize); void *libautomata_execute_mp_automaton(LIBAUTOMATA_MP_AUTOMATON *automaton, const void *haystack, size_t length); #endif