[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