aboutsummaryrefslogtreecommitdiffstats
path: root/libautomata.h
diff options
context:
space:
mode:
Diffstat (limited to 'libautomata.h')
-rw-r--r--libautomata.h43
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