// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// This package implements the Adler-32 checksum.
// Defined in RFC 1950:
//	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.
package adler32

import (
	"hash";
	"os";
)

const (
	mod = 65521;
)

// The size of an Adler-32 checksum in bytes.
const Size = 4

// digest represents the partial evaluation of a checksum.
type digest struct {
	// invariant: (a < mod && b < mod) || a <= b
	// invariant: a + b + 255 <= 0xffffffff
	a, b uint32;
}

func (d *digest) Reset()	{ d.a, d.b = 1, 0 }

// New returns a new Hash32 computing the Adler-32 checksum.
func New() hash.Hash32 {
	d := new(digest);
	d.Reset();
	return d;
}

func (d *digest) Size() int	{ return Size }

// Add p to the running checksum a, b.
func update(a, b uint32, p []byte) (aa, bb uint32) {
	for i := 0; i < len(p); i++ {
		a += uint32(p[i]);
		b += a;
		// invariant: a <= b
		if b > (0xffffffff-255)/2 {
			a %= mod;
			b %= mod;
			// invariant: a < mod && b < mod
		} else {
			// invariant: a + b + 255 <= 2 * b + 255 <= 0xffffffff
		}
	}
	return a, b;
}

// Return the 32-bit checksum corresponding to a, b.
func finish(a, b uint32) uint32 {
	if b >= mod {
		a %= mod;
		b %= mod;
	}
	return b<<16 | a;
}

func (d *digest) Write(p []byte) (nn int, err os.Error) {
	d.a, d.b = update(d.a, d.b, p);
	return len(p), nil;
}

func (d *digest) Sum32() uint32	{ return finish(d.a, d.b) }

func (d *digest) Sum() []byte {
	p := make([]byte, 4);
	s := d.Sum32();
	p[0] = byte(s >> 24);
	p[1] = byte(s >> 16);
	p[2] = byte(s >> 8);
	p[3] = byte(s);
	return p;
}

// Checksum returns the Adler-32 checksum of data.
func Checksum(data []byte) uint32	{ return finish(update(1, 0, data)) }
