Skip to content

Commit 548245a

Browse files
authored
find some no capt opt (#140)
1 parent 6e86f6f commit 548245a

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ tests/tests2
99
tests/tests2.js
1010
tests/tests_misc
1111
tests/tests_misc.js
12+
tests/test_bug
1213
docs/ugh
1314
bin/*
1415
bench/bench

src/regex.nim

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,12 +600,19 @@ func match*(s: string, pattern: Regex2): bool {.inline, raises: [].} =
600600
when defined(noRegexOpt):
601601
template findSomeOptTpl(s, pattern, ms, i): untyped =
602602
findSomeImpl(s, pattern, ms, i)
603+
template findSomeOptTpl(s, pattern, ms, i, flags): untyped =
604+
findSomeImpl(s, pattern, ms, i, flags)
603605
else:
604606
template findSomeOptTpl(s, pattern, ms, i): untyped =
605607
if pattern.litOpt.canOpt:
606608
findSomeOptImpl(s, pattern, ms, i)
607609
else:
608610
findSomeImpl(s, pattern, ms, i)
611+
template findSomeOptTpl(s, pattern, ms, i, flags): untyped =
612+
if pattern.litOpt.canOpt:
613+
findSomeOptImpl(s, pattern, ms, i, flags)
614+
else:
615+
findSomeImpl(s, pattern, ms, i, flags)
609616

610617
iterator findAll*(
611618
s: string,
@@ -668,9 +675,10 @@ iterator findAllBounds*(
668675
var i = start
669676
var i2 = start-1
670677
var ms: RegexMatches2
678+
let flags = {mfNoCaptures}
671679
while i <= len(s):
672680
doAssert(i > i2); i2 = i
673-
i = findSomeOptTpl(s, pattern.toRegex, ms, i)
681+
i = findSomeOptTpl(s, pattern.toRegex, ms, i, flags)
674682
#debugEcho i
675683
if i < 0: break
676684
for ab in ms.bounds:
@@ -735,9 +743,10 @@ iterator split*(s: string, sep: Regex2): string {.inline, raises: [].} =
735743
i2 = -1
736744
done = false
737745
ms: RegexMatches2
746+
flags = {mfNoCaptures}
738747
while not done:
739748
doAssert(i > i2); i2 = i
740-
i = findSomeOptTpl(s, sep.toRegex, ms, i)
749+
i = findSomeOptTpl(s, sep.toRegex, ms, i, flags)
741750
done = i < 0 or i >= len(s)
742751
if done: ms.dummyMatch(s.len)
743752
for ab in ms.bounds:

src/regex/nfafindall2.nim

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,13 @@ func submatch(
173173
if matched:
174174
case ntn.kind
175175
of reGroupStart:
176-
captx = capts.diverge captx
177-
capts[captx, ntn.idx].a = i
176+
if mfNoCaptures notin flags:
177+
captx = capts.diverge captx
178+
capts[captx, ntn.idx].a = i
178179
of reGroupEnd:
179-
captx = capts.diverge captx
180-
capts[captx, ntn.idx].b = i-1
180+
if mfNoCaptures notin flags:
181+
captx = capts.diverge captx
182+
capts[captx, ntn.idx].b = i-1
181183
of assertionKind - lookaroundKind:
182184
matched = match(ntn, cPrev.Rune, c.Rune)
183185
of lookaroundKind:
@@ -268,7 +270,8 @@ func findSomeOptImpl*(
268270
text: string,
269271
regex: Regex,
270272
ms: var RegexMatches2,
271-
start: Natural
273+
start: Natural,
274+
flags: MatchFlags = {}
272275
): int =
273276
template regexSize: untyped =
274277
max(regex.litOpt.nfa.s.len, regex.nfa.s.len)
@@ -280,7 +283,7 @@ func findSomeOptImpl*(
280283
doAssert opt.nfa.s.len > 0
281284
initMaybeImpl(ms, regexSize, groupsLen)
282285
ms.clear()
283-
let flags = regex.flags.toMatchFlags + {mfFindMatchOpt}
286+
let flags = regex.flags.toMatchFlags + flags + {mfFindMatchOpt}
284287
let hasLits = opt.lits.len > 0
285288
let step = max(1, opt.lits.len)
286289
var limit = start.int

0 commit comments

Comments
 (0)