Back to index

lightning-sunbird  0.9+nobinonly
Defines | Functions
adler32.c File Reference
#include "zlib.h"

Go to the source code of this file.

Defines

#define ZLIB_INTERNAL
#define BASE   65521UL /* largest prime smaller than 65536 */
#define NMAX   5552
#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);
#define MOD(a)   a %= BASE
#define MOD4(a)   a %= BASE

Functions

uLong ZEXPORT adler32 (uLong adler, const Bytef *buf, uInt len)
uLong ZEXPORT adler32_combine (uLong adler1, uLong adler2, z_off_t len2)

Define Documentation

#define BASE   65521UL /* largest prime smaller than 65536 */

Definition at line 11 of file adler32.c.

#define DO1 (   buf,
  i 
)    {adler += (buf)[i]; sum2 += adler;}

Definition at line 15 of file adler32.c.

#define DO16 (   buf)    DO8(buf,0); DO8(buf,8);

Definition at line 19 of file adler32.c.

#define DO2 (   buf,
  i 
)    DO1(buf,i); DO1(buf,i+1);

Definition at line 16 of file adler32.c.

#define DO4 (   buf,
  i 
)    DO2(buf,i); DO2(buf,i+2);

Definition at line 17 of file adler32.c.

#define DO8 (   buf,
  i 
)    DO4(buf,i); DO4(buf,i+4);

Definition at line 18 of file adler32.c.

#define MOD (   a)    a %= BASE

Definition at line 52 of file adler32.c.

#define MOD4 (   a)    a %= BASE

Definition at line 53 of file adler32.c.

#define NMAX   5552

Definition at line 12 of file adler32.c.

Definition at line 8 of file adler32.c.


Function Documentation

uLong ZEXPORT adler32 ( uLong  adler,
const Bytef buf,
uInt  len 
)

Definition at line 57 of file adler32.c.

{
    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];
        if (adler >= BASE)
            adler -= BASE;
        sum2 += adler;
        if (sum2 >= BASE)
            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--) {
            adler += *buf++;
            sum2 += adler;
        }
        if (adler >= BASE)
            adler -= BASE;
        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;
        n = NMAX / 16;          /* NMAX is divisible by 16 */
        do {
            DO16(buf);          /* 16 sums unrolled */
            buf += 16;
        } while (--n);
        MOD(adler);
        MOD(sum2);
    }

    /* do remaining bytes (less than NMAX, still just one modulo) */
    if (len) {                  /* avoid modulos if none remaining */
        while (len >= 16) {
            len -= 16;
            DO16(buf);
            buf += 16;
        }
        while (len--) {
            adler += *buf++;
            sum2 += adler;
        }
        MOD(adler);
        MOD(sum2);
    }

    /* return recombined sums */
    return adler | (sum2 << 16);
}
uLong ZEXPORT adler32_combine ( uLong  adler1,
uLong  adler2,
z_off_t  len2 
)

Definition at line 128 of file adler32.c.

{
    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;
    sum2 = rem * sum1;
    MOD(sum2);
    sum1 += (adler2 & 0xffff) + BASE - 1;
    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
    if (sum1 > BASE) sum1 -= BASE;
    if (sum1 > BASE) sum1 -= BASE;
    if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
    if (sum2 > BASE) sum2 -= BASE;
    return sum1 | (sum2 << 16);
}