adler32.c revision 146081
117651Speter/* adler32.c -- compute the Adler-32 checksum of a data stream 2131380Stjr * Copyright (C) 1995-2003 Mark Adler 3131380Stjr * For conditions of distribution and use, see copyright notice in zlib.h 417651Speter */ 517651Speter 6146081Skientzle/* @(#) $Id$ */ 717651Speter 8131380Stjr#define ZLIB_INTERNAL 917651Speter#include "zlib.h" 1017651Speter 11131380Stjr#define BASE 65521UL /* largest prime smaller than 65536 */ 1217651Speter#define NMAX 5552 1317651Speter/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ 1417651Speter 1517651Speter#define DO1(buf,i) {s1 += buf[i]; s2 += s1;} 1617651Speter#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); 1717651Speter#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); 1817651Speter#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); 1917651Speter#define DO16(buf) DO8(buf,0); DO8(buf,8); 2017651Speter 21131380Stjr#ifdef NO_DIVIDE 22131380Stjr# define MOD(a) \ 23131380Stjr do { \ 24131380Stjr if (a >= (BASE << 16)) a -= (BASE << 16); \ 25131380Stjr if (a >= (BASE << 15)) a -= (BASE << 15); \ 26131380Stjr if (a >= (BASE << 14)) a -= (BASE << 14); \ 27131380Stjr if (a >= (BASE << 13)) a -= (BASE << 13); \ 28131380Stjr if (a >= (BASE << 12)) a -= (BASE << 12); \ 29131380Stjr if (a >= (BASE << 11)) a -= (BASE << 11); \ 30131380Stjr if (a >= (BASE << 10)) a -= (BASE << 10); \ 31131380Stjr if (a >= (BASE << 9)) a -= (BASE << 9); \ 32131380Stjr if (a >= (BASE << 8)) a -= (BASE << 8); \ 33131380Stjr if (a >= (BASE << 7)) a -= (BASE << 7); \ 34131380Stjr if (a >= (BASE << 6)) a -= (BASE << 6); \ 35131380Stjr if (a >= (BASE << 5)) a -= (BASE << 5); \ 36131380Stjr if (a >= (BASE << 4)) a -= (BASE << 4); \ 37131380Stjr if (a >= (BASE << 3)) a -= (BASE << 3); \ 38131380Stjr if (a >= (BASE << 2)) a -= (BASE << 2); \ 39131380Stjr if (a >= (BASE << 1)) a -= (BASE << 1); \ 40131380Stjr if (a >= BASE) a -= BASE; \ 41131380Stjr } while (0) 42131380Stjr#else 43131380Stjr# define MOD(a) a %= BASE 44131380Stjr#endif 45131380Stjr 4617651Speter/* ========================================================================= */ 4733908SsteveuLong ZEXPORT adler32(adler, buf, len) 4817651Speter uLong adler; 4917651Speter const Bytef *buf; 5017651Speter uInt len; 5117651Speter{ 5217651Speter unsigned long s1 = adler & 0xffff; 5317651Speter unsigned long s2 = (adler >> 16) & 0xffff; 5417651Speter int k; 5517651Speter 5617651Speter if (buf == Z_NULL) return 1L; 5717651Speter 5817651Speter while (len > 0) { 59131380Stjr k = len < NMAX ? (int)len : NMAX; 6017651Speter len -= k; 6117651Speter while (k >= 16) { 6217651Speter DO16(buf); 63131380Stjr buf += 16; 6417651Speter k -= 16; 6517651Speter } 6617651Speter if (k != 0) do { 6717651Speter s1 += *buf++; 68131380Stjr s2 += s1; 6917651Speter } while (--k); 70131380Stjr MOD(s1); 71131380Stjr MOD(s2); 7217651Speter } 7317651Speter return (s2 << 16) | s1; 7417651Speter} 75