~ chicken-core (chicken-5) 59200008876d3fc6cda1dfe0276b5ef1a59de65c


commit 59200008876d3fc6cda1dfe0276b5ef1a59de65c
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Nov 6 10:13:16 2015 +0100
Commit:     Mario Domenech Goulart <mario.goulart@gmail.com>
CommitDate: Thu Nov 12 21:16:30 2015 -0200

    On UNIX-based systems, only accept "/" as path-separator. Windows still allows "/" and "\" (as does the Windows file-APIs)
    
    Signed-off-by: Mario Domenech Goulart <mario.goulart@gmail.com>

diff --git a/files.scm b/files.scm
index 8f19c39f..32a756d1 100644
--- a/files.scm
+++ b/files.scm
@@ -161,7 +161,7 @@ EOF
       (set! absolute-pathname-root (lambda (pn) (irregex-match rx pn)))
       (set! root-origin (lambda (rt) (and rt (irregex-match-substring rt 1))))
       (set! root-directory (lambda (rt) (and rt (irregex-match-substring rt 2)))) )
-    (let ((rx (irregex "([\\/\\\\]).*")))
+    (let ((rx (irregex "(/).*")))
       (set! absolute-pathname-root (lambda (pn) (irregex-match rx pn)))
       (set! root-origin (lambda (rt) #f))
       (set! root-directory (lambda (rt) (and rt (irregex-match-substring rt 1)))) ) )
@@ -170,7 +170,10 @@ EOF
   (##sys#check-string pn 'absolute-pathname?)
   (irregex-match-data? (absolute-pathname-root pn)) )
 
-(define-inline (*char-pds? ch) (memq ch '(#\\ #\/)))
+(define-inline (*char-pds? ch) 
+  (if ##sys#windows-platform 
+      (memq ch '(#\\ #\/))
+      (eq? #\/ ch)))
 
 (define (chop-pds str)
   (and str
@@ -185,7 +188,7 @@ EOF
 (define make-pathname)
 (define make-absolute-pathname)
 
-(let ()
+(let ((pds (if ##sys#windows-platform "\\" "/")))
 
   (define (conc-dirs dirs)
     (##sys#check-list dirs 'make-pathname)
@@ -197,7 +200,7 @@ EOF
 		(loop (cdr strs))
 		(string-append 
 		 (chop-pds (car strs))
-		 "/"
+		 pds
 		 (loop (cdr strs))) ) ) ) ) )
 
   (define (canonicalize-dirs dirs)
@@ -235,12 +238,16 @@ EOF
        (let ((dir (canonicalize-dirs dirs)))
 	 (if (absolute-pathname? dir)
 	     dir
-	     (##sys#string-append "/"dir)) )
+	     (##sys#string-append pds dir)) )
        file ext) ) ) )
 
 (define decompose-pathname
-  (let* ([patt1 "^(.*[\\/\\\\])?([^\\/\\\\]+)(\\.([^\\/\\\\.]+))$"]
-	 [patt2 "^(.*[\\/\\\\])?((\\.)?[^\\/\\\\]+)$"]
+  (let* ((patt1 (if ##sys#windows-platform
+                    "^(.*[\\/\\\\])?([^\\/\\\\]+)(\\.([^\\/\\\\.]+))$"
+                    "^(.*/)?([^/]+)(\\.([^/.]+))$"))
+	 (patt2 (if ##sys#windows-platform
+                    "^(.*[\\/\\\\])?((\\.)?[^\\/\\\\]+)$"
+                    "^(.*/)?((\\.)?[^/]+)$"))
 	 [rx1 (irregex patt1)]
 	 [rx2 (irregex patt2)]
 	 [strip-pds
@@ -375,6 +382,10 @@ EOF
             (else (cons part parts) ) ) )
     (lambda (path #!optional (platform bldplt))
       (let ((sep (if (eq? platform 'windows) #\\ #\/)))
+        (define (pds? c)
+          (if (eq? platform 'windows)
+              (memq c '(#\/ #\\))
+              (eq? c #\/)))
 	(##sys#check-string path 'normalize-pathname)
 	(let ((len (##sys#size path))
 	      (type #f)
@@ -401,7 +412,7 @@ EOF
 			   (when drive
 			     (set! r (##sys#string-append drive r)))
 			   r))))
-		  ((*char-pds? (string-ref path i))
+		  ((pds? (string-ref path i))
 		   (when (not type)
 		     (set! type (if (fx= i prev) 'abs 'rel)))
 		   (if (fx= i prev)
@@ -411,7 +422,7 @@ EOF
 			     (addpart (##sys#substring path prev i) parts))))
 		  ((and (null? parts) 
 			(char=? (string-ref path i) #\:)
-			(eq? 'windows platform))
+			(eq? platform 'windows))
 		   (set! drive (##sys#substring path 0 (fx+ i 1)))
 		   (loop (fx+ i 1) (fx+ i 1) '()))
 		  (else (loop (fx+ i 1) prev parts)) ) ) ) ) ) ) )
@@ -423,7 +434,7 @@ EOF
 (define split-directory
   (lambda (loc dir keep?)
     (##sys#check-string dir loc)
-    (string-split dir "/\\" keep?) ) )
+    (string-split dir (if ##sys#windows-platform "/\\" "/") keep?) ) )
 
 ;; Directory string or list only contains path-separators
 ;; and/or current-directory (".") names.
diff --git a/tests/path-tests.scm b/tests/path-tests.scm
index 6e66fa66..52eefc4b 100644
--- a/tests/path-tests.scm
+++ b/tests/path-tests.scm
@@ -36,7 +36,7 @@
 (test "a" (normalize-pathname "a"))
 (test "a/" (normalize-pathname "a/" 'unix))
 (test "a/b" (normalize-pathname "a/b" 'unix))
-(test "a/b" (normalize-pathname "a\\b" 'unix))
+(test "a\\b" (normalize-pathname "a\\b" 'unix))
 (test "a\\b" (normalize-pathname "a\\b" 'windows))
 (test "a\\b" (normalize-pathname "a/b" 'windows))
 (test "a/b/" (normalize-pathname "a/b/" 'unix))
@@ -67,7 +67,11 @@
 (assert (not (directory-null? "//foo//")))
 
 (test '(#f "/" (".")) (receive (decompose-directory "/.//")))
-(test '(#f "/" #f) (receive (decompose-directory "///\\///")))
+
+(if ##sys#windows-platform
+    (test '(#f "\\" #f) (receive (decompose-directory "///\\///")))
+    (test '(#f "/" ("\\")) (receive (decompose-directory "///\\///"))))
+
 (test '(#f "/" ("foo")) (receive (decompose-directory "//foo//")))
 (test '(#f "/" ("foo" "bar")) (receive (decompose-directory "//foo//bar")))
 (test '(#f #f (".")) (receive (decompose-directory ".//")))
@@ -77,50 +81,117 @@
 
 (test '(#f #f #f) (receive (decompose-pathname "")))
 (test '("/" #f #f) (receive (decompose-pathname "/")))
-(test '("\\" #f #f) (receive (decompose-pathname "\\")))
+
+(if ##sys#windows-platform
+    (test '("\\" #f #f) (receive (decompose-pathname "\\")))
+    (test '(#f "\\" #f) (receive (decompose-pathname "\\"))))
+
 (test '("/" "a" #f) (receive (decompose-pathname "/a")))
-(test '("\\" "a" #f) (receive (decompose-pathname "\\a")))
+
+(if ##sys#windows-platform
+    (test '("\\" "a" #f) (receive (decompose-pathname "\\a")))
+    (test '(#f "\\a" #f) (receive (decompose-pathname "\\a"))))
+
 (test '("/" #f #f) (receive (decompose-pathname "///")))
-(test '("\\" #f #f) (receive (decompose-pathname "\\\\\\")))
+
+(if ##sys#windows-platform
+    (test '("\\" #f #f) (receive (decompose-pathname "\\\\\\")))
+    (test '(#f "\\\\\\" #f) (receive (decompose-pathname "\\\\\\"))))
+
 (test '("/" "a" #f) (receive (decompose-pathname "///a")))
-(test '("\\" "a" #f) (receive (decompose-pathname "\\\\\\a")))
+
+(if ##sys#windows-platform
+    (test '("\\" "a" #f) (receive (decompose-pathname "\\\\\\a")))
+    (test '(#f "\\\\\\a" #f) (receive (decompose-pathname "\\\\\\a"))))
+
 (test '("/a" "b" #f) (receive (decompose-pathname "/a/b")))
-(test '("\\a" "b" #f) (receive (decompose-pathname "\\a\\b")))
+
+(if ##sys#windows-platform
+    (test '("\\a" "b" #f) (receive (decompose-pathname "\\a\\b")))
+    (test '(#f "\\a\\b" #f) (receive (decompose-pathname "\\a\\b"))))
+
 (test '("/a" "b" "c") (receive (decompose-pathname "/a/b.c")))
-(test '("\\a" "b" "c") (receive (decompose-pathname "\\a\\b.c")))
+
+(if ##sys#windows-platform
+    (test '("\\a" "b" "c") (receive (decompose-pathname "\\a\\b.c")))
+    (test '(#f "\\a\\b" "c") (receive (decompose-pathname "\\a\\b.c"))))
+
 (test '("." "a" #f) (receive (decompose-pathname "./a")))
-(test '("." "a" #f) (receive (decompose-pathname ".\\a")))
+
+(if ##sys#windows-platform
+    (test '("." "a" #f) (receive (decompose-pathname ".\\a")))
+    (test '(#f ".\\a" #f) (receive (decompose-pathname ".\\a"))))
+
 (test '("." "a" "b") (receive (decompose-pathname "./a.b")))
-(test '("." "a" "b") (receive (decompose-pathname ".\\a.b")))
+
+(if ##sys#windows-platform
+    (test '("." "a" "b") (receive (decompose-pathname ".\\a.b")))
+    (test '(#f ".\\a" "b") (receive (decompose-pathname ".\\a.b"))))
+
 (test '("./a" "b" #f) (receive (decompose-pathname "./a/b")))
-(test '(".\\a" "b" #f) (receive (decompose-pathname ".\\a\\b")))
+
+(if ##sys#windows-platform
+    (test '(".\\a" "b" #f) (receive (decompose-pathname ".\\a\\b")))
+    (test '(#f ".\\a\\b" #f) (receive (decompose-pathname ".\\a\\b"))))
+
 (test '(#f "a" #f) (receive (decompose-pathname "a")))
 (test '(#f "a." #f) (receive (decompose-pathname "a.")))
 (test '(#f ".a" #f) (receive (decompose-pathname ".a")))
 (test '("a" "b" #f) (receive (decompose-pathname "a/b")))
-(test '("a" "b" #f) (receive (decompose-pathname "a\\b")))
+
+(if ##sys#windows-platform
+    (test '("a" "b" #f) (receive (decompose-pathname "a\\b")))
+    (test '(#f "a\\b" #f) (receive (decompose-pathname "a\\b"))))
+
 (test '("a" "b" #f) (receive (decompose-pathname "a///b")))
-(test '("a" "b" #f) (receive (decompose-pathname "a\\\\\\b")))
+
+(if ##sys#windows-platform
+    (test '("a" "b" #f) (receive (decompose-pathname "a\\\\\\b")))
+    (test '(#f "a\\\\\\b" #f) (receive (decompose-pathname "a\\\\\\b"))))
+
 (test '("a/b" "c" #f) (receive (decompose-pathname "a/b/c")))
-(test '("a\\b" "c" #f) (receive (decompose-pathname "a\\b\\c")))
+
+(if ##sys#windows-platform
+    (test '("a\\b" "c" #f) (receive (decompose-pathname "a\\b\\c")))
+    (test '(#f "a\\b\\c" #f) (receive (decompose-pathname "a\\b\\c"))))
+
 (test '("a/b/c" #f #f) (receive (decompose-pathname "a/b/c/")))
-(test '("a\\b\\c" #f #f) (receive (decompose-pathname "a\\b\\c\\")))
+
+(if ##sys#windows-platform
+    (test '("a\\b\\c" #f #f) (receive (decompose-pathname "a\\b\\c\\")))
+    (test '(#f "a\\b\\c\\" #f) (receive (decompose-pathname "a\\b\\c\\"))))
+
 (test '("a/b/c" #f #f) (receive (decompose-pathname "a/b/c///")))
-(test '("a\\b\\c" #f #f) (receive (decompose-pathname "a\\b\\c\\\\\\")))
+
+(if ##sys#windows-platform
+    (test '("a\\b\\c" #f #f) (receive (decompose-pathname "a\\b\\c\\\\\\")))
+    (test '(#f "a\\b\\c\\\\\\" #f) (receive (decompose-pathname "a\\b\\c\\\\\\"))))
+
 (test '(#f "a" "b") (receive (decompose-pathname "a.b")))
 (test '("a.b" #f #f) (receive (decompose-pathname "a.b/")))
-(test '("a.b" #f #f) (receive (decompose-pathname "a.b\\")))
+
+(if ##sys#windows-platform
+    (test '("a.b" #f #f) (receive (decompose-pathname "a.b\\")))
+    (test '(#f "a" "b\\") (receive (decompose-pathname "a.b\\"))))
+
 (test '(#f "a.b" "c") (receive (decompose-pathname "a.b.c")))
 (test '(#f "a." "b") (receive (decompose-pathname "a..b")))
 (test '(#f "a.." "b") (receive (decompose-pathname "a...b")))
 (test '("a." ".b" #f) (receive (decompose-pathname "a./.b")))
-(test '("a." ".b" #f) (receive (decompose-pathname "a.\\.b")))
+
+(if ##sys#windows-platform
+    (test '("a." ".b" #f) (receive (decompose-pathname "a.\\.b")))
+    (test '(#f "a.\\" "b") (receive (decompose-pathname "a.\\.b"))))
 
 (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"))
+
+(if ##sys#windows-platform
+    (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 'error (handle-exceptions _ 'error (make-pathname '(#f) "foo")))
Trap