adler32.c
上传用户:hmc_gdtv
上传日期:2013-08-04
资源大小:798k
文件大小:2k
源码类别:

Windows Mobile

开发平台:

Visual C++

  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. /* @(#) $Id: adler32.c,v 1.5.4.1 2005/06/18 16:36:07 mike Exp $ */
  6. #define ZLIB_INTERNAL
  7. #include "zlib.h"
  8. #define BASE 65521UL    /* largest prime smaller than 65536 */
  9. #define NMAX 5552
  10. /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
  11. #define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
  12. #define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
  13. #define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
  14. #define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
  15. #define DO16(buf)   DO8(buf,0); DO8(buf,8);
  16. #ifdef NO_DIVIDE
  17. #  define MOD(a) 
  18.     do { 
  19.         if (a >= (BASE << 16)) a -= (BASE << 16); 
  20.         if (a >= (BASE << 15)) a -= (BASE << 15); 
  21.         if (a >= (BASE << 14)) a -= (BASE << 14); 
  22.         if (a >= (BASE << 13)) a -= (BASE << 13); 
  23.         if (a >= (BASE << 12)) a -= (BASE << 12); 
  24.         if (a >= (BASE << 11)) a -= (BASE << 11); 
  25.         if (a >= (BASE << 10)) a -= (BASE << 10); 
  26.         if (a >= (BASE << 9)) a -= (BASE << 9); 
  27.         if (a >= (BASE << 8)) a -= (BASE << 8); 
  28.         if (a >= (BASE << 7)) a -= (BASE << 7); 
  29.         if (a >= (BASE << 6)) a -= (BASE << 6); 
  30.         if (a >= (BASE << 5)) a -= (BASE << 5); 
  31.         if (a >= (BASE << 4)) a -= (BASE << 4); 
  32.         if (a >= (BASE << 3)) a -= (BASE << 3); 
  33.         if (a >= (BASE << 2)) a -= (BASE << 2); 
  34.         if (a >= (BASE << 1)) a -= (BASE << 1); 
  35.         if (a >= BASE) a -= BASE; 
  36.     } while (0)
  37. #else
  38. #  define MOD(a) a %= BASE
  39. #endif
  40. /* ========================================================================= */
  41. uLong ZEXPORT adler32(adler, buf, len)
  42.     uLong adler;
  43.     const Bytef *buf;
  44.     uInt len;
  45. {
  46.     unsigned long s1 = adler & 0xffff;
  47.     unsigned long s2 = (adler >> 16) & 0xffff;
  48.     int k;
  49.     if (buf == Z_NULL) return 1L;
  50.     while (len > 0) {
  51.         k = len < NMAX ? (int)len : NMAX;
  52.         len -= k;
  53.         while (k >= 16) {
  54.             DO16(buf);
  55.             buf += 16;
  56.             k -= 16;
  57.         }
  58.         if (k != 0) do {
  59.             s1 += *buf++;
  60.             s2 += s1;
  61.         } while (--k);
  62.         MOD(s1);
  63.         MOD(s2);
  64.     }
  65.     return (s2 << 16) | s1;
  66. }