diff options
author | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-10-17 15:51:44 -0700 |
commit | e585187b248f48b3c6e9247b49fa07c6565d65e5 (patch) | |
tree | 637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /dep/src/zlib/adler32.c | |
parent | 26b5e033ffde3d161382fc9addbfa99738379641 (diff) |
*Backed out changeset 3be01fb200a5
--HG--
branch : trunk
Diffstat (limited to 'dep/src/zlib/adler32.c')
-rw-r--r-- | dep/src/zlib/adler32.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/dep/src/zlib/adler32.c b/dep/src/zlib/adler32.c index 483da9c58c0..007ba26277c 100644 --- a/dep/src/zlib/adler32.c +++ b/dep/src/zlib/adler32.c @@ -2,17 +2,22 @@ * Copyright (C) 1995-2004 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) {adler += (buf)[i]; sum2 += adler;} #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); + /* use NO_DIVIDE if your processor does not do division in hardware */ #ifdef NO_DIVIDE # define MOD(a) \ @@ -47,6 +52,7 @@ # define MOD(a) a %= BASE # define MOD4(a) a %= BASE #endif + /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; @@ -55,9 +61,11 @@ uLong ZEXPORT adler32(adler, buf, len) { unsigned long sum2; unsigned n; + /* split Adler-32 into component sums */ sum2 = (adler >> 16) & 0xffff; adler &= 0xffff; + /* in case user likes doing a byte at a time, keep it fast */ if (len == 1) { adler += buf[0]; @@ -68,9 +76,11 @@ uLong ZEXPORT adler32(adler, buf, len) sum2 -= BASE; return adler | (sum2 << 16); } + /* initial Adler-32 value (deferred check for len == 1 speed) */ if (buf == Z_NULL) return 1L; + /* in case short lengths are provided, keep it somewhat fast */ if (len < 16) { while (len--) { @@ -82,6 +92,7 @@ uLong ZEXPORT adler32(adler, buf, len) MOD4(sum2); /* only added so many BASE's */ return adler | (sum2 << 16); } + /* do length NMAX blocks -- requires just one modulo operation */ while (len >= NMAX) { len -= NMAX; @@ -93,6 +104,7 @@ uLong ZEXPORT adler32(adler, buf, len) MOD(adler); MOD(sum2); } + /* do remaining bytes (less than NMAX, still just one modulo) */ if (len) { /* avoid modulos if none remaining */ while (len >= 16) { @@ -107,9 +119,11 @@ uLong ZEXPORT adler32(adler, buf, len) MOD(adler); MOD(sum2); } + /* return recombined sums */ return adler | (sum2 << 16); } + /* ========================================================================= */ uLong ZEXPORT adler32_combine(adler1, adler2, len2) uLong adler1; @@ -119,6 +133,7 @@ uLong ZEXPORT adler32_combine(adler1, adler2, len2) unsigned long sum1; unsigned long sum2; unsigned rem; + /* the derivation of this formula is left as an exercise for the reader */ rem = (unsigned)(len2 % BASE); sum1 = adler1 & 0xffff; |