diff options
Diffstat (limited to '')
| -rw-r--r-- | libautomata.h | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/libautomata.h b/libautomata.h index 4f6caeb..82d4cdd 100644 --- a/libautomata.h +++ b/libautomata.h @@ -3,6 +3,45 @@ #define LIBAUTOMATA_H #include <stddef.h> +#include <stdint.h> + + +/* Generic 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) */ @@ -10,7 +49,7 @@ 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(const void *haystack, size_t length, LIBAUTOMATA_KMP_AUTOMATON *automaton); +void *libautomata_execute_kmp_automaton(LIBAUTOMATA_KMP_AUTOMATON *automaton, const void *haystack, size_t length); /* Morris–Pratt substring search (finds end of substring) */ @@ -18,7 +57,7 @@ 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(const void *haystack, size_t length, LIBAUTOMATA_MP_AUTOMATON *automaton); +void *libautomata_execute_mp_automaton(,LIBAUTOMATA_MP_AUTOMATON *automaton, const void *haystack, size_t length); #endif |
