/* Adler32.java - Computes Adler32 data checksum of a data stream
   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package java.util.zip;

/*
 * 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.
 */

/**
 * Computes Adler32 checksum for a stream of data. An Adler32
 * checksum is not as reliable as a CRC32 checksum, but a lot faster to
 * compute.
 *<p>
 * The specification for Adler32 may be found in RFC 1950.
 * (ZLIB Compressed Data Format Specification version 3.3)
 *<p>
 *<p>
 * From that document:
 *<p>
 *      "ADLER32 (Adler-32 checksum)
 *       This contains a checksum value of the uncompressed data
 *       (excluding any dictionary data) computed according to Adler-32
 *       algorithm. This algorithm is a 32-bit extension and improvement
 *       of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
 *       standard.
 *<p>
 *       Adler-32 is composed of two sums accumulated per byte: s1 is
 *       the sum of all bytes, s2 is the sum of all s1 values. Both sums
 *       are done modulo 65521. s1 is initialized to 1, s2 to zero.  The
 *       Adler-32 checksum is stored as s2*65536 + s1 in most-
 *       significant-byte first (network) order."
 *<p>
 * "8.2. The Adler-32 algorithm
 *<p>
 *    The Adler-32 algorithm is much faster than the CRC32 algorithm yet
 *    still provides an extremely low probability of undetected errors.
 *<p>
 *    The modulo on unsigned long accumulators can be delayed for 5552
 *    bytes, so the modulo operation time is negligible.  If the bytes
 *    are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
 *    and order sensitive, unlike the first sum, which is just a
 *    checksum.  That 65521 is prime is important to avoid a possible
 *    large class of two-byte errors that leave the check unchanged.
 *    (The Fletcher checksum uses 255, which is not prime and which also
 *    makes the Fletcher check insensitive to single byte changes 0 <->
 *    255.)
 *<p>
 *    The sum s1 is initialized to 1 instead of zero to make the length
 *    of the sequence part of s2, so that the length does not have to be
 *   checked separately. (Any sequence of zeroes has a Fletcher
 *    checksum of zero.)"
 *
 * @author John Leuner, Per Bothner
 * @since JDK 1.1
 *
 * @see InflaterInputStream
 * @see DeflaterOutputStream
 */
public class Adler32 implements Checksum
{

  /** largest prime smaller than 65536 */
  private static final int BASE = 65521;

  private int checksum; //we do all in int.

  //Note that java doesn't have unsigned integers,
  //so we have to be careful with what arithmetic
  //we do. We return the checksum as a long to
  //avoid sign confusion.

  /**
   * Creates a new instance of the <code>Adler32</code> class.
   * The checksum starts off with a value of 1.
   */
  public Adler32 ()
  {
    reset();
  }

  /**
   * Resets the Adler32 checksum to the initial value.
   */
  public void reset ()
  {
    checksum = 1; //Initialize to 1
  }

  /**
   * Updates the checksum with the byte b.
   *
   * @param bval the data value to add. The high byte of the int is ignored.
   */
  public void update (int bval)
  {
    //We could make a length 1 byte array and call update again, but I
    //would rather not have that overhead
    int s1 = checksum & 0xffff;
    int s2 = checksum >>> 16;

    s1 = (s1 + (bval & 0xFF)) % BASE;
    s2 = (s1 + s2) % BASE;

    checksum = (s2 << 16) + s1;
  }

  /**
   * Updates the checksum with the bytes taken from the array.
   *
   * @param buffer an array of bytes
   */
  public void update (byte[] buffer)
  {
    update(buffer, 0, buffer.length);
  }

  /**
   * Updates the checksum with the bytes taken from the array.
   *
   * @param buf an array of bytes
   * @param off the start of the data used for this update
   * @param len the number of bytes to use for this update
   */
  public void update (byte[] buf, int off, int len)
  {
    //(By Per Bothner)
    int s1 = checksum & 0xffff;
    int s2 = checksum >>> 16;

    while (len > 0)
      {
        // We can defer the modulo operation:
        // s1 maximally grows from 65521 to 65521 + 255 * 3800
        // s2 maximally grows by 3800 * median(s1) = 2090079800 < 2^31
        int n = 3800;
        if (n > len)
          n = len;
        len -= n;
        while (--n >= 0)
          {
            s1 = s1 + (buf[off++] & 0xFF);
            s2 = s2 + s1;
          }
        s1 %= BASE;
        s2 %= BASE;
      }

    /*Old implementation, borrowed from somewhere:
    int n;

    while (len-- > 0) {

      s1 = (s1 + (bs[offset++] & 0xff)) % BASE;
      s2 = (s2 + s1) % BASE;
    }*/

    checksum = (s2 << 16) | s1;
  }

  /**
   * Returns the Adler32 data checksum computed so far.
   */
  public long getValue()
  {
    return (long) checksum & 0xffffffffL;
  }
}
