Skip to content

Instantly share code, notes, and snippets.

@lonjil
Last active August 19, 2017 00:19
Show Gist options
  • Save lonjil/767674758bbf81789dcf16467e8efda8 to your computer and use it in GitHub Desktop.
Save lonjil/767674758bbf81789dcf16467e8efda8 to your computer and use it in GitHub Desktop.
(defun read-bits (count &key (endian :be))
(block outer
(with-slots (buffer-size buffer-data) *bit-buffer*
(let ((res 0))
(loop
with d = 0
with i = 0
when (= i count)
do
(return (values res i))
if (< buffer-size 1)
do
(let ((new-byte (handler-case (read-integer :endian endian)
(end-of-file () nil))))
(if new-byte
(progn
(setf buffer-size 8)
(setf buffer-data new-byte))
(return-from outer (values res i))))
if (>= buffer-size 1)
do
(let ((bit (ldb (byte 1 (- buffer-size 1)) buffer-data)))
(setf res (+ bit (* 2 res)))
(setf (ldb (byte 1 (- buffer-size 1)) buffer-data) 0)
(decf buffer-size)
(incf i)))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment