X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=byte-stream.lisp;h=79ce9df449d930637e5a0464a6ca273afc688850;hp=d65387f633a66f249ed22c0378212839c26a4012;hb=690430250882c7ccaa77033bec06b5d5c5aa1db5;hpb=64c1c09e57f627046cec4d5f20b9b4b953307235 diff --git a/byte-stream.lisp b/byte-stream.lisp index d65387f..79ce9df 100644 --- a/byte-stream.lisp +++ b/byte-stream.lisp @@ -7,7 +7,7 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: June 2003 ;;;; -;;;; $Id: byte-stream.lisp,v 1.2 2003/08/02 22:19:37 kevin Exp $ +;;;; $Id$ ;;;; ;;;; Works for CMUCL, SBCL, and AllergoCL only ;;;; @@ -27,7 +27,7 @@ (progn (defstruct (byte-array-output-stream (:include #+cmu system:lisp-stream - #+sbcl sb-impl::file-stream + #+sbcl sb-impl::fd-stream (bout #'byte-array-bout) (misc #'byte-array-out-misc)) (:print-function %print-byte-array-output-stream) @@ -85,11 +85,24 @@ Make-Byte-Array-Output-Stream since the last call to this function." ) ; progn +#+sbcl +(sb-ext:without-package-locks + (defvar *system-copy-fn* (if (fboundp (intern "COPY-SYSTEM-AREA" "SB-KERNEL")) + (intern "COPY-SYSTEM-AREA" "SB-KERNEL") + (intern "COPY-SYSTEM-UB8-AREA" "SB-KERNEL"))) + (defconstant *system-copy-offset* (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL")) + (* sb-vm:vector-data-offset sb-vm:n-word-bits) + 0)) + (defconstant *system-copy-multiplier* (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL")) + sb-vm:n-byte-bits + 1))) + #+(or cmu sbcl) (progn (defstruct (byte-array-input-stream (:include #+cmu system:lisp-stream - #+sbcl sb-impl::file-stream + ;;#+sbcl sb-impl::file-stream + #+sbcl sb-sys:fd-stream (in #'byte-array-inch) (bin #'byte-array-binch) (n-bin #'byte-array-stream-read-n-bytes) @@ -102,15 +115,20 @@ Make-Byte-Array-Output-Stream since the last call to this function." (current nil) (end nil)) + (defun %print-byte-array-input-stream (s stream d) (declare (ignore s d)) (write-string "#" stream)) - + (defun byte-array-inch (stream eof-errorp eof-value) (let ((byte-array (byte-array-input-stream-byte-array stream)) (index (byte-array-input-stream-current stream))) (cond ((= index (byte-array-input-stream-end stream)) - (eof-or-lose stream eof-errorp eof-value)) + #+cmu + (eof-or-lose stream eof-errorp eof-value) + #+sbcl + (sb-impl::eof-or-lose stream eof-errorp eof-value) + ) (t (setf (byte-array-input-stream-current stream) (1+ index)) (aref byte-array index))))) @@ -119,7 +137,11 @@ Make-Byte-Array-Output-Stream since the last call to this function." (let ((byte-array (byte-array-input-stream-byte-array stream)) (index (byte-array-input-stream-current stream))) (cond ((= index (byte-array-input-stream-end stream)) - (eof-or-lose stream eof-errorp eof-value)) + #+cmu + (eof-or-lose stream eof-errorp eof-value) + #+sbcl + (sb-impl::eof-or-lose stream eof-errorp eof-value) + ) (t (setf (byte-array-input-stream-current stream) (1+ index)) (aref byte-array index))))) @@ -144,13 +166,13 @@ Make-Byte-Array-Output-Stream since the last call to this function." (* copy vm:byte-bits))) #+sbcl (sb-sys:without-gcing - (sb-kernel:system-area-copy (sb-sys:vector-sap byte-array) - (* index sb-vm:n-byte-bits) + (funcall *system-copy-fn* (sb-sys:vector-sap byte-array) + (* index *system-copy-multiplier*) (if (typep buffer 'sb-sys::system-area-pointer) buffer (sb-sys:vector-sap buffer)) - (* start sb-vm:n-byte-bits) - (* copy sb-vm:n-byte-bits)))) + (* start *system-copy-multiplier*) + (* copy *system-copy-multiplier*)))) (if (and (> requested copy) eof-errorp) (error 'end-of-file :stream stream) copy))) @@ -212,6 +234,7 @@ Make-Byte-Array-Output-Stream since the last call to this function." (defmethod excl:device-extend ((stream extendable-buffer-output-stream) need action) + (declare (ignore action)) (let* ((len (file-position stream)) (new-len (max (+ len need) (* 2 len))) (old-buf (slot-value stream 'excl::buffer))