diff options
author | JSDurand <mmemmew@gmail.com> | 2022-01-31 15:59:11 +0800 |
---|---|---|
committer | JSDurand <mmemmew@gmail.com> | 2022-01-31 15:59:11 +0800 |
commit | eb007d554251456a2a508849edf91b15aab1333e (patch) | |
tree | bd88e78debdd646da87aa60f1bf2904eaa4370ca /src/dfa.c | |
parent | a8bd5e9d85ac9928bd29add82e887f82642af893 (diff) |
cnp: save point
Now we need to implement predicates, in order to have practical
applications.
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); +} |