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;.}.