summaryrefslogtreecommitdiff
path: root/src/dfa.c
diff options
context:
space:
mode:
authorJSDurand <mmemmew@gmail.com>2022-01-31 15:59:11 +0800
committerJSDurand <mmemmew@gmail.com>2022-01-31 15:59:11 +0800
commiteb007d554251456a2a508849edf91b15aab1333e (patch)
treebd88e78debdd646da87aa60f1bf2904eaa4370ca /src/dfa.c
parenta8bd5e9d85ac9928bd29add82e887f82642af893 (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.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);
+}