aboutsummaryrefslogtreecommitdiff
path: root/match.c
diff options
context:
space:
mode:
Diffstat (limited to 'match.c')
-rw-r--r--match.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/match.c b/match.c
index 17f88bb..461148d 100644
--- a/match.c
+++ b/match.c
@@ -335,10 +335,10 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat)
// point, it can be handled with normal recursion.
// See: left-recursion.md for more details.
if (str == pat->args.leftrec.at) {
- ++pat->args.leftrec.visits;
+ pat->args.leftrec.visited = true;
return clone_match(pat->args.leftrec.match);
} else {
- return match(ctx, str, pat->args.leftrec.fallback);
+ return match(pat->args.leftrec.ctx, str, pat->args.leftrec.fallback);
}
}
case BP_ANYCHAR: {
@@ -631,9 +631,10 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat)
.min_matchlen = 0, .max_matchlen = -1,
.args.leftrec = {
.match = NULL,
- .visits = 0,
+ .visited = false,
.at = str,
- .fallback = ref,
+ .fallback = pat,
+ .ctx = (void*)ctx,
},
};
match_ctx_t ctx2 = *ctx;
@@ -652,7 +653,7 @@ static match_t *match(match_ctx_t *ctx, const char *str, pat_t *pat)
match_t *m = match(&ctx2, str, ref);
// If left recursion was involved, keep retrying while forward progress can be made:
- if (m && rec_op.args.leftrec.visits > 0) {
+ if (m && rec_op.args.leftrec.visited) {
while (1) {
const char *prev = m->end;
rec_op.args.leftrec.match = m;