1 ;;;; $Id: adler32.lisp,v 1.5 2007/12/19 20:57:08 xach Exp $
5 (defconstant +adler32-base
+ 65521)
7 (defun adler32-update (adler-high adler-low buf start count
)
8 (declare (type array-index start
)
9 (type (integer 0 65536) count
)
10 (type (unsigned-byte 16) adler-high adler-low
)
11 (type octet-vector buf
)
14 (values adler-high adler-low
))
21 (declare (type (integer 0 32658) length
)
22 (type (integer 0 16) i k
)
23 (type (integer 0 65536) s1 s2
))
26 (setf k
(min length
16))
29 (setf s1
(+ (aref buf
(logand #xFFFF
(+ start i
))) s1
))
35 (setf s1
(mod s1
+adler32-base
+))
36 (setf s2
(mod s2
+adler32-base
+))
37 (unless (zerop length
)
43 (defclass adler32-checksum
(checksum)
54 (defmethod result ((checksum adler32-checksum
))
55 (+ (ash (high checksum
) 16)
58 (defmethod result-octets ((checksum adler32-checksum
))
59 (ub32-octets (result checksum
)))
61 (defmethod update ((checksum adler32-checksum
) buffer start count
)
62 (setf (values (high checksum
)
64 (adler32-update (high checksum
)