X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=io.lisp;h=6df15953c7b533c32a320a612c4b6481137a0a25;hp=25a931181458166de29f7134234b969278229712;hb=969fdba72abb830cd8fff86cc77c21b4a7da3620;hpb=05dcd87a3f0dffe14d1f47763bc214fb9cc6c979 diff --git a/io.lisp b/io.lisp index 25a9311..6df1595 100644 --- a/io.lisp +++ b/io.lisp @@ -7,47 +7,55 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: io.lisp,v 1.5 2003/05/09 08:33:23 kevin Exp $ +;;;; $Id$ ;;;; -;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg +;;;; This file, part of KMRCL, is Copyright (c) 2002-2003 by Kevin M. Rosenberg ;;;; ;;;; KMRCL users are granted the rights to distribute and use this software ;;;; as governed by the terms of the Lisp Lesser GNU Public License ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL. ;;;; ************************************************************************* -(in-package :kmrcl) +(in-package #:kmrcl) (defun print-file-contents (file &optional (strm *standard-output*)) "Opens a reads a file. Returns the contents as a single string" (when (probe-file file) - (with-open-file (in file :direction :input) - (let ((eof (gensym))) - (do ((line (read-line in nil eof) - (read-line in nil eof))) - ((eq line eof)) - (format strm "~A~%" line)))))) - + (let ((eof (cons 'eof nil))) + (with-open-file (in file :direction :input) + (do ((line (read-line in nil eof) + (read-line in nil eof))) + ((eq line eof)) + (write-string line strm) + (write-char #\newline strm)))))) + +(defun read-stream-to-string (in) + (with-output-to-string (out) + (let ((eof (gensym))) + (do ((line (read-line in nil eof) + (read-line in nil eof))) + ((eq line eof)) + (format out "~A~%" line))))) + (defun read-file-to-string (file) "Opens a reads a file. Returns the contents as a single string" (with-output-to-string (out) (with-open-file (in file :direction :input) - (let ((eof (gensym))) - (do ((line (read-line in nil eof) - (read-line in nil eof))) - ((eq line eof)) - (format out "~A~%" line)))))) - + (read-stream-to-string in)))) + +(defun read-stream-to-strings (in) + (let ((lines '()) + (eof (gensym))) + (do ((line (read-line in nil eof) + (read-line in nil eof))) + ((eq line eof)) + (push line lines))) + (nreverse lines)) + (defun read-file-to-strings (file) "Opens a reads a file. Returns the contents as a list of strings" - (let ((lines '())) - (with-open-file (in file :direction :input) - (let ((eof (gensym))) - (do ((line (read-line in nil eof) - (read-line in nil eof))) - ((eq line eof)) - (push line lines))) - (nreverse lines)))) + (with-open-file (in file :direction :input) + (read-stream-to-strings in))) (defun file-subst (old new file1 file2) (with-open-file (in file1 :direction :input) @@ -55,12 +63,27 @@ :if-exists :supersede) (stream-subst old new in out)))) -(defun indent-spaces (n &optional (stream *standard-output*)) - "Indent n*2 spaces to output stream" +(defun print-n-chars (char n stream) (declare (fixnum n) (optimize (speed 3) (safety 0) (space 0))) - (dotimes (i (the fixnum (+ n n))) + (dotimes (i n) (declare (fixnum i)) - (write-char #\space stream))) + (write-char char stream))) + +(defun print-n-strings (str n stream) + (declare (fixnum n) (optimize (speed 3) (safety 0) (space 0))) + (dotimes (i n) + (declare (fixnum i)) + (write-string str stream))) + +(defun indent-spaces (n &optional (stream *standard-output*)) + "Indent n*2 spaces to output stream" + (print-n-chars #\space (+ n n) stream)) + + +(defun indent-html-spaces (n &optional (stream *standard-output*)) + "Indent n*2 html spaces to output stream" + (print-n-strings " " (+ n n) stream)) + (defun print-list (l &optional (output *standard-output*)) "Print a list to a stream" @@ -148,3 +171,52 @@ (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 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))))) + +