X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=io.lisp;h=9c591c7ca368558de15c90e67e47f52fc0fd59dd;hp=753cc44e9b988c555ca0512bb55b8440a02842f3;hb=e83a72f1e88062d7e17ac77c17cc9c32d51f3c13;hpb=4de7f25a69c218303f170314ac26217770a531ed diff --git a/io.lisp b/io.lisp index 753cc44..9c591c7 100644 --- a/io.lisp +++ b/io.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: io.lisp,v 1.1 2003/04/28 23:51:59 kevin Exp $ +;;;; $Id: io.lisp,v 1.13 2003/07/30 22:23:25 kevin Exp $ ;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; @@ -16,7 +16,7 @@ ;;;; (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" @@ -55,26 +55,35 @@ :if-exists :supersede) (stream-subst old new in out)))) +(defun print-n-chars (char n stream) + (declare (fixnum n) (optimize (speed 3) (safety 0) (space 0))) + (dotimes (i n) + (declare (fixnum i)) + (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" - (when (numberp n) - (let ((fmt (format nil "~~~DT" (+ n n)))) - (format stream fmt)))) + (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" - (if (consp l) - (progn - (mapcar (lambda (x) (princ x output) (princ #\newline output)) l) - t) - nil)) + (format output "~{~A~%~}" l)) (defun print-rows (rows &optional (ostrm *standard-output*)) "Print a list of list rows to a stream" - (dolist (r rows) - (mapcar (lambda (a) (princ a ostrm) (princ #\space ostrm)) r) - (terpri ostrm))) + (dolist (r rows) (format ostrm "~{~A~^ ~}~%" r))) ;; Buffered stream substitute @@ -154,3 +163,29 @@ (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 #$O_RDONLY) + (:output #$O_WRONLY) + (:io #$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)) + )