Commit 372b33b4 authored by Nathan Froyd's avatar Nathan Froyd
Browse files

make non-consing readers more akin to READ-SEQUENCE

If the user wants to use lists, they should be able to do that.
parent d7b99973
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -20,12 +20,12 @@
	   #:read-ub64/le-vector #:read-ub64/be-vector
	   #:read-sb64/le-vector #:read-sb64/be-vector)
  ;; Non-consing variants akin to READ-SEQUENCE.
  (:export #:read-into-ub16/le-vector #:read-into-ub16/be-vector
	   #:read-into-sb16/le-vector #:read-into-sb16/be-vector
	   #:read-into-ub32/le-vector #:read-into-ub32/be-vector
	   #:read-into-sb32/le-vector #:read-into-sb32/be-vector
	   #:read-into-ub64/le-vector #:read-into-ub64/be-vector
	   #:read-into-sb64/le-vector #:read-into-sb64/be-vector)
  (:export #:read-ub16/le-into-sequence #:read-ub16/be-into-sequence
	   #:read-sb16/le-into-sequence #:read-sb16/be-into-sequence
	   #:read-ub32/le-into-sequence #:read-ub32/be-into-sequence
	   #:read-sb32/le-into-sequence #:read-sb32/be-into-sequence
	   #:read-ub64/le-into-sequence #:read-ub64/be-into-sequence
	   #:read-sb64/le-into-sequence #:read-sb64/be-into-sequence)
  ;; Stream writers.
  (:export #:write-ub16/le #:write-ub16/be #:write-sb16/be #:write-sb16/le
           #:write-ub32/le #:write-ub32/be #:write-sb32/be #:write-sb32/le
+20 −5
Original line number Diff line number Diff line
@@ -34,6 +34,17 @@
	     (setf (aref vector i) (funcall reffer v 0))
	  finally (return vector))))

(defun read-into-list* (stream list start end n-bytes reffer)
  (declare (type function reffer))
  (do ((end (or end) (length list))
       (v (make-array n-bytes :element-type '(unsigned-byte 8)))
       (rem (nthcdr start list) (rest rem))
       (i start (1+ i)))
      ((or (endp rem) (>= i end)) list)
    (declare (dynamic-extent v))
    (read-n-bytes-into stream n-bytes v)
    (setf (first rem) (funcall reffer v 0))))

#.(loop for i from 0 upto #b10111
        for bitsize = (ecase (ldb (byte 2 3) i)
                        (0 16)
@@ -67,10 +78,14 @@
			   do (,name (aref vector i) stream)
			   finally (return vector))) into forms
	if readp
	  collect `(defun ,(intern (format nil "READ-INTO-~:[U~;S~]B~D/~:[LE~;BE~]-VECTOR"
	  collect `(defun ,(intern (format nil "READ-~:[U~;S~]B~D/~:[LE~;BE~]-INTO-SEQUENCE"
					   signedp bitsize big-endian-p))
		       (vector stream &key (start 0) end)
		       (seq stream &key (start 0) end)
		     (etypecase seq
		       (list (read-into-list* stream seq start end
					      ,n-bytes #',byte-fun))
		       (vector
			(let ((end (or end (length vector))))
		       (read-into-vector* stream vector start (- end start)
					  ,n-bytes #',byte-fun))) into forms
			  (read-into-vector* stream seq start (- end start)
					     ,n-bytes #',byte-fun))))) into forms
        finally (return `(progn ,@forms)))