• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.5.8/lib/zlib/
1/* adler32.c -- compute the Adler-32 checksum of a data stream
2 * Copyright (C) 1995-2004 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h
4 */
5
6/* @(#) $Id: adler32.c,v 1.1.1.1 2011/06/10 09:34:40 andrew Exp $ */
7
8#include "zutil.h"
9
10#define BASE 65521UL    /* largest prime smaller than 65536 */
11#define NMAX 5552
12/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
13
14#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}
15#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
16#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
17#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
18#define DO16(buf)   DO8(buf,0); DO8(buf,8);
19
20/* use NO_DIVIDE if your processor does not do division in hardware */
21#ifdef NO_DIVIDE
22#  define MOD(a) \
23    do { \
24        if (a >= (BASE << 16)) a -= (BASE << 16); \
25        if (a >= (BASE << 15)) a -= (BASE << 15); \
26        if (a >= (BASE << 14)) a -= (BASE << 14); \
27        if (a >= (BASE << 13)) a -= (BASE << 13); \
28        if (a >= (BASE << 12)) a -= (BASE << 12); \
29        if (a >= (BASE << 11)) a -= (BASE << 11); \
30        if (a >= (BASE << 10)) a -= (BASE << 10); \
31        if (a >= (BASE << 9)) a -= (BASE << 9); \
32        if (a >= (BASE << 8)) a -= (BASE << 8); \
33        if (a >= (BASE << 7)) a -= (BASE << 7); \
34        if (a >= (BASE << 6)) a -= (BASE << 6); \
35        if (a >= (BASE << 5)) a -= (BASE << 5); \
36        if (a >= (BASE << 4)) a -= (BASE << 4); \
37        if (a >= (BASE << 3)) a -= (BASE << 3); \
38        if (a >= (BASE << 2)) a -= (BASE << 2); \
39        if (a >= (BASE << 1)) a -= (BASE << 1); \
40        if (a >= BASE) a -= BASE; \
41    } while (0)
42#  define MOD4(a) \
43    do { \
44        if (a >= (BASE << 4)) a -= (BASE << 4); \
45        if (a >= (BASE << 3)) a -= (BASE << 3); \
46        if (a >= (BASE << 2)) a -= (BASE << 2); \
47        if (a >= (BASE << 1)) a -= (BASE << 1); \
48        if (a >= BASE) a -= BASE; \
49    } while (0)
50#else
51#  define MOD(a) a %= BASE
52#  define MOD4(a) a %= BASE
53#endif
54
55/* ========================================================================= */
56uLong ZEXPORT adler32(adler, buf, len)
57    uLong adler;
58    const Bytef *buf;
59    uInt len;
60{
61    unsigned long sum2;
62    unsigned n;
63
64    /* split Adler-32 into component sums */
65    sum2 = (adler >> 16) & 0xffff;
66    adler &= 0xffff;
67
68    /* in case user likes doing a byte at a time, keep it fast */
69    if (len == 1) {
70        adler += buf[0];
71        if (adler >= BASE)
72            adler -= BASE;
73        sum2 += adler;
74        if (sum2 >= BASE)
75            sum2 -= BASE;
76        return adler | (sum2 << 16);
77    }
78
79    /* initial Adler-32 value (deferred check for len == 1 speed) */
80    if (buf == Z_NULL)
81        return 1L;
82
83    /* in case short lengths are provided, keep it somewhat fast */
84    if (len < 16) {
85        while (len--) {
86            adler += *buf++;
87            sum2 += adler;
88        }
89        if (adler >= BASE)
90            adler -= BASE;
91        MOD4(sum2);             /* only added so many BASE's */
92        return adler | (sum2 << 16);
93    }
94
95    /* do length NMAX blocks -- requires just one modulo operation */
96    while (len >= NMAX) {
97        len -= NMAX;
98        n = NMAX / 16;          /* NMAX is divisible by 16 */
99        do {
100            DO16(buf);          /* 16 sums unrolled */
101            buf += 16;
102        } while (--n);
103        MOD(adler);
104        MOD(sum2);
105    }
106
107    /* do remaining bytes (less than NMAX, still just one modulo) */
108    if (len) {                  /* avoid modulos if none remaining */
109        while (len >= 16) {
110            len -= 16;
111            DO16(buf);
112            buf += 16;
113        }
114        while (len--) {
115            adler += *buf++;
116            sum2 += adler;
117        }
118        MOD(adler);
119        MOD(sum2);
120    }
121
122    /* return recombined sums */
123    return adler | (sum2 << 16);
124}
125
126/* ========================================================================= */
127uLong ZEXPORT adler32_combine(adler1, adler2, len2)
128    uLong adler1;
129    uLong adler2;
130    z_off_t len2;
131{
132    unsigned long sum1;
133    unsigned long sum2;
134    unsigned rem;
135
136    /* the derivation of this formula is left as an exercise for the reader */
137    rem = (unsigned)(len2 % BASE);
138    sum1 = adler1 & 0xffff;
139    sum2 = rem * sum1;
140    MOD(sum2);
141    sum1 += (adler2 & 0xffff) + BASE - 1;
142    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
143    if (sum1 > BASE) sum1 -= BASE;
144    if (sum1 > BASE) sum1 -= BASE;
145    if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
146    if (sum2 > BASE) sum2 -= BASE;
147    return sum1 | (sum2 << 16);
148}
149