~ chicken-core (chicken-5) 8fad80cf0fc99b2718575b3b4445119c253c2324
commit 8fad80cf0fc99b2718575b3b4445119c253c2324
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Feb 15 17:18:35 2010 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Feb 15 17:18:35 2010 +0100
deprecated glob\?, added scan-lines
diff --git a/manual/Unit regex b/manual/Unit regex
index 5872fe49..e68cfc33 100644
--- a/manual/Unit regex
+++ b/manual/Unit regex
@@ -57,16 +57,6 @@ Converts the file-pattern {{PATTERN}} into a regular expression.
?
-=== glob?
-
-<procedure>(glob? STRING)</procedure>
-
-Does the {{STRING}} have any "glob" wildcards?
-
-A string without any "glob" wildcards does not meet the criteria,
-even though it technically is a valid "glob" file-pattern.
-
-
=== regexp
<procedure>(regexp STRING [IGNORECASE [IGNORESPACE [UTF8]]])</procedure>
diff --git a/manual/Unit utils b/manual/Unit utils
index 20d581bb..e2b693b5 100644
--- a/manual/Unit utils
+++ b/manual/Unit utils
@@ -81,6 +81,7 @@ A parameter that holds a list of default options that should be given
to {{csc}} after invocation of the {{compile-file}} procedure.
The initial default options are {{-scrutinize -O2 -d2}}.
+
=== Shell argument quoting
==== qs
@@ -94,6 +95,18 @@ is simply enclosed in double-quote ({{"}}) characters, on UNIXish systems,
characters that would have a special meaning to the shell are escaped
using backslash ({{\}}).
+
+=== Scanning through an input port
+
+==== scan-lines
+
+<procedure>(scan-lines REGEXP [PORT])</procedure>
+
+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.
+
+
Previous: [[Unit posix]]
Next: [[Unit tcp]]
diff --git a/regex.scm b/regex.scm
index 95151252..88f703f9 100644
--- a/regex.scm
+++ b/regex.scm
@@ -245,8 +245,7 @@
;;; Glob support:
-;FIXME is it worthwhile making this accurate?
-(define (glob? str)
+(define (glob? str) ; DEPRECATED
(##sys#check-string str 'glob?)
(let loop ([idx (fx- (string-length str) 1)])
(and (fx<= 0 idx)
@@ -295,17 +294,19 @@
;;; Grep-like function on list:
(define grep
- (let ((string-search string-search))
+ (let ((string-search string-search)
+ (regexp regexp))
(lambda (rx lst #!optional (acc (lambda (x) x)))
(##sys#check-list lst 'grep)
- (let loop ((lst lst))
- (if (null? lst)
- '()
- (let ((x (##sys#slot lst 0))
- (r (##sys#slot lst 1)) )
- (if (string-search rx (acc x))
- (cons x (loop r))
- (loop r) ) ) ) ) ) ) )
+ (let ((rx (regexp rx)))
+ (let loop ((lst lst))
+ (if (null? lst)
+ '()
+ (let ((x (##sys#slot lst 0))
+ (r (##sys#slot lst 1)) )
+ (if (string-search rx (acc x))
+ (cons x (loop r))
+ (loop r) ) ) ) ) ) ) ) )
;;; Escape regular expression (suggested by Peter Bex):
diff --git a/types.db b/types.db
index 7974c6bf..5c05723f 100644
--- a/types.db
+++ b/types.db
@@ -890,7 +890,7 @@
;; regex
(glob->regexp (procedure glob->regexp (string) string))
-(glob? (procedure glob? (string) boolean))
+(glob? deprecated)
(grep (procedure grep (* list #!optional (procedure (*) *)) list))
(regexp (procedure regexp (* #!optional * * *) (struct regexp)))
(regexp-escape (procedure regexp-escape (string) string))
@@ -1391,5 +1391,6 @@
(qs (procedure qs (string) string))
(compile-file (procedure compile-file (string #!rest) string))
(compile-file-options (procedure compile-file-options (#!optional list) list))
+(scan-lines (procedure scan-lines (* #!optional port) *))
;; missing: setup-api, setup-download
diff --git a/utils.scm b/utils.scm
index 3b299f70..dd13914a 100644
--- a/utils.scm
+++ b/utils.scm
@@ -27,7 +27,7 @@
(declare
(unit utils)
- (uses extras srfi-13 posix files)
+ (uses extras srfi-13 posix files regex)
(usual-integrations)
(fixnum)
(hide chop-pds)
@@ -125,3 +125,18 @@
(abort ex))
(load-file f)
f)))))))
+
+
+;;; Scan lines until regex matches
+
+(define scan-lines
+ (let ((regexp regexp)
+ (read-line read-line)
+ (string-search string-search))
+ (lambda (rx #!optional (port ##sys#standard-input))
+ (let ((rx (regexp rx)))
+ (let loop ()
+ (let ((ln (read-line port)))
+ (and (not (eof-object? ln))
+ (let ((m (string-search rx ln)))
+ (or m (loop))))))))))
Trap