summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/impure/re.nim28
-rwxr-xr-xlib/pure/pegs.nim8
-rwxr-xr-xweb/news.txt2
3 files changed, 22 insertions, 16 deletions
diff --git a/lib/impure/re.nim b/lib/impure/re.nim
index 11db5cade..1fe1582bd 100755
--- a/lib/impure/re.nim
+++ b/lib/impure/re.nim
@@ -201,20 +201,20 @@ proc find*(s: string, pattern: TRegEx, start = 0): int =
   return rawMatches[0]
   
 iterator findAll*(s: string, pattern: TRegEx, start = 0): string = 
-  ## yields all matching captures of pattern in `s`.
-  var matches: array[0..MaxSubpatterns-1, string]
-  var i = start
-  while true: 
-    var j = find(s, pattern, matches, i)
-    if j < 0: break
-    i = j
-    for k in 0..maxSubPatterns-1: 
-      if isNil(matches[k]): break
-      inc(i, matches[k].len)
-      yield matches[k]
+  ## yields all matching *substrings* of `s` that match `pattern`.
+  var i = int32(start)
+  var rawMatches: array[0..maxSubpatterns * 3 - 1, cint]
+  while true:
+    let res = pcre.Exec(pattern.h, pattern.e, s, len(s), i, 0'i32,
+      cast[ptr cint](addr(rawMatches)), maxSubpatterns * 3)
+    if res < 0'i32: break
+    let a = rawMatches[0]
+    let b = rawMatches[1]
+    yield substr(s, int(a), int(b)-1)
+    i = b
 
 proc findAll*(s: string, pattern: TRegEx, start = 0): seq[string] = 
-  ## returns all matching captures of pattern in `s`.
+  ## returns all matching *substrings* of `s` that match `pattern`.
   ## If it does not match, @[] is returned.
   accumulateResult(findAll(s, pattern, start))
 
@@ -450,3 +450,7 @@ when isMainModule:
   for word in split("00232this02939is39an22example111", re"\d+"):
     writeln(stdout, word)
 
+  for x in findAll("abcdef", re"^{.}", 3):
+    assert x == "d"
+  for x in findAll("abcdef", re".", 3):
+    echo x
diff --git a/lib/pure/pegs.nim b/lib/pure/pegs.nim
index ed99ef3e8..0a7c95a70 100755
--- a/lib/pure/pegs.nim
+++ b/lib/pure/pegs.nim
@@ -829,7 +829,7 @@ proc find*(s: string, pattern: TPeg,
   return -1
   
 iterator findAll*(s: string, pattern: TPeg, start = 0): string = 
-  ## yields all matching captures of pattern in `s`.
+  ## yields all matching *substrings* of `s` that match `pattern`.
   var c: TCaptures
   c.origStart = start
   var i = start
@@ -837,12 +837,12 @@ iterator findAll*(s: string, pattern: TPeg, start = 0): string =
     c.ml = 0
     var L = rawMatch(s, pattern, i, c)
     if L < 0: break
-    for k in 0..c.ml-1: yield substr(s, c.matches[k][0], c.matches[k][1])
+    yield substr(s, i, i+L-1)
     inc(i, L)
     
 proc findAll*(s: string, pattern: TPeg, start = 0): seq[string] {.
   nosideEffect, rtl, extern: "npegs$1".} = 
-  ## returns all matching captures of pattern in `s`.
+  ## returns all matching *substrings* of `s` that match `pattern`.
   ## If it does not match, @[] is returned.
   accumulateResult(findAll(s, pattern, start))
   
@@ -1744,7 +1744,7 @@ when isMainModule:
   else:
     assert false
 
-  for x in findAll("abcdef", peg"{.}", 3):
+  for x in findAll("abcdef", peg".", 3):
     echo x
 
   for x in findAll("abcdef", peg"^{.}", 3):
diff --git a/web/news.txt b/web/news.txt
index cff4bcbec..e047cf1fc 100755
--- a/web/news.txt
+++ b/web/news.txt
@@ -69,6 +69,8 @@ Changes affecting backwards compatibility
   type class matching all proc types. Use ``proc ()`` to get the old meaning
   denoting a proc expecing no arguments and returing no value.
 - Deprecated ``system.GC_setStrategy``.
+- ``re.findAll`` and ``pegs.findAll`` don't return *captures* anymore but
+  matching *substrings*.
 
 
 Compiler Additions