Loading package.lisp +6 −6 Original line number Diff line number Diff line Loading @@ -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 Loading streams.lisp +20 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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))) Loading
package.lisp +6 −6 Original line number Diff line number Diff line Loading @@ -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 Loading
streams.lisp +20 −5 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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)))