Updated version to 2.1.
[salza2.git] / adler32.lisp
blob39e9a1bdc78899227c707e011505cef70581c24b
1 ;;;
2 ;;; Copyright (c) 2007 Zachary Beane, All Rights Reserved
3 ;;;
4 ;;; Redistribution and use in source and binary forms, with or without
5 ;;; modification, are permitted provided that the following conditions
6 ;;; are met:
7 ;;;
8 ;;; * Redistributions of source code must retain the above copyright
9 ;;; notice, this list of conditions and the following disclaimer.
10 ;;;
11 ;;; * Redistributions in binary form must reproduce the above
12 ;;; copyright notice, this list of conditions and the following
13 ;;; disclaimer in the documentation and/or other materials
14 ;;; provided with the distribution.
15 ;;;
16 ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
17 ;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 ;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20 ;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 ;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
22 ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 ;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 ;;;
29 (in-package #:salza2)
31 (defconstant +adler32-base+ 65521)
33 (defun adler32-update (adler-high adler-low buf start count)
34 (declare (type array-index start count)
35 (type (unsigned-byte 16) adler-high adler-low)
36 (type octet-vector buf)
37 (optimize speed))
38 (cond ((zerop count)
39 (values adler-high adler-low))
41 (let ((length count)
42 (i 0)
43 (k 0)
44 (s1 adler-low)
45 (s2 adler-high))
46 (declare (type (integer 0 16) k)
47 (type array-index i)
48 (type (unsigned-byte 16) length)
49 (type (unsigned-byte 32) s1 s2))
50 (tagbody
51 loop
52 (setf k (min length 16))
53 (decf length k)
54 sum
55 (setf s1 (+ (aref buf (logand #xFFFF (+ start i))) s1))
56 (setf s2 (+ s1 s2))
57 (decf k)
58 (incf i)
59 (unless (zerop k)
60 (go sum))
61 (setf s1 (mod s1 +adler32-base+))
62 (setf s2 (mod s2 +adler32-base+))
63 (unless (zerop length)
64 (go loop)))
65 (values s2 s1)))))
67 ;;; Class interface
69 (defclass adler32-checksum (checksum)
70 ((high
71 :initarg :high
72 :accessor high)
73 (low
74 :initarg :low
75 :accessor low))
76 (:default-initargs
77 :high 0
78 :low 1))
80 (defmethod result ((checksum adler32-checksum))
81 (+ (ash (high checksum) 16)
82 (low checksum)))
84 (defmethod result-octets ((checksum adler32-checksum))
85 (ub32-octets (result checksum)))
87 (defmethod update ((checksum adler32-checksum) buffer start count)
88 (setf (values (high checksum)
89 (low checksum))
90 (adler32-update (high checksum)
91 (low checksum)
92 buffer
93 start
94 count)))
96 (defmethod reset ((checksum adler32-checksum))
97 (setf (high checksum) 0
98 (low checksum) 1))