;;;; Programmer: Kevin M. Rosenberg
;;;; Date Started: Apr 2000
;;;;
-;;;; $Id: io.lisp,v 1.8 2003/06/17 17:50:45 kevin Exp $
+;;;; $Id$
;;;;
;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg
;;;;
(setf pos 0))))
(buf-flush buf out)))
+(declaim (inline write-fixnum))
+(defun write-fixnum (n s)
+ #+allegro (excl::print-fixnum s 10 n)
+ #-allegro (write-string (write-to-string n) s))
+
+
+
+#+openmcl
+(defun open-device-stream (path direction)
+ (let* ((mode (ecase direction
+ (:input #.(read-from-string "#$O_RDONLY"))
+ (:output #.(read-from-string "#$O_WRONLY"))
+ (:io #.(read-from-string "#$O_RDWR"))))
+ (fd (ccl::fd-open (ccl::native-translated-namestring path) mode)))
+ (if (< fd 0)
+ (ccl::signal-file-error fd path)
+ (ccl::make-fd-stream fd :direction direction))))
+
+
+(defun null-output-stream ()
+ #-openmcl
+ (when (probe-file #p"/dev/null")
+ (open #p"/dev/null" :direction :output :if-exists :overwrite))
+ #+openmcl
+ (when (probe-file #p"/dev/null")
+ (open-device-stream #p"/dev/null" :output))
+ )
+
+(defun un-unspecific (value)
+ "Convert :UNSPECIFIC to NIL."
+ (if (eq value :unspecific) nil value))
+
+(defun canonicalize-directory-name (filename)
+ (flet ((un-unspecific (value)
+ (if (eq value :unspecific) nil value)))
+ (let* ((path (pathname filename))
+ (name (un-unspecific (pathname-name path)))
+ (type (un-unspecific (pathname-type path)))
+ (new-dir
+ (cond ((and name type) (list (concatenate 'string name "." type)))
+ (name (list name))
+ (type (list type))
+ (t nil))))
+ (if new-dir
+ (make-pathname
+ :directory (append (un-unspecific (pathname-directory path))
+ new-dir)
+ :name nil :type nil :version nil :defaults path)
+ path))))
+
+(defun probe-directory (filename)
+ (let ((path (canonicalize-directory-name filename)))
+ #+allegro (excl:probe-directory path)
+ #+clisp (values
+ (ignore-errors
+ (#+lisp=cl ext:probe-directory #-lisp=cl lisp:probe-directory
+ path)))
+ #+(or cmu scl) (eq :directory (unix:unix-file-kind (namestring path)))
+ #+lispworks (lw:file-directory-p path)
+ #+sbcl (eq :directory (sb-unix:unix-file-kind (namestring path)))
+ #-(or allegro clisp cmu lispworks sbcl scl)
+ (probe-file path)))
+
+(defun directory-tree (filename)
+ "Returns a tree of pathnames for sub-directories of a directory"
+ (let* ((root (canonicalize-directory-name filename))
+ (subdirs (loop for path in (directory
+ (make-pathname :name :wild
+ :type :wild
+ :defaults root))
+ when (probe-directory path)
+ collect (canonicalize-directory-name path))))
+ (when (find nil subdirs)
+ (error "~A" subdirs))
+ (when (null root)
+ (error "~A" root))
+ (if subdirs
+ (cons root (mapcar #'directory-tree subdirs))
+ (if (probe-directory root)
+ (list root)
+ (error "root not directory ~A" root)))))
+
+