MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/SPlisHSPlasH / adler32_z

Function adler32_z

extern/zlib/src/adler32.c:61–125  ·  view source on GitHub ↗

========================================================================= */

Source from the content-addressed store, hash-verified

59
60/* ========================================================================= */
61uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) {
62 unsigned long sum2;
63 unsigned n;
64
65 /* split Adler-32 into component sums */
66 sum2 = (adler >> 16) & 0xffff;
67 adler &= 0xffff;
68
69 /* in case user likes doing a byte at a time, keep it fast */
70 if (len == 1) {
71 adler += buf[0];
72 if (adler >= BASE)
73 adler -= BASE;
74 sum2 += adler;
75 if (sum2 >= BASE)
76 sum2 -= BASE;
77 return adler | (sum2 << 16);
78 }
79
80 /* initial Adler-32 value (deferred check for len == 1 speed) */
81 if (buf == Z_NULL)
82 return 1L;
83
84 /* in case short lengths are provided, keep it somewhat fast */
85 if (len < 16) {
86 while (len--) {
87 adler += *buf++;
88 sum2 += adler;
89 }
90 if (adler >= BASE)
91 adler -= BASE;
92 MOD28(sum2); /* only added so many BASE's */
93 return adler | (sum2 << 16);
94 }
95
96 /* do length NMAX blocks -- requires just one modulo operation */
97 while (len >= NMAX) {
98 len -= NMAX;
99 n = NMAX / 16; /* NMAX is divisible by 16 */
100 do {
101 DO16(buf); /* 16 sums unrolled */
102 buf += 16;
103 } while (--n);
104 MOD(adler);
105 MOD(sum2);
106 }
107
108 /* do remaining bytes (less than NMAX, still just one modulo) */
109 if (len) { /* avoid modulos if none remaining */
110 while (len >= 16) {
111 len -= 16;
112 DO16(buf);
113 buf += 16;
114 }
115 while (len--) {
116 adler += *buf++;
117 sum2 += adler;
118 }

Callers 1

adler32Function · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected