Last active
August 19, 2017 00:19
-
-
Save lonjil/767674758bbf81789dcf16467e8efda8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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