| /* Copyright (C) 1999 Cygnus Solutions |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| package java.util.zip; |
| |
| /** |
| * @author Per Bothner |
| * @date April 6, 1999. |
| */ |
| |
| /* |
| * Written using on-line Java Platform 1.2 API Specification, as well |
| * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). |
| * The actual Adler32 algorithm is taken from RFC 1950. |
| * Status: Believed complete and correct. |
| */ |
| |
| public class Adler32 implements Checksum |
| { |
| private static int BASE = 65521; /* largest prime smaller than 65536 */ |
| |
| int s1; |
| int s2; |
| |
| public Adler32 () |
| { |
| reset(); |
| } |
| |
| public void reset () { s1 = 1; s2 = 0; } |
| |
| public void update (int bval) |
| { |
| s1 = (s1 + (bval & 0xFF)) % BASE; |
| s2 = (s1 + s2) % BASE; |
| } |
| |
| public void update (byte[] buffer) |
| { |
| update(buffer, 0, buffer.length); |
| } |
| |
| public void update (byte[] buf, int off, int len) |
| { |
| int s1 = this.s1; |
| int s2 = this.s2; |
| while (len > 0) |
| { |
| // We can defer the modulo operation. |
| int n = 4000; |
| if (n > len) |
| n = len; |
| len -= n; |
| while (--n >= 0) |
| { |
| s1 = s1 + (buf[off++] & 0xFF); |
| s2 = s2 + s1; |
| } |
| s1 %= BASE; |
| s2 %= BASE; |
| } |
| this.s1 = s1; |
| this.s2 = s2; |
| } |
| |
| public long getValue() |
| { |
| return ((long) s2 << 16) + s1; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |