security/nss/lib/zlib/adler32.c

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/security/nss/lib/zlib/adler32.c	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,169 @@
     1.4 +/* adler32.c -- compute the Adler-32 checksum of a data stream
     1.5 + * Copyright (C) 1995-2007 Mark Adler
     1.6 + * For conditions of distribution and use, see copyright notice in zlib.h
     1.7 + */
     1.8 +
     1.9 +/* @(#) $Id$ */
    1.10 +
    1.11 +#include "zutil.h"
    1.12 +
    1.13 +#define local static
    1.14 +
    1.15 +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2);
    1.16 +
    1.17 +#define BASE 65521UL    /* largest prime smaller than 65536 */
    1.18 +#define NMAX 5552
    1.19 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
    1.20 +
    1.21 +#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}
    1.22 +#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
    1.23 +#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
    1.24 +#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
    1.25 +#define DO16(buf)   DO8(buf,0); DO8(buf,8);
    1.26 +
    1.27 +/* use NO_DIVIDE if your processor does not do division in hardware */
    1.28 +#ifdef NO_DIVIDE
    1.29 +#  define MOD(a) \
    1.30 +    do { \
    1.31 +        if (a >= (BASE << 16)) a -= (BASE << 16); \
    1.32 +        if (a >= (BASE << 15)) a -= (BASE << 15); \
    1.33 +        if (a >= (BASE << 14)) a -= (BASE << 14); \
    1.34 +        if (a >= (BASE << 13)) a -= (BASE << 13); \
    1.35 +        if (a >= (BASE << 12)) a -= (BASE << 12); \
    1.36 +        if (a >= (BASE << 11)) a -= (BASE << 11); \
    1.37 +        if (a >= (BASE << 10)) a -= (BASE << 10); \
    1.38 +        if (a >= (BASE << 9)) a -= (BASE << 9); \
    1.39 +        if (a >= (BASE << 8)) a -= (BASE << 8); \
    1.40 +        if (a >= (BASE << 7)) a -= (BASE << 7); \
    1.41 +        if (a >= (BASE << 6)) a -= (BASE << 6); \
    1.42 +        if (a >= (BASE << 5)) a -= (BASE << 5); \
    1.43 +        if (a >= (BASE << 4)) a -= (BASE << 4); \
    1.44 +        if (a >= (BASE << 3)) a -= (BASE << 3); \
    1.45 +        if (a >= (BASE << 2)) a -= (BASE << 2); \
    1.46 +        if (a >= (BASE << 1)) a -= (BASE << 1); \
    1.47 +        if (a >= BASE) a -= BASE; \
    1.48 +    } while (0)
    1.49 +#  define MOD4(a) \
    1.50 +    do { \
    1.51 +        if (a >= (BASE << 4)) a -= (BASE << 4); \
    1.52 +        if (a >= (BASE << 3)) a -= (BASE << 3); \
    1.53 +        if (a >= (BASE << 2)) a -= (BASE << 2); \
    1.54 +        if (a >= (BASE << 1)) a -= (BASE << 1); \
    1.55 +        if (a >= BASE) a -= BASE; \
    1.56 +    } while (0)
    1.57 +#else
    1.58 +#  define MOD(a) a %= BASE
    1.59 +#  define MOD4(a) a %= BASE
    1.60 +#endif
    1.61 +
    1.62 +/* ========================================================================= */
    1.63 +uLong ZEXPORT adler32(adler, buf, len)
    1.64 +    uLong adler;
    1.65 +    const Bytef *buf;
    1.66 +    uInt len;
    1.67 +{
    1.68 +    unsigned long sum2;
    1.69 +    unsigned n;
    1.70 +
    1.71 +    /* split Adler-32 into component sums */
    1.72 +    sum2 = (adler >> 16) & 0xffff;
    1.73 +    adler &= 0xffff;
    1.74 +
    1.75 +    /* in case user likes doing a byte at a time, keep it fast */
    1.76 +    if (len == 1) {
    1.77 +        adler += buf[0];
    1.78 +        if (adler >= BASE)
    1.79 +            adler -= BASE;
    1.80 +        sum2 += adler;
    1.81 +        if (sum2 >= BASE)
    1.82 +            sum2 -= BASE;
    1.83 +        return adler | (sum2 << 16);
    1.84 +    }
    1.85 +
    1.86 +    /* initial Adler-32 value (deferred check for len == 1 speed) */
    1.87 +    if (buf == Z_NULL)
    1.88 +        return 1L;
    1.89 +
    1.90 +    /* in case short lengths are provided, keep it somewhat fast */
    1.91 +    if (len < 16) {
    1.92 +        while (len--) {
    1.93 +            adler += *buf++;
    1.94 +            sum2 += adler;
    1.95 +        }
    1.96 +        if (adler >= BASE)
    1.97 +            adler -= BASE;
    1.98 +        MOD4(sum2);             /* only added so many BASE's */
    1.99 +        return adler | (sum2 << 16);
   1.100 +    }
   1.101 +
   1.102 +    /* do length NMAX blocks -- requires just one modulo operation */
   1.103 +    while (len >= NMAX) {
   1.104 +        len -= NMAX;
   1.105 +        n = NMAX / 16;          /* NMAX is divisible by 16 */
   1.106 +        do {
   1.107 +            DO16(buf);          /* 16 sums unrolled */
   1.108 +            buf += 16;
   1.109 +        } while (--n);
   1.110 +        MOD(adler);
   1.111 +        MOD(sum2);
   1.112 +    }
   1.113 +
   1.114 +    /* do remaining bytes (less than NMAX, still just one modulo) */
   1.115 +    if (len) {                  /* avoid modulos if none remaining */
   1.116 +        while (len >= 16) {
   1.117 +            len -= 16;
   1.118 +            DO16(buf);
   1.119 +            buf += 16;
   1.120 +        }
   1.121 +        while (len--) {
   1.122 +            adler += *buf++;
   1.123 +            sum2 += adler;
   1.124 +        }
   1.125 +        MOD(adler);
   1.126 +        MOD(sum2);
   1.127 +    }
   1.128 +
   1.129 +    /* return recombined sums */
   1.130 +    return adler | (sum2 << 16);
   1.131 +}
   1.132 +
   1.133 +/* ========================================================================= */
   1.134 +local uLong adler32_combine_(adler1, adler2, len2)
   1.135 +    uLong adler1;
   1.136 +    uLong adler2;
   1.137 +    z_off64_t len2;
   1.138 +{
   1.139 +    unsigned long sum1;
   1.140 +    unsigned long sum2;
   1.141 +    unsigned rem;
   1.142 +
   1.143 +    /* the derivation of this formula is left as an exercise for the reader */
   1.144 +    rem = (unsigned)(len2 % BASE);
   1.145 +    sum1 = adler1 & 0xffff;
   1.146 +    sum2 = rem * sum1;
   1.147 +    MOD(sum2);
   1.148 +    sum1 += (adler2 & 0xffff) + BASE - 1;
   1.149 +    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
   1.150 +    if (sum1 >= BASE) sum1 -= BASE;
   1.151 +    if (sum1 >= BASE) sum1 -= BASE;
   1.152 +    if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
   1.153 +    if (sum2 >= BASE) sum2 -= BASE;
   1.154 +    return sum1 | (sum2 << 16);
   1.155 +}
   1.156 +
   1.157 +/* ========================================================================= */
   1.158 +uLong ZEXPORT adler32_combine(adler1, adler2, len2)
   1.159 +    uLong adler1;
   1.160 +    uLong adler2;
   1.161 +    z_off_t len2;
   1.162 +{
   1.163 +    return adler32_combine_(adler1, adler2, len2);
   1.164 +}
   1.165 +
   1.166 +uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
   1.167 +    uLong adler1;
   1.168 +    uLong adler2;
   1.169 +    z_off64_t len2;
   1.170 +{
   1.171 +    return adler32_combine_(adler1, adler2, len2);
   1.172 +}

mercurial