From 0e299c5bd21b1577d1bac1394169c6dcbd378468 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Fri, 2 May 2008 21:04:24 +0000 Subject: [PATCH] fix regexp-match-positions* with input ports svn: r9604 --- collects/scheme/private/string.ss | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/collects/scheme/private/string.ss b/collects/scheme/private/string.ss index 5d70e89779..da8460b8e1 100644 --- a/collects/scheme/private/string.ss +++ b/collects/scheme/private/string.ss @@ -199,13 +199,21 @@ ;; re-match if we get a zero-length match at the ;; beginning, and we can continue [m (if (and (= mstart mend start) - (cond [end (< start end)] - [len (< start len)] - [(input-port? string) - (not (eof-object? - (peek-byte string)))] - [else (error "internal error (str)")])) - (match rx string (add1 start) end) + (cond + [end (< start end)] + [len (< start len)] + [(input-port? string) + (not (eof-object? (peek-byte string)))] + [else (error "internal error (str)")])) + (if (or peek? (not (input-port? string))) + (match rx string (add1 start) end) + ;; rematching on a port requires adding `start' + ;; offsets + (let ([m (match rx string 1 end)]) + (if (and m (positive? start)) + (list (cons (+ start (caar m)) + (+ start (cdar m)))) + m))) m)]) ;; fail if rematch failed (if (not m)