0
|
1 /* -*-mode:java; c-basic-offset:2; -*- */
|
|
2 /*
|
|
3 Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
|
|
4
|
|
5 Redistribution and use in source and binary forms, with or without
|
|
6 modification, are permitted provided that the following conditions are met:
|
|
7
|
|
8 1. Redistributions of source code must retain the above copyright notice,
|
|
9 this list of conditions and the following disclaimer.
|
|
10
|
|
11 2. Redistributions in binary form must reproduce the above copyright
|
|
12 notice, this list of conditions and the following disclaimer in
|
|
13 the documentation and/or other materials provided with the distribution.
|
|
14
|
|
15 3. The names of the authors may not be used to endorse or promote products
|
|
16 derived from this software without specific prior written permission.
|
|
17
|
|
18 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
19 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
20 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
21 INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
22 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
24 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
25 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
26 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
27 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28 */
|
|
29 /*
|
|
30 * This program is based on zlib-1.1.3, so all credit should go authors
|
|
31 * Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
|
|
32 * and contributors of zlib.
|
|
33 */
|
|
34
|
|
35 package com.jcraft.jzlib;
|
|
36
|
|
37 final class Adler32 {
|
|
38
|
|
39 // largest prime smaller than 65536
|
|
40 static final private int BASE = 65521;
|
|
41 // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1
|
|
42 static final private int NMAX = 5552;
|
|
43
|
|
44 long adler32(long adler, byte[] buf, int index, int len) {
|
|
45 if (buf == null) { return 1L; }
|
|
46
|
|
47 long s1 = adler & 0xffff;
|
|
48 long s2 = (adler >> 16) & 0xffff;
|
|
49 int k;
|
|
50
|
|
51 while (len > 0) {
|
|
52 k = len < NMAX ? len : NMAX;
|
|
53 len -= k;
|
|
54
|
|
55 while (k >= 16) {
|
|
56 s1 += buf[index++] & 0xff; s2 += s1;
|
|
57 s1 += buf[index++] & 0xff; s2 += s1;
|
|
58 s1 += buf[index++] & 0xff; s2 += s1;
|
|
59 s1 += buf[index++] & 0xff; s2 += s1;
|
|
60 s1 += buf[index++] & 0xff; s2 += s1;
|
|
61 s1 += buf[index++] & 0xff; s2 += s1;
|
|
62 s1 += buf[index++] & 0xff; s2 += s1;
|
|
63 s1 += buf[index++] & 0xff; s2 += s1;
|
|
64 s1 += buf[index++] & 0xff; s2 += s1;
|
|
65 s1 += buf[index++] & 0xff; s2 += s1;
|
|
66 s1 += buf[index++] & 0xff; s2 += s1;
|
|
67 s1 += buf[index++] & 0xff; s2 += s1;
|
|
68 s1 += buf[index++] & 0xff; s2 += s1;
|
|
69 s1 += buf[index++] & 0xff; s2 += s1;
|
|
70 s1 += buf[index++] & 0xff; s2 += s1;
|
|
71 s1 += buf[index++] & 0xff; s2 += s1;
|
|
72 k -= 16;
|
|
73 }
|
|
74
|
|
75 if (k != 0) {
|
|
76 do {
|
|
77 s1 += buf[index++] & 0xff; s2 += s1;
|
|
78 }
|
|
79 while (--k != 0);
|
|
80 }
|
|
81
|
|
82 s1 %= BASE;
|
|
83 s2 %= BASE;
|
|
84 }
|
|
85
|
|
86 return (s2 << 16) | s1;
|
|
87 }
|
|
88
|
|
89 /*
|
|
90 private java.util.zip.Adler32 adler=new java.util.zip.Adler32();
|
|
91 long adler32(long value, byte[] buf, int index, int len){
|
|
92 if(value==1) {adler.reset();}
|
|
93 if(buf==null) {adler.reset();}
|
|
94 else{adler.update(buf, index, len);}
|
|
95 return adler.getValue();
|
|
96 }
|
|
97 */
|
|
98 }
|