~ chicken-core (chicken-5) 09740e031622a6dc7952753569c4acb32c641874
commit 09740e031622a6dc7952753569c4acb32c641874 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Sun Jul 2 12:22:37 2017 +1200 Commit: Peter Bex <peter@more-magic.net> CommitDate: Sun Jul 2 19:21:34 2017 +0200 Rework "glob->regexp" into "glob->sre" and add to irregex exports This was previously an internal procedure used variously within core, but it's useful enough to promote to an official API. So, simplify its interface (making it always return an SRE) and add it to the irregex library's exports. Signed-off-by: Peter Bex <peter@more-magic.net> diff --git a/NEWS b/NEWS index f4b0e041..5db0be65 100644 --- a/NEWS +++ b/NEWS @@ -47,6 +47,7 @@ - Keywords are now always written in "portable" style by WRITE, so that the reader's keyword style doesn't need to match the writer's. - The environment variable `CHICKEN_PREFIX` has been removed. + - Added the `glob->sre` procedure to the irregex library. - Module system - The compiler has been modularised, for improved namespacing. This diff --git a/chicken-status.scm b/chicken-status.scm index 32f6b09c..f1049687 100644 --- a/chicken-status.scm +++ b/chicken-status.scm @@ -69,8 +69,7 @@ (mtch (concatenate (map (lambda (pat) - (grep (irregex (##sys#glob->regexp pat)) - eggs)) + (grep (irregex (glob->sre pat)) eggs)) patterns))) (else (filter diff --git a/chicken-uninstall.scm b/chicken-uninstall.scm index af617d5a..9b40a3bd 100644 --- a/chicken-uninstall.scm +++ b/chicken-uninstall.scm @@ -62,8 +62,7 @@ (pats (if mtch (concatenate (map (lambda (pat) - (grep (irregex (##sys#glob->regexp pat)) - eggs)) + (grep (irregex (glob->sre pat)) eggs)) patterns)) (filter (lambda (egg) diff --git a/file.scm b/file.scm index cd0f6012..87579d45 100644 --- a/file.scm +++ b/file.scm @@ -267,7 +267,7 @@ EOF '() (let ((path (car paths))) (let-values (((dir fil ext) (decompose-pathname path))) - (let ((rx (##sys#glob->regexp (make-pathname #f (or fil "*") ext)))) + (let ((rx (irregex (glob->sre (make-pathname #f (or fil "*") ext))))) (let loop ((fns (directory (or dir ".") #t))) (cond ((null? fns) (conc-loop (cdr paths))) ((irregex-match rx (car fns)) => diff --git a/irregex.scm b/irregex.scm index b215240b..4959092c 100644 --- a/irregex.scm +++ b/irregex.scm @@ -56,7 +56,7 @@ irregex-match-subchunk ;; Utilities - sre->string irregex-opt irregex-quote) + glob->sre sre->string irregex-opt irregex-quote) (import scheme chicken @@ -220,49 +220,47 @@ (include "irregex-core.scm") (include "irregex-utils.scm") -(define ##sys#glob->regexp +(define glob->sre (let ((list->string list->string) (string->list string->list)) - (lambda (s #!optional sre?) - (##sys#check-string s 'glob->regexp) - (let ((sre - (cons - ': - (let loop ((cs (string->list s)) (dir #t)) - (if (null? cs) - '() - (let ((c (car cs)) - (rest (cdr cs)) ) - (cond ((char=? c #\*) - (if dir - `((or (: (~ ("./\\")) - (* (~ ("/\\")))) - (* (~ ("./\\")))) - ,@(loop rest #f)) - `((* (~ ("/\\"))) ,@(loop rest #f)))) - ((char=? c #\?) (cons 'any (loop rest #f))) - ((char=? c #\[) - (let loop2 ((rest rest) (s '())) - (cond ((not (pair? rest)) - (error 'glob->regexp - "unexpected end of character class" s)) - ((char=? #\] (car rest)) - `(,(if (> (length s) 1) - `(or ,@s) - (car s)) - ,@(loop (cdr rest) #f))) - ((and (pair? (cdr rest)) - (pair? (cddr rest)) - (char=? #\- (cadr rest)) ) - (loop2 (cdddr rest) - (cons `(/ ,(car rest) ,(caddr rest)) s))) - ((and (pair? (cdr rest)) - (char=? #\- (car rest))) - (loop2 (cddr rest) - (cons `(~ ,(cadr rest)) s))) - (else - (loop2 (cdr rest) (cons (car rest) s)))))) - (else (cons c (loop rest (memq c '(#\\ #\/)))))))))))) - (if sre? sre (irregex sre)))))) + (lambda (s) + (##sys#check-string s 'glob->sre) + (cons + ': + (let loop ((cs (string->list s)) (dir #t)) + (if (null? cs) + '() + (let ((c (car cs)) + (rest (cdr cs)) ) + (cond ((char=? c #\*) + (if dir + `((or (: (~ ("./\\")) + (* (~ ("/\\")))) + (* (~ ("./\\")))) + ,@(loop rest #f)) + `((* (~ ("/\\"))) ,@(loop rest #f)))) + ((char=? c #\?) (cons 'any (loop rest #f))) + ((char=? c #\[) + (let loop2 ((rest rest) (s '())) + (cond ((not (pair? rest)) + (error 'glob->sre + "unexpected end of character class" s)) + ((char=? #\] (car rest)) + `(,(if (> (length s) 1) + `(or ,@s) + (car s)) + ,@(loop (cdr rest) #f))) + ((and (pair? (cdr rest)) + (pair? (cddr rest)) + (char=? #\- (cadr rest)) ) + (loop2 (cdddr rest) + (cons `(/ ,(car rest) ,(caddr rest)) s))) + ((and (pair? (cdr rest)) + (char=? #\- (car rest))) + (loop2 (cddr rest) + (cons `(~ ,(cadr rest)) s))) + (else + (loop2 (cdr rest) (cons (car rest) s)))))) + (else (cons c (loop rest (memq c '(#\\ #\/))))))))))))) ) diff --git a/tests/test-glob.scm b/tests/test-glob.scm index 91fc3d64..62ccc6fb 100644 --- a/tests/test-glob.scm +++ b/tests/test-glob.scm @@ -3,18 +3,18 @@ (use irregex) -(assert (irregex-match (##sys#glob->regexp "foo.bar") "foo.bar")) -(assert (irregex-match (##sys#glob->regexp "foo*") "foo.bar")) -(assert (irregex-match (##sys#glob->regexp "foo/*") "foo/bar")) -(assert (not (irregex-match (##sys#glob->regexp "foo/*") "foo/bar/baz"))) -(assert (irregex-match (##sys#glob->regexp "foo/*/*") "foo/bar/baz")) -(assert (not (irregex-match (##sys#glob->regexp "foo/*") "foo/.bar"))) -(assert (irregex-match (##sys#glob->regexp "*foo") "xyzfoo")) -(assert (not (irregex-match (##sys#glob->regexp "*foo") ".foo"))) -(assert (not (irregex-match (##sys#glob->regexp "*foo*") "a.fooxxx/yyy"))) -(assert (irregex-match (##sys#glob->regexp "*foo*") "fooxxx")) -(assert (irregex-match (##sys#glob->regexp "main.[ch]") "main.c")) -(assert (irregex-match (##sys#glob->regexp "main.[ch]") "main.h")) -(assert (not (irregex-match (##sys#glob->regexp "main.[ch]") "main.cpp"))) -(assert (irregex-match (##sys#glob->regexp "main.[-c]") "main.h")) -(assert (not (irregex-match (##sys#glob->regexp "main.[-h]") "main.h"))) +(assert (irregex-match (glob->sre "foo.bar") "foo.bar")) +(assert (irregex-match (glob->sre "foo*") "foo.bar")) +(assert (irregex-match (glob->sre "foo/*") "foo/bar")) +(assert (not (irregex-match (glob->sre "foo/*") "foo/bar/baz"))) +(assert (irregex-match (glob->sre "foo/*/*") "foo/bar/baz")) +(assert (not (irregex-match (glob->sre "foo/*") "foo/.bar"))) +(assert (irregex-match (glob->sre "*foo") "xyzfoo")) +(assert (not (irregex-match (glob->sre "*foo") ".foo"))) +(assert (not (irregex-match (glob->sre "*foo*") "a.fooxxx/yyy"))) +(assert (irregex-match (glob->sre "*foo*") "fooxxx")) +(assert (irregex-match (glob->sre "main.[ch]") "main.c")) +(assert (irregex-match (glob->sre "main.[ch]") "main.h")) +(assert (not (irregex-match (glob->sre "main.[ch]") "main.cpp"))) +(assert (irregex-match (glob->sre "main.[-c]") "main.h")) +(assert (not (irregex-match (glob->sre "main.[-h]") "main.h"))) diff --git a/types.db b/types.db index 0b3077e6..5b1eaf14 100644 --- a/types.db +++ b/types.db @@ -1730,6 +1730,7 @@ (chicken.irregex#sre->irregex (#(procedure #:clean) chicken.irregex#sre->irregex (#!rest) *)) (chicken.irregex#string->irregex (#(procedure #:clean #:enforce) chicken.irregex#string->irregex (string #!rest) *)) (chicken.irregex#string->sre (#(procedure #:clean #:enforce) chicken.irregex#string->sre (string #!rest) *)) +(chicken.irregex#glob->sre (#(procedure #:clean #:enforce) chicken.irregex#glob->sre (string) (pair symbol *))) ;; memoryTrap