source: trunk/third/zlib/adler32.c @ 17315

Revision 17315, 1.3 KB checked in by zacheiss, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r17314, which included commits to RCS files with non-trunk default branches.
Line 
1/* adler32.c -- compute the Adler-32 checksum of a data stream
2 * Copyright (C) 1995-2002 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h
4 */
5
6/* @(#) $Id: adler32.c,v 1.1.1.2 2002-03-12 17:19:03 zacheiss Exp $ */
7
8#include "zlib.h"
9
10#define BASE 65521L /* largest prime smaller than 65536 */
11#define NMAX 5552
12/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
13
14#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
15#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
16#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
17#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
18#define DO16(buf)   DO8(buf,0); DO8(buf,8);
19
20/* ========================================================================= */
21uLong ZEXPORT adler32(adler, buf, len)
22    uLong adler;
23    const Bytef *buf;
24    uInt len;
25{
26    unsigned long s1 = adler & 0xffff;
27    unsigned long s2 = (adler >> 16) & 0xffff;
28    int k;
29
30    if (buf == Z_NULL) return 1L;
31
32    while (len > 0) {
33        k = len < NMAX ? len : NMAX;
34        len -= k;
35        while (k >= 16) {
36            DO16(buf);
37            buf += 16;
38            k -= 16;
39        }
40        if (k != 0) do {
41            s1 += *buf++;
42            s2 += s1;
43        } while (--k);
44        s1 %= BASE;
45        s2 %= BASE;
46    }
47    return (s2 << 16) | s1;
48}
Note: See TracBrowser for help on using the repository browser.