Blame


1 b6afd33e 2003-11-23 devnull #include <u.h>
2 b6afd33e 2003-11-23 devnull #include <libc.h>
3 b6afd33e 2003-11-23 devnull #include <flate.h>
4 b6afd33e 2003-11-23 devnull
5 b6afd33e 2003-11-23 devnull enum
6 b6afd33e 2003-11-23 devnull {
7 b6afd33e 2003-11-23 devnull ADLERITERS = 5552, /* max iters before can overflow 32 bits */
8 b6afd33e 2003-11-23 devnull ADLERBASE = 65521 /* largest prime smaller than 65536 */
9 b6afd33e 2003-11-23 devnull };
10 b6afd33e 2003-11-23 devnull
11 9a054520 2010-02-08 rsc uint32
12 9a054520 2010-02-08 rsc adler32(uint32 adler, void *vbuf, int n)
13 b6afd33e 2003-11-23 devnull {
14 9a054520 2010-02-08 rsc uint32 s1, s2;
15 b6afd33e 2003-11-23 devnull uchar *buf, *ebuf;
16 b6afd33e 2003-11-23 devnull int m;
17 b6afd33e 2003-11-23 devnull
18 b6afd33e 2003-11-23 devnull buf = vbuf;
19 b6afd33e 2003-11-23 devnull s1 = adler & 0xffff;
20 b6afd33e 2003-11-23 devnull s2 = (adler >> 16) & 0xffff;
21 b6afd33e 2003-11-23 devnull for(; n >= 16; n -= m){
22 b6afd33e 2003-11-23 devnull m = n;
23 b6afd33e 2003-11-23 devnull if(m > ADLERITERS)
24 b6afd33e 2003-11-23 devnull m = ADLERITERS;
25 b6afd33e 2003-11-23 devnull m &= ~15;
26 b6afd33e 2003-11-23 devnull for(ebuf = buf + m; buf < ebuf; buf += 16){
27 b6afd33e 2003-11-23 devnull s1 += buf[0];
28 b6afd33e 2003-11-23 devnull s2 += s1;
29 b6afd33e 2003-11-23 devnull s1 += buf[1];
30 b6afd33e 2003-11-23 devnull s2 += s1;
31 b6afd33e 2003-11-23 devnull s1 += buf[2];
32 b6afd33e 2003-11-23 devnull s2 += s1;
33 b6afd33e 2003-11-23 devnull s1 += buf[3];
34 b6afd33e 2003-11-23 devnull s2 += s1;
35 b6afd33e 2003-11-23 devnull s1 += buf[4];
36 b6afd33e 2003-11-23 devnull s2 += s1;
37 b6afd33e 2003-11-23 devnull s1 += buf[5];
38 b6afd33e 2003-11-23 devnull s2 += s1;
39 b6afd33e 2003-11-23 devnull s1 += buf[6];
40 b6afd33e 2003-11-23 devnull s2 += s1;
41 b6afd33e 2003-11-23 devnull s1 += buf[7];
42 b6afd33e 2003-11-23 devnull s2 += s1;
43 b6afd33e 2003-11-23 devnull s1 += buf[8];
44 b6afd33e 2003-11-23 devnull s2 += s1;
45 b6afd33e 2003-11-23 devnull s1 += buf[9];
46 b6afd33e 2003-11-23 devnull s2 += s1;
47 b6afd33e 2003-11-23 devnull s1 += buf[10];
48 b6afd33e 2003-11-23 devnull s2 += s1;
49 b6afd33e 2003-11-23 devnull s1 += buf[11];
50 b6afd33e 2003-11-23 devnull s2 += s1;
51 b6afd33e 2003-11-23 devnull s1 += buf[12];
52 b6afd33e 2003-11-23 devnull s2 += s1;
53 b6afd33e 2003-11-23 devnull s1 += buf[13];
54 b6afd33e 2003-11-23 devnull s2 += s1;
55 b6afd33e 2003-11-23 devnull s1 += buf[14];
56 b6afd33e 2003-11-23 devnull s2 += s1;
57 b6afd33e 2003-11-23 devnull s1 += buf[15];
58 b6afd33e 2003-11-23 devnull s2 += s1;
59 b6afd33e 2003-11-23 devnull }
60 b6afd33e 2003-11-23 devnull s1 %= ADLERBASE;
61 b6afd33e 2003-11-23 devnull s2 %= ADLERBASE;
62 b6afd33e 2003-11-23 devnull }
63 b6afd33e 2003-11-23 devnull if(n){
64 b6afd33e 2003-11-23 devnull for(ebuf = buf + n; buf < ebuf; buf++){
65 b6afd33e 2003-11-23 devnull s1 += buf[0];
66 b6afd33e 2003-11-23 devnull s2 += s1;
67 b6afd33e 2003-11-23 devnull }
68 b6afd33e 2003-11-23 devnull s1 %= ADLERBASE;
69 b6afd33e 2003-11-23 devnull s2 %= ADLERBASE;
70 b6afd33e 2003-11-23 devnull }
71 b6afd33e 2003-11-23 devnull return (s2 << 16) + s1;
72 b6afd33e 2003-11-23 devnull }