From 6da44bdb6a9504950caa2fc0a0d15d5edae33e6b Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 3 Feb 2025 07:36:00 -0600 Subject: [PATCH] Get rid of early termination rule in all finite loops. --- src/core/peg.c | 4 ++-- test/suite-peg.janet | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/core/peg.c b/src/core/peg.c index 59de5bca..bb30dd0e 100644 --- a/src/core/peg.c +++ b/src/core/peg.c @@ -342,8 +342,8 @@ tail: while (captured < hi) { CapState cs2 = cap_save(s); next_text = peg_rule(s, rule_a, text); - if (!next_text || next_text == text) { - if (!next_text || captured > 0) cap_load(s, cs2); + if (!next_text || ((next_text == text) && (hi == UINT32_MAX))) { + cap_load(s, cs2); break; } captured++; diff --git a/test/suite-peg.janet b/test/suite-peg.janet index faf8a533..6ef67b19 100644 --- a/test/suite-peg.janet +++ b/test/suite-peg.janet @@ -789,13 +789,16 @@ "abc123" @["abc123"]) -# Issue 1554 -(test "issue 1554 case 1" '(any (> '1)) "abc" @["a"]) -(test "issue 1554 case 2" '(any (? (> '1))) "abc" @["a"]) -(test "issue 1554 case 3" '(any (> (? '1))) "abc" @["a"]) +# Issue 1554 - 0-width match termination behavior +(test "issue 1554 case 1" '(any (> '1)) "abc" @[]) +(test "issue 1554 case 2" '(any (? (> '1))) "abc" @[]) +(test "issue 1554 case 3" '(any (> (? '1))) "abc" @[]) (test "issue 1554 case 4" '(* "a" (> '1)) "abc" @["b"]) (test "issue 1554 case 5" '(* "a" (? (> '1))) "abc" @["b"]) (test "issue 1554 case 6" '(* "a" (> (? '1))) "abc" @["b"]) +(test "issue 1554 case 7" '(between 0 2 (> '1)) "abc" @["a" "a"]) +(test "issue 1554 case 8" '(between 2 3 (? (> '1))) "abc" @["a" "a" "a"]) +(test "issue 1554 case 9" '(between 0 0 (> (? '1))) "abc" @[]) (end-suite)