summaryrefslogtreecommitdiff
path: root/decode.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'decode.lisp')
-rw-r--r--decode.lisp73
1 files changed, 50 insertions, 23 deletions
diff --git a/decode.lisp b/decode.lisp
index df578a7..d569f6f 100644
--- a/decode.lisp
+++ b/decode.lisp
@@ -1,55 +1,82 @@
(in-package #:lempel)
-(declaim (ftype (function ((array (unsigned-byte 8)) (unsigned-byte 8)) (array (unsigned-byte 8))) prefix-decode))
+(declaim (optimize (debug 3) (safety 3)))
+
+(declaim (ftype (function ((array (unsigned-byte 8)) (unsigned-byte 8)) (array (unsigned-byte 1))) prefix-decode))
(defun prefix-decode (data prefix)
- (let ((result (queue:new)))
+ (let ((bits (make-array (* 8 (length data)) :element-type '(unsigned-byte 1)))
+ (result (queue:new))
+ (point-count 0))
(dotimes (i (length data))
- (cond ((= (elt data i) prefix)
- (let ((point (byte-pair->point data i)))
+ (byte->bits (elt data i) bits (* 8 i)))
+ (do ((i 0)) ((>= i (length bits)) nil)
+ (cond ((and (<= i (- (length bits) 8))
+ (= (bits->byte bits i) prefix))
+ (incf point-count)
+ (let ((point (byte-pair->point (bits->byte bits (+ i 8))
+ (bits->byte bits (+ i 16)))))
(if (= (point-size point) 0)
(progn
- (queue:push prefix result)
- (incf i))
+ (let ((prefix-bits (make-array 8 :element-type '(unsigned-byte 1))))
+ (byte->bits prefix prefix-bits 0)
+ (dotimes (j 8)
+ (queue:push (elt prefix-bits j) result))
+ (incf i 16)))
(progn
(queue:push point result)
- (incf i 2)))))
- (t (queue:push (elt data i) result))))
+ (incf i 24)))))
+ (t (queue:push (elt bits i) result)
+ (incf i))))
+ (format t "point count: ~a~&" point-count)
(decompress (queue:to-list result))))
-(declaim (ftype (function (list) (array (unsigned-byte 8))) decompress))
+(declaim (ftype (function (list) (array (unsigned-byte 1))) decompress))
(defun decompress (data)
- (declare (optimize (debug 3)))
- (let ((result (make-array (get-uncompressed-size data) :element-type '(unsigned-byte 8)))
+ (let ((result (make-array (get-uncompressed-size data) :element-type '(unsigned-byte 1)))
(fill-count 0))
+ (format t "uncompressed size: ~a~&" (length result))
(dolist (point data)
(cond ((point-p point)
(let ((start (- fill-count (point-offset point))))
(dotimes (j (point-size point))
(setf (elt result (+ fill-count j)) (elt result (+ start j))))
(incf fill-count (point-size point))))
- ((typep point '(unsigned-byte 8))
+ ((typep point '(unsigned-byte 1))
(setf (elt result fill-count) point)
(incf fill-count))
(t (error (format nil "cannot handle type ~a" (type-of point))))))
(assert (= fill-count (length result)))
result))
-(declaim (ftype (function ((array (unsigned-byte 8)) fixnum) point) byte-pair->point))
-(defun byte-pair->point (bytes index)
- (let ((offset (elt bytes (+ (if reversed-byte-order 2 1) index)))
- (size (elt bytes (+ (if reversed-byte-order 1 2) index)))
+(declaim (ftype (function ((unsigned-byte 8) (unsigned-byte 8)) point) byte-pair->point))
+(defun byte-pair->point (b1 b2)
+ (let ((offset (if reversed-byte-order b2 b1))
+ (size (if reversed-byte-order b1 b2))
(max-word-length (1- (ash 1 (- 16 window-bits)))))
- (make-point :offset (logior offset
- (ash (logand size (logxor #xff max-word-length))
- (- window-bits 8)))
- :size (logand size max-word-length))))
+ (make-point :offset (* 8 (logior offset
+ (ash (logand size (logxor #xff max-word-length))
+ (- window-bits 8))))
+ :size (* 8 (logand size max-word-length)))))
(declaim (ftype (function (list) fixnum) get-uncompressed-size))
(defun get-uncompressed-size (data)
(let ((size 0))
(dolist (point data)
(cond ((point-p point)
- (incf size (point-size point)))
- (t
- (incf size))))
+ (if (= (point-size point) 0)
+ (incf size 8)
+ (incf size (point-size point))))
+ (t (incf size))))
size))
+
+(declaim (ftype (function ((array (unsigned-byte 1)) fixnum) (unsigned-byte 8)) bits->byte))
+(defun bits->byte (data index)
+ (let ((byte 0))
+ (dotimes (i 8)
+ (setf byte (logior byte (ash (elt data (+ index i)) (- 7 i)))))
+ byte))
+
+(declaim (ftype (function ((unsigned-byte 8) (array (unsigned-byte 1)) fixnum)) byte->bits))
+(defun byte->bits (data bits index)
+ (dotimes (i 8)
+ (setf (elt bits (+ index i)) (ash (logand data (ash 1 (- 7 i))) (- i 7)))))