"Fossies" - the Fresh Open Source Software Archive

Member "zsync-0.6.2/zlib/adler32.c" (16 Sep 2010, 2237 Bytes) of package /linux/privat/old/zsync-0.6.2.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "adler32.c" see the Fossies "Dox" file reference documentation.

    1 /* adler32.c -- compute the Adler-32 checksum of a data stream
    2  * Copyright (C) 1995-2003 Mark Adler
    3  * For conditions of distribution and use, see copyright notice in zlib.h
    4  */
    5 
    6 /* @(#) $Id$ */
    7 
    8 #define ZLIB_INTERNAL
    9 #include "zlib.h"
   10 
   11 #define BASE 65521UL    /* largest prime smaller than 65536 */
   12 #define NMAX 5552
   13 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
   14 
   15 #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
   16 #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
   17 #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
   18 #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
   19 #define DO16(buf)   DO8(buf,0); DO8(buf,8);
   20 
   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 #else
   43 #  define MOD(a) a %= BASE
   44 #endif
   45 
   46 /* ========================================================================= */
   47 uLong ZEXPORT adler32(adler, buf, len)
   48     uLong adler;
   49     const Bytef *buf;
   50     uInt len;
   51 {
   52     unsigned long s1 = adler & 0xffff;
   53     unsigned long s2 = (adler >> 16) & 0xffff;
   54     int k;
   55 
   56     if (buf == Z_NULL) return 1L;
   57 
   58     while (len > 0) {
   59         k = len < NMAX ? (int)len : NMAX;
   60         len -= k;
   61         while (k >= 16) {
   62             DO16(buf);
   63             buf += 16;
   64             k -= 16;
   65         }
   66         if (k != 0) do {
   67             s1 += *buf++;
   68             s2 += s1;
   69         } while (--k);
   70         MOD(s1);
   71         MOD(s2);
   72     }
   73     return (s2 << 16) | s1;
   74 }