summaryrefslogtreecommitdiff
path: root/src/dfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dfa.c')
-rw-r--r--src/dfa.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/dfa.c b/src/dfa.c
index e3bcdf0..fb67047 100644
--- a/src/dfa.c
+++ b/src/dfa.c
@@ -59,12 +59,15 @@ void
destroy_dfa(dfa *table)
{
/* function pointers need no destructors */
- if (table->type == DFA_TYPE_SPECIAL) return;
+ if (table->type == DFA_TYPE_SPECIAL) goto free_last;
for (int i = 0; i < table->data.table.row_n;)
free(*(table->data.table.table+i++));
free(table->data.table.table);
+
+ free_last:
+
free(table);
}
@@ -690,3 +693,24 @@ run_dfa(const dfa * const restrict table, const NUM code)
return 0;
}
+
+P_ATTR
+static BOOL
+dfa_any_fun(const NUM UNUSED code) { return 1; }
+
+dfa *
+dfa_from_func(special_dfa func)
+{
+ dfa *result = NULL;
+ SAFE_MALLOC(dfa, result, 1, return NULL;);
+ result->type = DFA_TYPE_SPECIAL;
+ result->data.fn = func;
+
+ return result;
+}
+
+dfa *
+dfa_any(void)
+{
+ return dfa_from_func(dfa_any_fun);
+}