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