chicken-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-hackers] [PATCH] Move pathname procedures to new chicken.pathna


From: Evan Hanson
Subject: [Chicken-hackers] [PATCH] Move pathname procedures to new chicken.pathname module
Date: Fri, 22 Apr 2016 12:04:31 +1200

---
 README                            |   1 +
 batch-driver.scm                  |   4 +-
 chicken-bug.scm                   |   2 +-
 chicken-install.scm               |   2 +
 chicken-status.scm                |   2 +-
 chicken-uninstall.scm             |   2 +-
 csc.scm                           |   2 +-
 defaults.make                     |   4 +-
 distribution/manifest             |   2 +
 eval.scm                          |   4 +-
 files.scm                         | 296 ++--------------------------------
 pathname.scm                      | 326 ++++++++++++++++++++++++++++++++++++++
 posixunix.scm                     |   4 +-
 posixwin.scm                      |   4 +-
 rules.make                        |  36 +++--
 scrutinizer.scm                   |   4 +-
 setup-api.scm                     |   1 +
 setup-download.scm                |   1 +
 support.scm                       |   3 +-
 tests/executable-tests.scm        |   4 +-
 tests/path-tests.scm              |   2 +-
 tests/posix-tests.scm             |   5 +-
 tests/private-repository-test.scm |   3 +-
 tests/runtests.sh                 |   3 +-
 types.db                          |  36 +++--
 utils.scm                         |   3 +-
 26 files changed, 417 insertions(+), 339 deletions(-)
 create mode 100644 pathname.scm

diff --git a/README b/README
index fb49fec..52c56ef 100644
--- a/README
+++ b/README
@@ -304,6 +304,7 @@
        |   |       |-- chicken.internal.import.so
        |   |       |-- chicken.io.import.so
        |   |       |-- chicken.irregex.import.so
+       |   |       |-- chicken.pathname.import.so
        |   |       |-- chicken.ports.import.so
        |   |       |-- chicken.posix.import.so
        |   |       |-- chicken.pretty-print.import.so
diff --git a/batch-driver.scm b/batch-driver.scm
index 740238c..3848f3b 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -29,7 +29,7 @@
 ;; Same goes for "backend" and "platform".
 (declare
   (unit batch-driver)
-  (uses extras data-structures files
+  (uses extras data-structures pathname
        support compiler-syntax compiler optimizer
        ;; TODO: Backend should be configurable
        scrutinizer lfa2 c-platform c-backend user-pass))
@@ -39,9 +39,9 @@
 
 (import chicken scheme
        chicken.data-structures
-       chicken.files
        chicken.format
        chicken.gc
+       chicken.pathname
        chicken.pretty-print
        chicken.time
        chicken.compiler.support
diff --git a/chicken-bug.scm b/chicken-bug.scm
index 08b74ab..7d12338 100644
--- a/chicken-bug.scm
+++ b/chicken-bug.scm
@@ -26,11 +26,11 @@
 (declare (block))
 
 (import chicken.data-structures
-       chicken.files
        chicken.foreign
        chicken.format
        chicken.io
        chicken.keyword
+       chicken.pathname
        chicken.ports
        chicken.posix
        chicken.time)
diff --git a/chicken-install.scm b/chicken-install.scm
index 1a31c60..a9e25ba 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -34,6 +34,7 @@
          chicken.format
          chicken.io
          chicken.irregex
+         chicken.pathname
          chicken.ports
          chicken.posix
          chicken.pretty-print
@@ -60,6 +61,7 @@
       "chicken.keyword.import.so"
       "chicken.locative.import.so"
       "chicken.lolevel.import.so"
+      "chicken.pathname.import.so"
       "chicken.ports.import.so"
       "chicken.posix.import.so"
       "chicken.pretty-print.import.so"
diff --git a/chicken-status.scm b/chicken-status.scm
index 98c9556..3006fae 100644
--- a/chicken-status.scm
+++ b/chicken-status.scm
@@ -28,10 +28,10 @@
   (import scheme chicken)
   (import setup-api)
   (import chicken.data-structures
-         chicken.files
          chicken.foreign
          chicken.format
          chicken.irregex
+         chicken.pathname
          chicken.ports
          chicken.posix
          chicken.pretty-print)
diff --git a/chicken-uninstall.scm b/chicken-uninstall.scm
index 26eaaa0..1905130 100644
--- a/chicken-uninstall.scm
+++ b/chicken-uninstall.scm
@@ -28,10 +28,10 @@
   (import scheme chicken)
   (import setup-api)
   (import chicken.data-structures
-         chicken.files
          chicken.foreign
          chicken.format
          chicken.irregex
+         chicken.pathname
          chicken.ports
          chicken.posix)
 
diff --git a/csc.scm b/csc.scm
index 51f4f1c..d12dba2 100644
--- a/csc.scm
+++ b/csc.scm
@@ -28,9 +28,9 @@
 
 (import chicken.posix
        chicken.data-structures
-       chicken.files
        chicken.foreign
        chicken.format
+       chicken.pathname
        chicken.utils)
 
 (include "mini-srfi-1.scm")
diff --git a/defaults.make b/defaults.make
index 15d5440..cf8044d 100644
--- a/defaults.make
+++ b/defaults.make
@@ -268,8 +268,8 @@ DYNAMIC_CHICKEN_IMPORT_LIBRARIES = bitwise fixnum flonum 
format gc io \
        keyword locative posix pretty-print random time
 DYNAMIC_CHICKEN_COMPILER_IMPORT_LIBRARIES = user-pass
 DYNAMIC_CHICKEN_UNIT_IMPORT_LIBRARIES = continuation data-structures \
-       eval expand files internal irregex lolevel ports read-syntax \
-       repl tcp utils
+       eval expand files internal irregex lolevel pathname ports \
+       read-syntax repl tcp utils
 
 # targets
 
diff --git a/distribution/manifest b/distribution/manifest
index 1ba6f9d..7daf117 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -287,6 +287,8 @@ chicken.locative.import.scm
 chicken.locative.import.c
 chicken.lolevel.import.scm
 chicken.lolevel.import.c
+chicken.pathname.import.scm
+chicken.pathname.import.c
 chicken.ports.import.scm
 chicken.ports.import.c
 chicken.posix.import.scm
diff --git a/eval.scm b/eval.scm
index e796e19..b426d11 100644
--- a/eval.scm
+++ b/eval.scm
@@ -88,8 +88,8 @@
 
 (define-constant core-units
   '(chicken-syntax chicken-ffi-syntax continuation data-structures eval
-    expand extras files internal irregex library lolevel ports posix
-    srfi-4 tcp repl read-syntax utils))
+    expand extras files internal irregex library lolevel pathname ports
+    posix srfi-4 tcp repl read-syntax utils))
 
 (define-constant cygwin-default-dynamic-load-libraries '("cygchicken-0"))
 (define-constant macosx-load-library-extension ".dylib")
diff --git a/files.scm b/files.scm
index 4cb2c77..0075398 100644
--- a/files.scm
+++ b/files.scm
@@ -1,4 +1,4 @@
-;;;; files.scm - File and pathname operations
+;;;; files.scm - File operations
 ;
 ; Copyright (c) 2008-2015, The CHICKEN Team
 ; Copyright (c) 2000-2007, Felix L. Winkelmann
@@ -36,7 +36,7 @@
 
 (declare
   (unit files)
-  (uses data-structures extras irregex)
+  (uses extras pathname)
   (fixnum)
   (disable-interrupts) 
   (foreign-declare #<<EOF
@@ -52,19 +52,14 @@ EOF
 ))
 
 (module chicken.files
-  (delete-file* file-copy file-move make-pathname directory-null?
-   make-absolute-pathname create-temporary-directory
-   create-temporary-file decompose-directory decompose-pathname
-   absolute-pathname? pathname-directory pathname-extension
-   pathname-file pathname-replace-directory pathname-replace-extension
-   pathname-replace-file pathname-strip-directory
-   pathname-strip-extension normalize-pathname)
+  (delete-file* file-copy file-move
+   create-temporary-directory
+   create-temporary-file)
 
 (import scheme chicken)
-(import chicken.data-structures
-       chicken.foreign
+(import chicken.foreign
        chicken.io
-       chicken.irregex)
+       chicken.pathname)
 
 (include "common-declarations.scm")
 
@@ -143,175 +138,8 @@ EOF
            (write-string s d o)
            (loop (read-string! blocksize s i) (fx+ d l)))))))
 
-;;; Pathname operations:
 
-;; Platform specific absolute pathname operations:
-;; absolute-pathname-root => #f or (<match> [<origin>] <root>)
-;;
-;; Not for general consumption
-
-(define absolute-pathname-root)
-(define root-origin)
-(define root-directory)
-
-(if ##sys#windows-platform
-    (let ((rx (irregex "([A-Za-z]:)?([\\/\\\\]).*")))
-      (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 "(/).*")))
-      (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)))) ) )
-
-(define (absolute-pathname? pn)
-  (##sys#check-string pn 'absolute-pathname?)
-  (irregex-match-data? (absolute-pathname-root pn)) )
-
-(define-inline (*char-pds? ch) 
-  (if ##sys#windows-platform 
-      (memq ch '(#\\ #\/))
-      (eq? #\/ ch)))
-
-(define (chop-pds str)
-  (and str
-       (let lp ((len (##sys#size str)))
-        (cond ((and (fx>= len 1)
-                    (*char-pds? (##core#inline "C_subchar" str (fx- len 1))))
-               (lp (fx- len 1)))
-              ((fx< len (##sys#size str))
-               (##sys#substring str 0 len))
-              (else str)))))
-
-(define make-pathname)
-(define make-absolute-pathname)
-
-(let ((pds (if ##sys#windows-platform "\\" "/")))
-
-  (define (conc-dirs dirs)
-    (##sys#check-list dirs 'make-pathname)
-    (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
-                (loop (cdr strs))) ) ) ) ) )
-
-  (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)
-    (let ((ext (or ext ""))
-         (file (or file "")))
-      (##sys#check-string dir loc)
-      (##sys#check-string file loc)
-      (##sys#check-string ext loc)
-      (string-append
-       dir
-       (if (and (fx>= (##sys#size dir) 1)
-               (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) #\.)) )
-          "."
-          "")
-       ext) ) )
-
-  (set! make-pathname
-    (lambda (dirs file #!optional ext)
-      (_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)))
-        (if (absolute-pathname? dir)
-            dir
-            (##sys#string-append pds dir)) )
-       file ext) ) ) )
-
-(define decompose-pathname
-  (let* ((patt1 (if ##sys#windows-platform
-                    "^(.*[\\/\\\\])?([^\\/\\\\]+)(\\.([^\\/\\\\.]+))$"
-                    "^(.*/)?([^/]+)(\\.([^/.]+))$"))
-        (patt2 (if ##sys#windows-platform
-                    "^(.*[\\/\\\\])?((\\.)?[^\\/\\\\]+)$"
-                    "^(.*/)?((\\.)?[^/]+)$"))
-        [rx1 (irregex patt1)]
-        [rx2 (irregex patt2)]
-        [strip-pds
-         (lambda (dir)
-           (and dir
-                (let ((chopped (chop-pds dir)))
-                  (if (fx> (##sys#size chopped) 0)
-                      chopped
-                      (##sys#substring dir 0 1) ) ) ) )] )
-    (lambda (pn)
-      (##sys#check-string pn 'decompose-pathname)
-      (if (fx= 0 (##sys#size pn))
-         (values #f #f #f)
-         (let ([ms (irregex-search rx1 pn)])
-           (if ms
-               (values 
-                (strip-pds (irregex-match-substring ms 1))
-                (irregex-match-substring ms 2)
-                (irregex-match-substring ms 4))
-               (let ([ms (irregex-search rx2 pn)])
-                 (if ms
-                     (values
-                      (strip-pds (irregex-match-substring ms 1))
-                      (irregex-match-substring ms 2) 
-                      #f)
-                     (values (strip-pds pn) #f #f) ) ) ) ) ) ) ) )
-
-(define pathname-directory
-  (lambda (pn)
-    (let-values ([(dir file ext) (decompose-pathname pn)])
-      dir) ) )
-
-(define pathname-file
-  (lambda (pn)
-    (let-values ([(dir file ext) (decompose-pathname pn)])
-      file) ) )
-
-(define pathname-extension
-  (lambda (pn)
-    (let-values ([(dir file ext) (decompose-pathname pn)])
-      ext) ) )
-
-(define pathname-strip-directory
-  (lambda (pn)
-    (let-values ([(dir file ext) (decompose-pathname pn)])
-      (make-pathname #f file ext) ) ) )
-
-(define pathname-strip-extension
-  (lambda (pn)
-    (let-values ([(dir file ext) (decompose-pathname pn)])
-      (make-pathname dir file) ) ) )
-
-(define pathname-replace-directory
-  (lambda (pn dir)
-    (let-values ([(_ file ext) (decompose-pathname pn)])
-      (make-pathname dir file ext) ) ) )
-
-(define pathname-replace-file
-  (lambda (pn file)
-    (let-values ([(dir _ ext) (decompose-pathname pn)])
-      (make-pathname dir file ext) ) ) )
-
-(define pathname-replace-extension
-  (lambda (pn ext)
-    (let-values ([(dir file _) (decompose-pathname pn)])
-      (make-pathname dir file ext) ) ) )
+;;; Temporary file creation:
 
 (define create-temporary-file)
 (define create-temporary-directory)
@@ -363,110 +191,4 @@ EOF
                    (##sys#signal-hook 
                     #:file-error 'create-temporary-directory
                     (##sys#string-append "cannot create temporary directory - 
" strerror)
-                    pn) ))))))))
-
-
-;;; normalize pathname for a particular platform
-
-(define normalize-pathname
-  (let ((bldplt (if (eq? (build-platform) 'mingw32) 'windows 'unix)) )
-    (define (addpart part parts)
-      (cond ((string=? "." part) parts)
-            ((string=? ".." part) 
-            (if (or (null? parts)
-                    (string=? ".." (car parts)))
-                (cons part parts)
-                (cdr parts)))
-            (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)
-             (drive #f))
-         (let loop ((i 0) (prev 0) (parts '()))
-           (cond ((fx>= i len)
-                  (when (fx> i prev)
-                    (set! parts (addpart (##sys#substring path prev i) parts)))
-                  (if (null? parts)
-                      (let ((r (if (eq? type 'abs) (string sep) ".")))
-                        (if drive (##sys#string-append drive r) r))
-                      (let ((out (open-output-string))
-                            (parts (##sys#fast-reverse parts)))
-                        (display (car parts) out)
-                        (for-each
-                         (lambda (p)
-                           (##sys#write-char-0 sep out)
-                           (display p out) )
-                         (cdr parts))
-                        (when (fx= i prev) (##sys#write-char-0 sep out))
-                        (let ((r (get-output-string out)))
-                          (when (eq? type 'abs)
-                            (set! r (##sys#string-append (string sep) r)))
-                          (when drive
-                            (set! r (##sys#string-append drive r)))
-                          r))))
-                 ((pds? (string-ref path i))
-                  (when (not type)
-                    (set! type (if (fx= i prev) 'abs 'rel)))
-                  (if (fx= i prev)
-                      (loop (fx+ i 1) (fx+ i 1) parts)
-                      (loop (fx+ i 1)
-                            (fx+ i 1)
-                            (addpart (##sys#substring path prev i) parts))))
-                 ((and (null? parts) 
-                       (char=? (string-ref path i) #\:)
-                       (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)) ) ) ) ) ) ) )
-
-
-;; directory pathname => list of strings
-;; does arg check
-
-(define split-directory
-  (lambda (loc dir keep?)
-    (##sys#check-string dir loc)
-    (string-split dir (if ##sys#windows-platform "/\\" "/") keep?) ) )
-
-;; Directory string or list only contains path-separators
-;; and/or current-directory (".") names.
-
-(define (directory-null? dir)
-  (let loop ((ls (if (list? dir) dir (split-directory 'directory-null? dir 
#t))))
-    (or (null? ls)
-        (and (member (car ls) '("" "."))
-             (loop (cdr ls)) ) ) ) )
-
-;; Directory string => {<origin> <root> <directory-list>}
-;; where any maybe #f when missing
-
-(define (decompose-directory dir)
-  (define (strip-origin-prefix org decomp)
-    #;(assert (or (not org) decomp)) ;cannot have an "origin" but no "decomp"
-    (if (not org)
-        decomp
-        (let ((1st (car decomp)))
-          (let ((olen (##sys#size org)))
-            (if (not (##core#inline "C_substring_compare" org 1st 0 0 olen))
-                ; then origin is not a prefix (really shouldn't happen)
-                decomp
-                ; else is a prefix
-                (let ((rst (cdr decomp))
-                      (elen (##sys#size 1st)) )
-                  (if (fx= olen (##sys#size elen))
-                      ; then origin is a list prefix
-                      rst
-                      ; else origin is a string prefix
-                      (cons (##sys#substring 1st olen elen) rst) ) ) ) ) ) ) )
-  (let* ((ls (split-directory 'decompose-directory dir #f))
-         (rt (absolute-pathname-root dir))
-         (org (root-origin rt)) )
-    (values org (root-directory rt) (strip-origin-prefix org (and (not (null? 
ls)) ls))) ) )
-
-)
+                    pn))))))))))
diff --git a/pathname.scm b/pathname.scm
new file mode 100644
index 0000000..acbf1c2
--- /dev/null
+++ b/pathname.scm
@@ -0,0 +1,326 @@
+;;;; pathname.scm - Pathname operations
+;
+; Copyright (c) 2008-2016, The CHICKEN Team
+; Copyright (c) 2000-2007, Felix L. Winkelmann
+; All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+;
+;   Redistributions of source code must retain the above copyright
+;   notice, this list of conditions and the following disclaimer.
+;
+;   Redistributions in binary form must reproduce the above copyright
+;   notice, this list of conditions and the following disclaimer in
+;   the documentation and/or other materials provided with the
+;   distribution.
+;
+;   Neither the name of the author nor the names of its contributors
+;     may be used to endorse or promote products derived from this
+;     software without specific prior written permission.
+;
+; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+; FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+; COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+; OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(declare
+  (unit pathname)
+  (uses data-structures irregex)
+  (fixnum)
+  (disable-interrupts))
+
+(module chicken.pathname
+  (absolute-pathname? decompose-directory decompose-pathname
+   directory-null? make-absolute-pathname make-pathname
+   normalize-pathname pathname-directory pathname-extension
+   pathname-file pathname-replace-directory pathname-replace-extension
+   pathname-replace-file pathname-strip-directory
+   pathname-strip-extension)
+
+(import chicken scheme
+        chicken.data-structures
+        chicken.irregex)
+
+(include "common-declarations.scm")
+
+;;; Pathname operations:
+
+;; Platform specific absolute pathname operations:
+;; absolute-pathname-root => #f or (<match> [<origin>] <root>)
+;;
+;; Not for general consumption
+
+(define absolute-pathname-root)
+(define root-origin)
+(define root-directory)
+
+(if ##sys#windows-platform
+    (let ((rx (irregex "([A-Za-z]:)?([\\/\\\\]).*")))
+      (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 "(/).*")))
+      (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))))))
+
+(define (absolute-pathname? pn)
+  (##sys#check-string pn 'absolute-pathname?)
+  (irregex-match-data? (absolute-pathname-root pn)))
+
+(define-inline (*char-pds? ch)
+  (if ##sys#windows-platform
+      (memq ch '(#\\ #\/))
+      (eq? #\/ ch)))
+
+(define (chop-pds str)
+  (and str
+       (let lp ((len (##sys#size str)))
+        (cond ((and (fx>= len 1)
+                    (*char-pds? (##core#inline "C_subchar" str (fx- len 1))))
+               (lp (fx- len 1)))
+              ((fx< len (##sys#size str))
+               (##sys#substring str 0 len))
+              (else str)))))
+
+(define make-pathname)
+(define make-absolute-pathname)
+
+(let ((pds (if ##sys#windows-platform "\\" "/")))
+
+  (define (conc-dirs dirs)
+    (##sys#check-list dirs 'make-pathname)
+    (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
+                (loop (cdr strs))))))))
+
+  (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)
+    (let ((ext (or ext ""))
+         (file (or file "")))
+      (##sys#check-string dir loc)
+      (##sys#check-string file loc)
+      (##sys#check-string ext loc)
+      (string-append
+       dir
+       (if (and (fx>= (##sys#size dir) 1)
+               (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) #\.)))
+          "."
+          "")
+       ext)))
+
+  (set! make-pathname
+    (lambda (dirs file #!optional ext)
+      (_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)))
+        (if (absolute-pathname? dir)
+            dir
+            (##sys#string-append pds dir)))
+       file ext))))
+
+(define decompose-pathname
+  (let* ((patt1 (if ##sys#windows-platform
+                    "^(.*[\\/\\\\])?([^\\/\\\\]+)(\\.([^\\/\\\\.]+))$"
+                    "^(.*/)?([^/]+)(\\.([^/.]+))$"))
+        (patt2 (if ##sys#windows-platform
+                    "^(.*[\\/\\\\])?((\\.)?[^\\/\\\\]+)$"
+                    "^(.*/)?((\\.)?[^/]+)$"))
+        (rx1 (irregex patt1))
+        (rx2 (irregex patt2))
+         (strip-pds
+          (lambda (dir)
+            (and dir
+                 (let ((chopped (chop-pds dir)))
+                   (if (fx> (##sys#size chopped) 0)
+                       chopped
+                       (##sys#substring dir 0 1)))))))
+    (lambda (pn)
+      (##sys#check-string pn 'decompose-pathname)
+      (if (fx= 0 (##sys#size pn))
+         (values #f #f #f)
+         (let ((ms (irregex-search rx1 pn)))
+           (if ms
+               (values
+                (strip-pds (irregex-match-substring ms 1))
+                (irregex-match-substring ms 2)
+                (irregex-match-substring ms 4))
+               (let ((ms (irregex-search rx2 pn)))
+                 (if ms
+                     (values
+                      (strip-pds (irregex-match-substring ms 1))
+                      (irregex-match-substring ms 2)
+                      #f)
+                     (values (strip-pds pn) #f #f)))))))))
+
+(define pathname-directory
+  (lambda (pn)
+    (let-values (((dir file ext) (decompose-pathname pn)))
+      dir)))
+
+(define pathname-file
+  (lambda (pn)
+    (let-values (((dir file ext) (decompose-pathname pn)))
+      file)))
+
+(define pathname-extension
+  (lambda (pn)
+    (let-values (((dir file ext) (decompose-pathname pn)))
+      ext)))
+
+(define pathname-strip-directory
+  (lambda (pn)
+    (let-values (((dir file ext) (decompose-pathname pn)))
+      (make-pathname #f file ext))))
+
+(define pathname-strip-extension
+  (lambda (pn)
+    (let-values (((dir file ext) (decompose-pathname pn)))
+      (make-pathname dir file))))
+
+(define pathname-replace-directory
+  (lambda (pn dir)
+    (let-values (((_ file ext) (decompose-pathname pn)))
+      (make-pathname dir file ext))))
+
+(define pathname-replace-file
+  (lambda (pn file)
+    (let-values (((dir _ ext) (decompose-pathname pn)))
+      (make-pathname dir file ext))))
+
+(define pathname-replace-extension
+  (lambda (pn ext)
+    (let-values (((dir file _) (decompose-pathname pn)))
+      (make-pathname dir file ext))))
+
+;;; normalize pathname for a particular platform
+
+(define normalize-pathname
+  (let ((bldplt (if (eq? (build-platform) 'mingw32) 'windows 'unix)))
+    (define (addpart part parts)
+      (cond ((string=? "." part) parts)
+            ((string=? ".." part)
+            (if (or (null? parts)
+                    (string=? ".." (car parts)))
+                (cons part parts)
+                (cdr parts)))
+            (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)
+             (drive #f))
+         (let loop ((i 0) (prev 0) (parts '()))
+           (cond ((fx>= i len)
+                  (when (fx> i prev)
+                    (set! parts (addpart (##sys#substring path prev i) parts)))
+                  (if (null? parts)
+                      (let ((r (if (eq? type 'abs) (string sep) ".")))
+                        (if drive (##sys#string-append drive r) r))
+                      (let ((out (open-output-string))
+                            (parts (##sys#fast-reverse parts)))
+                        (display (car parts) out)
+                        (for-each
+                         (lambda (p)
+                           (##sys#write-char-0 sep out)
+                           (display p out))
+                         (cdr parts))
+                        (when (fx= i prev) (##sys#write-char-0 sep out))
+                        (let ((r (get-output-string out)))
+                          (when (eq? type 'abs)
+                            (set! r (##sys#string-append (string sep) r)))
+                          (when drive
+                            (set! r (##sys#string-append drive r)))
+                          r))))
+                 ((pds? (string-ref path i))
+                  (when (not type)
+                    (set! type (if (fx= i prev) 'abs 'rel)))
+                  (if (fx= i prev)
+                      (loop (fx+ i 1) (fx+ i 1) parts)
+                      (loop (fx+ i 1)
+                            (fx+ i 1)
+                            (addpart (##sys#substring path prev i) parts))))
+                 ((and (null? parts)
+                       (char=? (string-ref path i) #\:)
+                       (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)))))))))
+
+;; directory pathname => list of strings
+;; does arg check
+
+(define split-directory
+  (lambda (loc dir keep?)
+    (##sys#check-string dir loc)
+    (string-split dir (if ##sys#windows-platform "/\\" "/") keep?)))
+
+;; Directory string or list only contains path-separators
+;; and/or current-directory (".") names.
+
+(define (directory-null? dir)
+  (let loop ((ls (if (list? dir) dir (split-directory 'directory-null? dir 
#t))))
+    (or (null? ls)
+        (and (member (car ls) '("" "."))
+             (loop (cdr ls))))))
+
+;; Directory string => {<origin> <root> <directory-list>}
+;; where any maybe #f when missing
+
+(define (decompose-directory dir)
+  (define (strip-origin-prefix org decomp)
+    #;(assert (or (not org) decomp)) ;cannot have an "origin" but no "decomp"
+    (if (not org)
+        decomp
+        (let ((1st (car decomp)))
+          (let ((olen (##sys#size org)))
+            (if (not (##core#inline "C_substring_compare" org 1st 0 0 olen))
+                ; then origin is not a prefix (really shouldn't happen)
+                decomp
+                ; else is a prefix
+                (let ((rst (cdr decomp))
+                      (elen (##sys#size 1st)))
+                  (if (fx= olen (##sys#size elen))
+                      ; then origin is a list prefix
+                      rst
+                      ; else origin is a string prefix
+                      (cons (##sys#substring 1st olen elen) rst))))))))
+  (let* ((ls (split-directory 'decompose-directory dir #f))
+         (rt (absolute-pathname-root dir))
+         (org (root-origin rt)))
+    (values org (root-directory rt) (strip-origin-prefix org (and (not (null? 
ls)) ls))))))
diff --git a/posixunix.scm b/posixunix.scm
index ca148f2..73e52a2 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -27,7 +27,7 @@
 
 (declare
   (unit posix)
-  (uses scheduler irregex extras files ports)
+  (uses scheduler irregex pathname ports)
   (disable-interrupts)
   (not inline ##sys#interrupt-hook ##sys#user-interrupt-hook))
 
@@ -89,9 +89,9 @@
 
 (import scheme chicken)
 (import chicken.bitwise
-       chicken.files
        chicken.foreign
        chicken.irregex
+       chicken.pathname
        chicken.ports
        chicken.time)
 
diff --git a/posixwin.scm b/posixwin.scm
index 061e274..3d60568 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -63,7 +63,7 @@
 
 (declare
   (unit posix)
-  (uses data-structures scheduler irregex extras files ports)
+  (uses scheduler data-structures irregex pathname ports)
   (disable-interrupts)
   (hide $quote-args-list $exec-setup $exec-teardown)
   (not inline ##sys#interrupt-hook ##sys#user-interrupt-hook)
@@ -715,9 +715,9 @@ EOF
 (import scheme chicken)
 (import chicken.bitwise
        chicken.data-structures
-       chicken.files
        chicken.foreign
        chicken.irregex
+       chicken.pathname
        chicken.ports
        chicken.random
        chicken.time)
diff --git a/rules.make b/rules.make
index 12b84da..a32d5c6 100644
--- a/rules.make
+++ b/rules.make
@@ -36,9 +36,10 @@ VPATH=$(SRCDIR)
 SETUP_API_OBJECTS_1 = setup-api setup-download
 
 LIBCHICKEN_SCHEME_OBJECTS_1 = \
-       library eval read-syntax repl data-structures ports files extras 
lolevel utils \
-       tcp srfi-4 continuation $(POSIXFILE) internal irregex scheduler 
debugger-client \
-       profiler stub expand modules chicken-syntax chicken-ffi-syntax 
build-version
+       library eval read-syntax repl data-structures pathname ports files \
+       extras lolevel utils tcp srfi-4 continuation $(POSIXFILE) internal \
+       irregex scheduler debugger-client profiler stub expand modules \
+       chicken-syntax chicken-ffi-syntax build-version
 LIBCHICKEN_OBJECTS_1 = $(LIBCHICKEN_SCHEME_OBJECTS_1) runtime
 LIBCHICKEN_SHARED_OBJECTS = $(LIBCHICKEN_OBJECTS_1:=$(O))
 LIBCHICKEN_STATIC_OBJECTS = $(LIBCHICKEN_OBJECTS_1:=-static$(O))
@@ -547,9 +548,9 @@ batch-driver.c: batch-driver.scm mini-srfi-1.scm \
                chicken.compiler.support.import.scm \
                chicken.compiler.user-pass.import.scm \
                chicken.data-structures.import.scm \
-               chicken.files.import.scm \
                chicken.format.import.scm \
                chicken.gc.import.scm \
+               chicken.pathname.import.scm \
                chicken.pretty-print.import.scm \
                chicken.time.import.scm
 c-platform.c: c-platform.scm mini-srfi-1.scm \
@@ -587,9 +588,9 @@ scrutinizer.c: scrutinizer.scm mini-srfi-1.scm \
                chicken.compiler.support.import.scm \
                chicken.data-structures.import.scm \
                chicken.expand.import.scm \
-               chicken.files.import.scm \
                chicken.format.import.scm \
                chicken.io.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.pretty-print.import.scm
 lfa2.c: lfa2.scm mini-srfi-1.scm \
@@ -612,6 +613,7 @@ support.c: support.scm mini-srfi-1.scm \
                chicken.format.import.scm \
                chicken.keyword.import.scm \
                chicken.io.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.pretty-print.import.scm \
                chicken.random.import.scm \
@@ -623,8 +625,8 @@ modules.c: modules.scm \
 csc.c: csc.scm \
                chicken.data-structures.import.scm \
                chicken.eval.import.scm \
-               chicken.files.import.scm \
                chicken.format.import.scm \
+               chicken.pathname.import.scm \
                chicken.posix.import.scm \
                chicken.utils.import.scm
 csi.c: csi.scm \
@@ -638,11 +640,11 @@ csi.c: csi.scm \
                chicken.pretty-print.import.scm \
                chicken.repl.import.scm
 chicken-bug.c: chicken-bug.scm \
-               chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.format.import.scm \
                chicken.io.import.scm \
                chicken.keyword.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.posix.import.scm \
                chicken.time.import.scm
@@ -651,10 +653,10 @@ chicken-profile.c: chicken-profile.scm \
                chicken.posix.import.scm
 chicken-status.c: chicken-status.scm \
                chicken.data-structures.import.scm \
-               chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.format.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.posix.import.scm \
                chicken.pretty-print.import.scm \
@@ -666,6 +668,7 @@ chicken-install.c: chicken-install.scm \
                chicken.format.import.scm \
                chicken.io.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.posix.import.scm \
                chicken.pretty-print.import.scm \
@@ -673,10 +676,10 @@ chicken-install.c: chicken-install.scm \
                setup-download.import.scm
 chicken-uninstall.c: chicken-uninstall.scm \
                chicken.data-structures.import.scm \
-               chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.format.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.posix.import.scm \
                setup-api.import.scm
@@ -687,6 +690,7 @@ setup-api.c: setup-api.scm \
                chicken.format.import.scm \
                chicken.io.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.posix.import.scm \
                chicken.pretty-print.import.scm \
                chicken.utils.import.scm
@@ -697,6 +701,7 @@ setup-download.c: setup-download.scm \
                chicken.format.import.scm \
                chicken.io.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.posix.import.scm \
                chicken.tcp.import.scm \
                chicken.utils.import.scm \
@@ -708,16 +713,16 @@ srfi-4.c: srfi-4.scm \
                chicken.gc.import.scm
 posixunix.c: posixunix.scm \
                chicken.bitwise.import.scm \
-               chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.time.import.scm
 posixwin.c: posixwin.scm \
                chicken.bitwise.import.scm \
-               chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.irregex.import.scm \
+               chicken.pathname.import.scm \
                chicken.ports.import.scm \
                chicken.time.import.scm
 data-structures.c: data-structures.scm \
@@ -739,9 +744,13 @@ files.c: files.scm \
                chicken.data-structures.import.scm \
                chicken.io.import.scm \
                chicken.foreign.import.scm \
-               chicken.irregex.import.scm
+               chicken.irregex.import.scm \
+               chicken.pathname.import.scm
 lolevel.c: lolevel.scm \
                chicken.foreign.import.scm
+pathname.c: pathname.scm \
+               chicken.data-structures.import.scm \
+               chicken.irregex.import.scm
 ports.c: ports.scm \
                chicken.io.import.scm
 tcp.c: tcp.scm \
@@ -753,6 +762,7 @@ utils.c: utils.scm \
                chicken.files.import.scm \
                chicken.foreign.import.scm \
                chicken.format.import.scm \
+               chicken.pathname.import.scm \
                chicken.posix.import.scm
 
 define profile-flags
@@ -801,6 +811,8 @@ continuation.c: $(SRCDIR)continuation.scm 
$(SRCDIR)common-declarations.scm
        $(bootstrap-lib) -emit-import-library chicken.continuation
 data-structures.c: $(SRCDIR)data-structures.scm 
$(SRCDIR)common-declarations.scm
        $(bootstrap-lib) -emit-import-library chicken.data-structures
+pathname.c: $(SRCDIR)pathname.scm $(SRCDIR)common-declarations.scm
+       $(bootstrap-lib) -emit-import-library chicken.pathname
 ports.c: $(SRCDIR)ports.scm $(SRCDIR)common-declarations.scm
        $(bootstrap-lib) -emit-import-library chicken.ports
 files.c: $(SRCDIR)files.scm $(SRCDIR)common-declarations.scm
diff --git a/scrutinizer.scm b/scrutinizer.scm
index caeec68..433ed2e 100644
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -26,7 +26,7 @@
 
 (declare
   (unit scrutinizer)
-  (uses data-structures expand extras files ports support))
+  (uses data-structures expand extras pathname ports support))
 
 (module chicken.compiler.scrutinizer
     (scrutinize load-type-database emit-type-file
@@ -36,9 +36,9 @@
        chicken.compiler.support
        chicken.data-structures
        chicken.expand
-       chicken.files
        chicken.format
        chicken.io
+       chicken.pathname
        chicken.ports
        chicken.pretty-print)
 
diff --git a/setup-api.scm b/setup-api.scm
index 8e1260c..b97077b 100644
--- a/setup-api.scm
+++ b/setup-api.scm
@@ -70,6 +70,7 @@
          chicken.format
          chicken.io
          chicken.irregex
+         chicken.pathname
          chicken.posix
          chicken.pretty-print
          chicken.utils)
diff --git a/setup-download.scm b/setup-download.scm
index c751fea..64967e7 100644
--- a/setup-download.scm
+++ b/setup-download.scm
@@ -39,6 +39,7 @@
          chicken.format
          chicken.io
          chicken.irregex
+         chicken.pathname
          chicken.posix
          chicken.tcp
          chicken.utils)
diff --git a/support.scm b/support.scm
index 03e28c1..a7396c0 100644
--- a/support.scm
+++ b/support.scm
@@ -27,7 +27,7 @@
 
 (declare (unit support)
         (not inline ##sys#user-read-hook) ; XXX: Is this needed?
-        (uses data-structures extras files internal ports))
+        (uses data-structures extras files internal pathname ports))
 
 (module chicken.compiler.support
     (compiler-cleanup-hook bomb collected-debugging-output debugging
@@ -84,6 +84,7 @@
        chicken.format
        chicken.keyword
        chicken.io
+       chicken.pathname
        chicken.ports
        chicken.pretty-print
        chicken.random
diff --git a/tests/executable-tests.scm b/tests/executable-tests.scm
index ef391d5..6d03e7e 100644
--- a/tests/executable-tests.scm
+++ b/tests/executable-tests.scm
@@ -2,7 +2,9 @@
 
 (include "test.scm")
 
-(use files posix data-structures)
+(import (chicken pathname)
+        (chicken posix)
+        (chicken data-structures))
 
 (define program-path
   (cond-expand
diff --git a/tests/path-tests.scm b/tests/path-tests.scm
index 68ac902..8160b63 100644
--- a/tests/path-tests.scm
+++ b/tests/path-tests.scm
@@ -1,4 +1,4 @@
-(use files)
+(import (chicken pathname))
 
 (define-syntax test
   (syntax-rules ()
diff --git a/tests/posix-tests.scm b/tests/posix-tests.scm
index e7c456b..04052ad 100644
--- a/tests/posix-tests.scm
+++ b/tests/posix-tests.scm
@@ -1,4 +1,7 @@
-(use files posix lolevel)
+(import (chicken pathname)
+        (chicken files)
+        (chicken posix)
+        (chicken lolevel))
 
 (define-syntax assert-error
   (syntax-rules ()
diff --git a/tests/private-repository-test.scm 
b/tests/private-repository-test.scm
index 5db1a0f..7ee0031 100644
--- a/tests/private-repository-test.scm
+++ b/tests/private-repository-test.scm
@@ -1,7 +1,8 @@
 ;;;; private-repository-test.scm
 
 
-(use files posix)
+(import (chicken pathname)
+        (chicken posix))
 
 (define read-symbolic-link*
   (cond-expand
diff --git a/tests/runtests.sh b/tests/runtests.sh
index c5c33b3..99dcf87 100755
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -53,6 +53,7 @@ for x in \
     chicken.keyword.import.so \
     chicken.locative.import.so \
     chicken.lolevel.import.so \
+    chicken.pathname.import.so \
     chicken.ports.import.so \
     chicken.posix.import.so \
     chicken.pretty-print.import.so \
@@ -76,7 +77,7 @@ FAST_OPTIONS="-O5 -d0 -b -disable-interrupts"
 COMPILE_OPTIONS="-compiler ${TEST_DIR}/../chicken -v -I${TEST_DIR}/.. 
-L${TEST_DIR}/.. -rpath ${TEST_DIR}/.. -include-path ${TEST_DIR}/.."
 
 TEST_DIR_SEXPR=`../csi -n -include-path .. -e "(use posix) (write 
(current-directory))"`
-SETUP_PREFIX="-e (use files setup-api)"
+SETUP_PREFIX="-e (use (chicken pathname) setup-api)"
 SETUP_PREFIX="${SETUP_PREFIX} -e (register-program \"csc\" (make-pathname 
${TEST_DIR_SEXPR} \"../csc\"))"
 SETUP_PREFIX="${SETUP_PREFIX} -e (register-program \"chicken\" (make-pathname 
${TEST_DIR_SEXPR} \"../chicken\"))"
 SETUP_PREFIX="${SETUP_PREFIX} -e (register-program \"csi\" (make-pathname 
${TEST_DIR_SEXPR} \"../csi\"))"
diff --git a/types.db b/types.db
index 045b93f..2c5db2a 100644
--- a/types.db
+++ b/types.db
@@ -1573,27 +1573,29 @@
 
 ;; files
 
+(chicken.files#create-temporary-directory (#(procedure #:clean #:enforce) 
chicken.files#create-temporary-directory () string))
+(chicken.files#create-temporary-file (#(procedure #:clean #:enforce) 
chicken.files#create-temporary-file (#!optional string) string))
 (chicken.files#delete-file* (#(procedure #:clean #:enforce) 
chicken.files#delete-file* (string) *))
 (chicken.files#file-copy (#(procedure #:clean #:enforce) 
chicken.files#file-copy (string string #!optional * fixnum) fixnum))
 (chicken.files#file-move (#(procedure #:clean #:enforce) 
chicken.files#file-move (string string #!optional * fixnum) fixnum))
-(chicken.files#make-pathname (#(procedure #:clean #:enforce) 
chicken.files#make-pathname ((or string (list-of string) false) #!optional (or 
string false) (or string false)) string))
-(chicken.files#directory-null? (#(procedure #:clean #:enforce) 
chicken.files#directory-null? (string) boolean))
-(chicken.files#make-absolute-pathname (#(procedure #:clean #:enforce) 
chicken.files#make-absolute-pathname (* #!optional string string) string))
-(chicken.files#create-temporary-directory (#(procedure #:clean #:enforce) 
chicken.files#create-temporary-directory () string))
-(chicken.files#create-temporary-file (#(procedure #:clean #:enforce) 
chicken.files#create-temporary-file (#!optional string) string))
-(chicken.files#decompose-directory (#(procedure #:clean #:enforce) 
chicken.files#decompose-directory (string) * * *))
-(chicken.files#decompose-pathname (#(procedure #:clean #:enforce) 
chicken.files#decompose-pathname (string) * * *))
-(chicken.files#absolute-pathname? (#(procedure #:clean #:enforce) 
chicken.files#absolute-pathname? (string) boolean))
-(chicken.files#pathname-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-directory (string) *))
-(chicken.files#pathname-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-extension (string) *))
-(chicken.files#pathname-file (#(procedure #:clean #:enforce) 
chicken.files#pathname-file (string) *))
-(chicken.files#pathname-replace-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-directory (string string) string))
-(chicken.files#pathname-replace-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-extension (string string) string))
-(chicken.files#pathname-replace-file (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-file (string string) string))
-(chicken.files#pathname-strip-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-strip-directory (string) string))
-(chicken.files#pathname-strip-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-strip-extension (string) string))
-(chicken.files#normalize-pathname (#(procedure #:clean #:enforce) 
chicken.files#normalize-pathname (string #!optional symbol) string))
 
+;; pathname
+
+(chicken.pathname#absolute-pathname? (#(procedure #:clean #:enforce) 
chicken.files#absolute-pathname? (string) boolean))
+(chicken.pathname#decompose-directory (#(procedure #:clean #:enforce) 
chicken.files#decompose-directory (string) * * *))
+(chicken.pathname#decompose-pathname (#(procedure #:clean #:enforce) 
chicken.files#decompose-pathname (string) * * *))
+(chicken.pathname#directory-null? (#(procedure #:clean #:enforce) 
chicken.files#directory-null? (string) boolean))
+(chicken.pathname#make-absolute-pathname (#(procedure #:clean #:enforce) 
chicken.files#make-absolute-pathname (* #!optional string string) string))
+(chicken.pathname#make-pathname (#(procedure #:clean #:enforce) 
chicken.files#make-pathname ((or string (list-of string) false) #!optional (or 
string false) (or string false)) string))
+(chicken.pathname#normalize-pathname (#(procedure #:clean #:enforce) 
chicken.files#normalize-pathname (string #!optional symbol) string))
+(chicken.pathname#pathname-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-directory (string) *))
+(chicken.pathname#pathname-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-extension (string) *))
+(chicken.pathname#pathname-file (#(procedure #:clean #:enforce) 
chicken.files#pathname-file (string) *))
+(chicken.pathname#pathname-replace-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-directory (string string) string))
+(chicken.pathname#pathname-replace-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-extension (string string) string))
+(chicken.pathname#pathname-replace-file (#(procedure #:clean #:enforce) 
chicken.files#pathname-replace-file (string string) string))
+(chicken.pathname#pathname-strip-directory (#(procedure #:clean #:enforce) 
chicken.files#pathname-strip-directory (string) string))
+(chicken.pathname#pathname-strip-extension (#(procedure #:clean #:enforce) 
chicken.files#pathname-strip-extension (string) string))
 
 ;; irregex
 
diff --git a/utils.scm b/utils.scm
index fa47438..ca94425 100644
--- a/utils.scm
+++ b/utils.scm
@@ -27,7 +27,7 @@
 
 (declare
   (unit utils)
-  (uses data-structures posix files)
+  (uses data-structures posix files pathname)
   (fixnum)
   (disable-interrupts) )
 
@@ -42,6 +42,7 @@
        chicken.files
        chicken.foreign
        chicken.format
+       chicken.pathname
        chicken.posix)
 
 (include "common-declarations.scm")
-- 
2.7.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]