"Fossies" - the Fresh Open Source Software Archive

Member "mirrordir-0.10.49/zlib/adler32.c" (23 Nov 1999, 1245 Bytes) of package /linux/misc/old/mirrordir-0.10.49.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-1998 Mark Adler
    3  * For conditions of distribution and use, see copyright notice in zlib.h 
    4  */
    5 
    6 /* @(#) $Id$ */
    7 
    8 #include "zlib.h"
    9 
   10 #define BASE 65521L /* 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)  {s1 += buf[i]; s2 += s1;}
   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 /* ========================================================================= */
   21 uLong ZEXPORT adler32(adler, buf, len)
   22     uLong adler;
   23     const Bytef *buf;
   24     uInt len;
   25 {
   26     unsigned long s1 = adler & 0xffff;
   27     unsigned long s2 = (adler >> 16) & 0xffff;
   28     int k;
   29 
   30     if (buf == Z_NULL) return 1L;
   31 
   32     while (len > 0) {
   33         k = len < NMAX ? len : NMAX;
   34         len -= k;
   35         while (k >= 16) {
   36             DO16(buf);
   37         buf += 16;
   38             k -= 16;
   39         }
   40         if (k != 0) do {
   41             s1 += *buf++;
   42         s2 += s1;
   43         } while (--k);
   44         s1 %= BASE;
   45         s2 %= BASE;
   46     }
   47     return (s2 << 16) | s1;
   48 }