summaryrefslogtreecommitdiffstats
path: root/regex.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-09-13 06:46:04 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-09-13 06:46:04 -0700
commit1dcaca6fb851e21b4b6da0a5639431c481a57b04 (patch)
tree3e7718caa1646ae17e64f09c844f1768bbc57032 /regex.c
parente7c55ed9b8ff89310dc08b98eb03fc35ef280e41 (diff)
downloadtxr-1dcaca6fb851e21b4b6da0a5639431c481a57b04.tar.gz
txr-1dcaca6fb851e21b4b6da0a5639431c481a57b04.tar.bz2
txr-1dcaca6fb851e21b4b6da0a5639431c481a57b04.zip
regex: factor out repeated visit-coloring pattern.
* regex.c (nfa_test_set_visited): New inline function. (nfa_map_states, nfa_thread_epsilons, nfa_closure, nfa_move_closure): Use function instead of coding pattern which tests the state and sets the visited member.
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/regex.c b/regex.c
index 38e8c1ac..61cef2e6 100644
--- a/regex.c
+++ b/regex.c
@@ -1058,13 +1058,21 @@ static nfa_t nfa_compile_regex(val exp)
}
}
+INLINE int nfa_test_set_visited(nfa_state_t *s, unsigned visited)
+{
+ if (s && s->a.visited != visited) {
+ s->a.visited = visited;
+ return 1;
+ }
+ return 0;
+}
+
static void nfa_map_states(nfa_state_t *s,
mem_t *ctx, void (*fun)(nfa_state_t *,
mem_t *ctx),
unsigned visited)
{
- if (s && s->a.visited != visited) {
- s->a.visited = visited;
+ if (nfa_test_set_visited(s, visited)) {
fun(s, ctx);
switch (s->a.kind) {
@@ -1167,9 +1175,7 @@ static void nfa_thread_epsilons(nfa_state_t **ps, unsigned visited)
break;
}
- if (s->a.visited != visited) {
- s->a.visited = visited;
-
+ if (nfa_test_set_visited(s, visited)) {
if (ps1)
nfa_thread_epsilons(ps1, visited);
if (ps0)
@@ -1279,16 +1285,14 @@ static int nfa_closure(nfa_state_t **stack, nfa_state_t **set, int nin,
nfa_state_t *e0 = top->e.trans0;
nfa_state_t *e1 = top->e.trans1;
- if (e0 && e0->a.visited != visited) {
- e0->a.visited = visited;
+ if (nfa_test_set_visited(e0, visited)) {
stack[stackp++] = e0;
set[nout++] = e0;
if (nfa_accept_state_p(e0))
*accept = 1;
}
- if (e1 && e1->a.visited != visited) {
- e1->a.visited = visited;
+ if (nfa_test_set_visited(e1, visited)) {
stack[stackp++] = e1;
set[nout++] = e1;
if (nfa_accept_state_p(e1))
@@ -1367,16 +1371,14 @@ static int nfa_move_closure(nfa_state_t **stack, nfa_state_t **set, int nin,
nfa_state_t *e0 = top->e.trans0;
nfa_state_t *e1 = top->e.trans1;
- if (e0 && e0->a.visited != visited) {
- e0->a.visited = visited;
+ if (nfa_test_set_visited(e0, visited)) {
stack[stackp++] = e0;
set[nout++] = e0;
if (nfa_accept_state_p(e0))
*accept = 1;
}
- if (e1 && e1->a.visited != visited) {
- e1->a.visited = visited;
+ if (nfa_test_set_visited(e1, visited)) {
stack[stackp++] = e1;
set[nout++] = e1;
if (nfa_accept_state_p(e1))