~ chicken-core (chicken-5) e78ff953fa241b3d31deda11f1c99a872fdc25c4
commit e78ff953fa241b3d31deda11f1c99a872fdc25c4
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Feb 19 08:15:22 2010 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Feb 19 08:15:22 2010 +0100
scan-input-lines also accepts predicate as first argument
diff --git a/manual/Unit utils b/manual/Unit utils
index a537abda..8154fb5d 100644
--- a/manual/Unit utils
+++ b/manual/Unit utils
@@ -106,6 +106,9 @@ Reads lines from {{PORT}} (defaults to the result of {{(current-input-port)}})
using {{read-line}} and returns the result of {{(string-search REGEXP LINE)}},
if the match succeeds. If no match could be found, {{#f}} is returned.
+{{REGEXP}} may also be a procedure of one argument which is called for each
+input line and should return a non-false value on success.
+
Previous: [[Unit posix]]
diff --git a/utils.scm b/utils.scm
index 3a81fbeb..0d60bd72 100644
--- a/utils.scm
+++ b/utils.scm
@@ -127,16 +127,18 @@
f)))))))
-;;; Scan lines until regex matches
+;;; Scan lines until regex or predicate matches
(define scan-input-lines
(let ((regexp regexp)
(read-line read-line)
(string-search string-search))
(lambda (rx #!optional (port ##sys#standard-input))
- (let ((rx (regexp rx)))
+ (let ((rx (if (procedure? rx)
+ rx
+ (cut string-search (regexp rx) <>))))
(let loop ()
(let ((ln (read-line port)))
(and (not (eof-object? ln))
- (let ((m (string-search rx ln)))
- (or m (loop))))))))))
+ (or (rx ln)
+ (loop)))))))))
Trap