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