diff options
Diffstat (limited to 'src/dfa.c')
-rw-r--r-- | src/dfa.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -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); +} |