Hex Artifact Content

Not logged in

Artifact d2f93402a7ab9a347c7927620bea0f737a523774:


0000: 2f 2a 20 61 64 6c 65 72 33 32 2e 63 20 2d 2d 20  /* adler32.c -- 
0010: 63 6f 6d 70 75 74 65 20 74 68 65 20 41 64 6c 65  compute the Adle
0020: 72 2d 33 32 20 63 68 65 63 6b 73 75 6d 20 6f 66  r-32 checksum of
0030: 20 61 20 64 61 74 61 20 73 74 72 65 61 6d 0a 20   a data stream. 
0040: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20  * Copyright (C) 
0050: 31 39 39 35 2d 31 39 39 38 20 4d 61 72 6b 20 41  1995-1998 Mark A
0060: 64 6c 65 72 0a 20 2a 20 46 6f 72 20 63 6f 6e 64  dler. * For cond
0070: 69 74 69 6f 6e 73 20 6f 66 20 64 69 73 74 72 69  itions of distri
0080: 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 2c 20  bution and use, 
0090: 73 65 65 20 63 6f 70 79 72 69 67 68 74 20 6e 6f  see copyright no
00a0: 74 69 63 65 20 69 6e 20 7a 6c 69 62 2e 68 20 0a  tice in zlib.h .
00b0: 20 2a 2f 0a 0a 2f 2a 20 40 28 23 29 20 24 49 64   */../* @(#) $Id
00c0: 24 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22  $ */..#include "
00d0: 7a 6c 69 62 2e 68 22 0a 0a 23 64 65 66 69 6e 65  zlib.h"..#define
00e0: 20 42 41 53 45 20 36 35 35 32 31 4c 20 2f 2a 20   BASE 65521L /* 
00f0: 6c 61 72 67 65 73 74 20 70 72 69 6d 65 20 73 6d  largest prime sm
0100: 61 6c 6c 65 72 20 74 68 61 6e 20 36 35 35 33 36  aller than 65536
0110: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4d 41 58   */.#define NMAX
0120: 20 35 35 35 32 0a 2f 2a 20 4e 4d 41 58 20 69 73   5552./* NMAX is
0130: 20 74 68 65 20 6c 61 72 67 65 73 74 20 6e 20 73   the largest n s
0140: 75 63 68 20 74 68 61 74 20 32 35 35 6e 28 6e 2b  uch that 255n(n+
0150: 31 29 2f 32 20 2b 20 28 6e 2b 31 29 28 42 41 53  1)/2 + (n+1)(BAS
0160: 45 2d 31 29 20 3c 3d 20 32 5e 33 32 2d 31 20 2a  E-1) <= 2^32-1 *
0170: 2f 0a 0a 23 64 65 66 69 6e 65 20 44 4f 31 28 62  /..#define DO1(b
0180: 75 66 2c 69 29 20 20 7b 73 31 20 2b 3d 20 62 75  uf,i)  {s1 += bu
0190: 66 5b 69 5d 3b 20 73 32 20 2b 3d 20 73 31 3b 7d  f[i]; s2 += s1;}
01a0: 0a 23 64 65 66 69 6e 65 20 44 4f 32 28 62 75 66  .#define DO2(buf
01b0: 2c 69 29 20 20 44 4f 31 28 62 75 66 2c 69 29 3b  ,i)  DO1(buf,i);
01c0: 20 44 4f 31 28 62 75 66 2c 69 2b 31 29 3b 0a 23   DO1(buf,i+1);.#
01d0: 64 65 66 69 6e 65 20 44 4f 34 28 62 75 66 2c 69  define DO4(buf,i
01e0: 29 20 20 44 4f 32 28 62 75 66 2c 69 29 3b 20 44  )  DO2(buf,i); D
01f0: 4f 32 28 62 75 66 2c 69 2b 32 29 3b 0a 23 64 65  O2(buf,i+2);.#de
0200: 66 69 6e 65 20 44 4f 38 28 62 75 66 2c 69 29 20  fine DO8(buf,i) 
0210: 20 44 4f 34 28 62 75 66 2c 69 29 3b 20 44 4f 34   DO4(buf,i); DO4
0220: 28 62 75 66 2c 69 2b 34 29 3b 0a 23 64 65 66 69  (buf,i+4);.#defi
0230: 6e 65 20 44 4f 31 36 28 62 75 66 29 20 20 20 44  ne DO16(buf)   D
0240: 4f 38 28 62 75 66 2c 30 29 3b 20 44 4f 38 28 62  O8(buf,0); DO8(b
0250: 75 66 2c 38 29 3b 0a 0a 2f 2a 20 3d 3d 3d 3d 3d  uf,8);../* =====
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
02a0: 3d 3d 3d 3d 20 2a 2f 0a 75 4c 6f 6e 67 20 5a 45  ==== */.uLong ZE
02b0: 58 50 4f 52 54 20 61 64 6c 65 72 33 32 28 61 64  XPORT adler32(ad
02c0: 6c 65 72 2c 20 62 75 66 2c 20 6c 65 6e 29 0a 20  ler, buf, len). 
02d0: 20 20 20 75 4c 6f 6e 67 20 61 64 6c 65 72 3b 0a     uLong adler;.
02e0: 20 20 20 20 63 6f 6e 73 74 20 42 79 74 65 66 20      const Bytef 
02f0: 2a 62 75 66 3b 0a 20 20 20 20 75 49 6e 74 20 6c  *buf;.    uInt l
0300: 65 6e 3b 0a 7b 0a 20 20 20 20 75 6e 73 69 67 6e  en;.{.    unsign
0310: 65 64 20 6c 6f 6e 67 20 73 31 20 3d 20 61 64 6c  ed long s1 = adl
0320: 65 72 20 26 20 30 78 66 66 66 66 3b 0a 20 20 20  er & 0xffff;.   
0330: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73   unsigned long s
0340: 32 20 3d 20 28 61 64 6c 65 72 20 3e 3e 20 31 36  2 = (adler >> 16
0350: 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 20 20  ) & 0xffff;.    
0360: 69 6e 74 20 6b 3b 0a 0a 20 20 20 20 69 66 20 28  int k;..    if (
0370: 62 75 66 20 3d 3d 20 5a 5f 4e 55 4c 4c 29 20 72  buf == Z_NULL) r
0380: 65 74 75 72 6e 20 31 4c 3b 0a 0a 20 20 20 20 77  eturn 1L;..    w
0390: 68 69 6c 65 20 28 6c 65 6e 20 3e 20 30 29 20 7b  hile (len > 0) {
03a0: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 6c 65 6e  .        k = len
03b0: 20 3c 20 4e 4d 41 58 20 3f 20 6c 65 6e 20 3a 20   < NMAX ? len : 
03c0: 4e 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 6c 65  NMAX;.        le
03d0: 6e 20 2d 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  n -= k;.        
03e0: 77 68 69 6c 65 20 28 6b 20 3e 3d 20 31 36 29 20  while (k >= 16) 
03f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 44 4f  {.            DO
0400: 31 36 28 62 75 66 29 3b 0a 09 20 20 20 20 62 75  16(buf);..    bu
0410: 66 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 20  f += 16;.       
0420: 20 20 20 20 20 6b 20 2d 3d 20 31 36 3b 0a 20 20       k -= 16;.  
0430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0440: 69 66 20 28 6b 20 21 3d 20 30 29 20 64 6f 20 7b  if (k != 0) do {
0450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 31 20  .            s1 
0460: 2b 3d 20 2a 62 75 66 2b 2b 3b 0a 09 20 20 20 20  += *buf++;..    
0470: 73 32 20 2b 3d 20 73 31 3b 0a 20 20 20 20 20 20  s2 += s1;.      
0480: 20 20 7d 20 77 68 69 6c 65 20 28 2d 2d 6b 29 3b    } while (--k);
0490: 0a 20 20 20 20 20 20 20 20 73 31 20 25 3d 20 42  .        s1 %= B
04a0: 41 53 45 3b 0a 20 20 20 20 20 20 20 20 73 32 20  ASE;.        s2 
04b0: 25 3d 20 42 41 53 45 3b 0a 20 20 20 20 7d 0a 20  %= BASE;.    }. 
04c0: 20 20 20 72 65 74 75 72 6e 20 28 73 32 20 3c 3c     return (s2 <<
04d0: 20 31 36 29 20 7c 20 73 31 3b 0a 7d 0a            16) | s1;.}.