~ chicken-core (chicken-5) 972d399b59a383c46b11f74c7388258b7f533f45
commit 972d399b59a383c46b11f74c7388258b7f533f45 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sat Jun 18 13:12:38 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sat Jun 18 13:12:38 2011 +0200 tried to make make-pathname more sensible (thanks to Jim Ursetto) diff --git a/files.scm b/files.scm index 5496e949..a9c37e77 100644 --- a/files.scm +++ b/files.scm @@ -159,55 +159,48 @@ EOF (define-inline (*char-pds? ch) (memq ch '(#\\ #\/))) -(define (chop-pds str pds) +(define (chop-pds str) (and str - (let ((len (##sys#size str)) - (pdslen (if pds (##sys#size pds) 1))) + (let ((len (##sys#size str))) (if (and (fx>= len 1) - (if pds - (##core#inline "C_substring_compare" str pds (fx- len pdslen) 0 pdslen) - (*char-pds? (##core#inline "C_subchar" str (fx- len pdslen)) ) ) ) - (##sys#substring str 0 (fx- len pdslen)) + (*char-pds? (##core#inline "C_subchar" str (fx- len 1)) ) ) + (##sys#substring str 0 (fx- len 1)) str) ) ) ) (define make-pathname) (define make-absolute-pathname) -(let ([def-pds "/"] ) +(let () - (define (conc-dirs dirs pds) + (define (conc-dirs dirs) (##sys#check-list dirs 'make-pathname) - (let loop ([strs dirs]) + (let loop ((strs dirs)) (if (null? strs) "" (let ((s1 (car strs))) (if (zero? (string-length s1)) (loop (cdr strs)) (string-append - (chop-pds (car strs) pds) - (or pds def-pds) + (chop-pds (car strs)) + "/" (loop (cdr strs))) ) ) ) ) ) - (define (canonicalize-dirs dirs pds) - (cond [(or (not dirs) (null? dirs)) ""] - [(string? dirs) (conc-dirs (list dirs) pds)] - [else (conc-dirs dirs pds)] ) ) + (define (canonicalize-dirs dirs) + (cond ((or (not dirs) (null? dirs)) "") + ((string? dirs) (conc-dirs (list dirs))) + (else (conc-dirs dirs)) ) ) - (define (_make-pathname loc dir file ext pds) - (let ([ext (or ext "")] - [file (or file "")] - [pdslen (if pds (##sys#size pds) 1)] ) + (define (_make-pathname loc dir file ext) + (let ((ext (or ext "")) + (file (or file ""))) (##sys#check-string dir loc) (##sys#check-string file loc) (##sys#check-string ext loc) - (when pds (##sys#check-string pds loc)) (string-append dir - (if (and (fx>= (##sys#size file) pdslen) - (if pds - (##core#inline "C_substring_compare" pds file 0 0 pdslen) - (*char-pds? (##core#inline "C_subchar" file 0)))) - (##sys#substring file pdslen (##sys#size file)) + (if (and (fx>= (##sys#size file) 1) + (*char-pds? (##core#inline "C_subchar" file 0))) + (##sys#substring file 1 (##sys#size file)) file) (if (and (fx> (##sys#size ext) 0) (not (char=? (##core#inline "C_subchar" ext 0) #\.)) ) @@ -217,17 +210,17 @@ EOF (set! make-pathname (lambda (dirs file #!optional ext) - (_make-pathname 'make-pathname (canonicalize-dirs dirs def-pds) file ext def-pds))) + (_make-pathname 'make-pathname (canonicalize-dirs dirs) file ext))) (set! make-absolute-pathname (lambda (dirs file #!optional ext) (_make-pathname 'make-absolute-pathname - (let ([dir (canonicalize-dirs dirs def-pds)]) + (let ((dir (canonicalize-dirs dirs))) (if (absolute-pathname? dir) dir - (##sys#string-append def-pds dir)) ) - file ext def-pds) ) ) ) + (##sys#string-append "/"dir)) ) + file ext) ) ) ) (define decompose-pathname (let* ([patt1 "^(.*[\\/\\\\])?([^\\/\\\\]+)(\\.([^\\/\\\\.]+))$"] @@ -239,7 +232,7 @@ EOF (and dir (if (member dir '("/" "\\")) dir - (chop-pds dir #f) ) ) )] ) + (chop-pds dir) ) ) )] ) (lambda (pn) (##sys#check-string pn 'decompose-pathname) (if (fx= 0 (##sys#size pn)) diff --git a/manual/Unit files b/manual/Unit files index bdbc3e58..1c4c3d59 100644 --- a/manual/Unit files +++ b/manual/Unit files @@ -30,14 +30,10 @@ For any component that is not contained in {{PATHNAME}}, {{#f}} is returned. <procedure>(make-pathname DIRECTORY FILENAME [EXTENSION])</procedure><br> <procedure>(make-absolute-pathname DIRECTORY FILENAME [EXTENSION])</procedure> -Returns a string that names the file with the -components {{DIRECTORY, FILENAME}} and (optionally) -{{EXTENSION}} with {{SEPARATOR}} being the directory separation indicator -(usually {{/}} on UNIX systems and {{\}} on Windows, defaulting to whatever -platform this is running on). -{{DIRECTORY}} can be {{#f}} (meaning no -directory component), a string or a list of strings. {{FILENAME}} -and {{EXTENSION}} should be strings or {{#f}}. +Returns a string that names the file with the components {{DIRECTORY, +FILENAME}} and (optionally) {{EXTENSION}}. {{DIRECTORY}} can be +{{#f}} (meaning no directory component), a string or a list of +strings. {{FILENAME}} and {{EXTENSION}} should be strings or {{#f}}. {{make-absolute-pathname}} returns always an absolute pathname. ==== pathname-directory diff --git a/tests/path-tests.scm b/tests/path-tests.scm index a1d5ee64..72975ea8 100644 --- a/tests/path-tests.scm +++ b/tests/path-tests.scm @@ -1,30 +1,26 @@ (use files) -(assert (equal? "/" (pathname-directory "/"))) -(assert (equal? "/" (pathname-directory "/abc"))) -(assert (equal? "abc" (pathname-directory "abc/"))) -(assert (equal? "abc" (pathname-directory "abc/def"))) -(assert (equal? "abc" (pathname-directory "abc/def.ghi"))) -(assert (equal? "abc" (pathname-directory "abc/.def.ghi"))) -(assert (equal? "abc" (pathname-directory "abc/.ghi"))) -(assert (equal? "/abc" (pathname-directory "/abc/"))) -(assert (equal? "/abc" (pathname-directory "/abc/def"))) -(assert (equal? "/abc" (pathname-directory "/abc/def.ghi"))) -(assert (equal? "/abc" (pathname-directory "/abc/.def.ghi"))) -(assert (equal? "/abc" (pathname-directory "/abc/.ghi"))) -(assert (equal? "q/abc" (pathname-directory "q/abc/"))) -(assert (equal? "q/abc" (pathname-directory "q/abc/def"))) -(assert (equal? "q/abc" (pathname-directory "q/abc/def.ghi"))) -(assert (equal? "q/abc" (pathname-directory "q/abc/.def.ghi"))) -(assert (equal? "q/abc" (pathname-directory "q/abc/.ghi"))) - (define-syntax test (syntax-rules () - ((_ expected exp) - (let ((result exp) - (expd expected)) - (unless (equal? result expd) - (error "test failed" result expd 'exp)))))) + ((_ r x) (let ((y x)) (print y) (assert (equal? r y)))))) + +(test "/" (pathname-directory "/")) +(test "/" (pathname-directory "/abc")) +(test "abc" (pathname-directory "abc/")) +(test "abc" (pathname-directory "abc/def")) +(test "abc" (pathname-directory "abc/def.ghi")) +(test "abc" (pathname-directory "abc/.def.ghi")) +(test "abc" (pathname-directory "abc/.ghi")) +(test "/abc" (pathname-directory "/abc/")) +(test "/abc" (pathname-directory "/abc/def")) +(test "/abc" (pathname-directory "/abc/def.ghi")) +(test "/abc" (pathname-directory "/abc/.def.ghi")) +(test "/abc" (pathname-directory "/abc/.ghi")) +(test "q/abc" (pathname-directory "q/abc/")) +(test "q/abc" (pathname-directory "q/abc/def")) +(test "q/abc" (pathname-directory "q/abc/def.ghi")) +(test "q/abc" (pathname-directory "q/abc/.def.ghi")) +(test "q/abc" (pathname-directory "q/abc/.ghi")) (test "./" (normalize-pathname "" 'unix)) (test ".\\" (normalize-pathname "" 'windows)) @@ -72,3 +68,11 @@ (test '(#f "/" ("foo" "bar")) (receive (decompose-directory "//foo//bar"))) (test '(#f #f (" " "foo" "bar")) (receive (decompose-directory " //foo//bar"))) (test '(#f #f ("foo" "bar")) (receive (decompose-directory "foo//bar/"))) + +(test "x/y/z.q" (make-pathname "x/y" "z" "q")) +(test "x/y/z.q" (make-pathname "x/y" "z.q")) +(test "x/y/z.q" (make-pathname "x/y/" "z.q")) +(test "x/y/z.q" (make-pathname "x/y/" "z.q")) +(test "x/y/z.q" (make-pathname "x/y\\" "z.q")) +(test "x//y/z.q" (make-pathname "x//y/" "z.q")) +(test "x\\y/z.q" (make-pathname "x\\y" "z.q"))Trap