other
(in-package "OSLIB")
other
(include-book "std/util/define" :dir :system)
other
(include-book "std/strings/cat" :dir :system)
other
(local (include-book "std/testing/assert-bang" :dir :system))
other
(define catpath
((basedir stringp
"Directory whose name should be extended, which may
or may not end with a slash. Idioms like @('~'),
@('~jared'), and @('..') will be preserved. The
empty string means the current directory.") (filename stringp
"File or subdirectory name to append to @('basedir')"))
:returns (path "A new string like @('basedir/filename'). We only insert a
slash if @('basedir') does not end with a slash. We don't
normalize the path by collapsing @('..')."
stringp)
:parents (oslib)
:short "Basic concatenation operation for paths."
:long "<p>ACL2 includes a built-in function named @('extend-pathname') that
is similar to @('catpath'). In some ways ACL2's version is nicer than
@('catpath'). It sometimes cleans up the path and gets rid of @('..')
characters. But it also sometimes expands away symlinks, which you may not
want to do. At the time of this writing, @('extend-pathname') is not easy to
effectively bring into logic mode, but that may change in the future.</p>
<p>Our @('catpath') function is comparatively primitive. It doesn't try to
simplify the path in any way.</p>
<p>We assume Unix style paths, i.e., @('/') is the path separator. It's not
clear what we should do to support other systems like Windows.</p>"
(b* ((len (length basedir)) ((when (or (int= len 0)
(eql (char basedir (- len 1)) #\/))) (cat basedir filename)))
(cat basedir "/" filename)))
other
(local (progn (assert! (equal (catpath "" "foo.txt") "foo.txt")) (assert! (equal (catpath "/" "foo.txt") "/foo.txt")) (assert! (equal (catpath "~/" "foo.txt") "~/foo.txt")) (assert! (equal (catpath "~/../" "foo.txt") "~/../foo.txt")) (assert! (equal (catpath "~/../" "../") "~/../../")) (assert! (equal (catpath "/home/jared" "foo.txt") "/home/jared/foo.txt")) (assert! (equal (catpath "/home/jared/" "foo.txt") "/home/jared/foo.txt"))))
other
(define catpaths :parents (oslib) :short "Extend a base directory with many file names." ((basedir stringp "Directory whose name should be extended, which may or may not end with a slash.") (filenames string-listp "Names of files to append to @('basedir').")) :returns (paths string-listp "Extended paths.") (if (atom filenames) nil (cons (catpath basedir (car filenames)) (catpaths basedir (cdr filenames)))))