2f1311730e
primarily of pointless $FreeBSD$ tags), sync most files in HEAD with those in the ZLIB branch. This minimizes the differences between HEAD and ZLIB and should simplify future imports. After this, there are only three files with local modifications (gzio.c, minigzip.c, and zconf.h) and two non-vendor files (Makefile, zopen.c). The rest exactly match the vendor distribution. PR: i386/76294 MFC after: 2 weeks
75 lines
2.2 KiB
C
75 lines
2.2 KiB
C
/* adler32.c -- compute the Adler-32 checksum of a data stream
|
|
* Copyright (C) 1995-2003 Mark Adler
|
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
*/
|
|
|
|
/* @(#) $Id$ */
|
|
|
|
#define ZLIB_INTERNAL
|
|
#include "zlib.h"
|
|
|
|
#define BASE 65521UL /* largest prime smaller than 65536 */
|
|
#define NMAX 5552
|
|
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
|
|
|
|
#define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
|
|
#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
|
|
#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
|
|
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
|
|
#define DO16(buf) DO8(buf,0); DO8(buf,8);
|
|
|
|
#ifdef NO_DIVIDE
|
|
# define MOD(a) \
|
|
do { \
|
|
if (a >= (BASE << 16)) a -= (BASE << 16); \
|
|
if (a >= (BASE << 15)) a -= (BASE << 15); \
|
|
if (a >= (BASE << 14)) a -= (BASE << 14); \
|
|
if (a >= (BASE << 13)) a -= (BASE << 13); \
|
|
if (a >= (BASE << 12)) a -= (BASE << 12); \
|
|
if (a >= (BASE << 11)) a -= (BASE << 11); \
|
|
if (a >= (BASE << 10)) a -= (BASE << 10); \
|
|
if (a >= (BASE << 9)) a -= (BASE << 9); \
|
|
if (a >= (BASE << 8)) a -= (BASE << 8); \
|
|
if (a >= (BASE << 7)) a -= (BASE << 7); \
|
|
if (a >= (BASE << 6)) a -= (BASE << 6); \
|
|
if (a >= (BASE << 5)) a -= (BASE << 5); \
|
|
if (a >= (BASE << 4)) a -= (BASE << 4); \
|
|
if (a >= (BASE << 3)) a -= (BASE << 3); \
|
|
if (a >= (BASE << 2)) a -= (BASE << 2); \
|
|
if (a >= (BASE << 1)) a -= (BASE << 1); \
|
|
if (a >= BASE) a -= BASE; \
|
|
} while (0)
|
|
#else
|
|
# define MOD(a) a %= BASE
|
|
#endif
|
|
|
|
/* ========================================================================= */
|
|
uLong ZEXPORT adler32(adler, buf, len)
|
|
uLong adler;
|
|
const Bytef *buf;
|
|
uInt len;
|
|
{
|
|
unsigned long s1 = adler & 0xffff;
|
|
unsigned long s2 = (adler >> 16) & 0xffff;
|
|
int k;
|
|
|
|
if (buf == Z_NULL) return 1L;
|
|
|
|
while (len > 0) {
|
|
k = len < NMAX ? (int)len : NMAX;
|
|
len -= k;
|
|
while (k >= 16) {
|
|
DO16(buf);
|
|
buf += 16;
|
|
k -= 16;
|
|
}
|
|
if (k != 0) do {
|
|
s1 += *buf++;
|
|
s2 += s1;
|
|
} while (--k);
|
|
MOD(s1);
|
|
MOD(s2);
|
|
}
|
|
return (s2 << 16) | s1;
|
|
}
|