COSMOS core  1.0.2 (beta)
Comprehensive Open-architecture Solution for Mission Operations Systems
adler32.c File Reference
#include "zutil.h"
Include dependency graph for adler32.c:

Macros

#define local   static
 
#define BASE   65521 /* largest prime smaller than 65536 */
 
#define NMAX   5552
 
#define DO1(buf, i)   {adler += (buf)[i]; sum2 += adler;}
 
#define DO2(buf, i)   DO1(buf,i); DO1(buf,i+1);
 
#define DO4(buf, i)   DO2(buf,i); DO2(buf,i+2);
 
#define DO8(buf, i)   DO4(buf,i); DO4(buf,i+4);
 
#define DO16(buf)   DO8(buf,0); DO8(buf,8);
 
#define MOD(a)   a %= BASE
 
#define MOD28(a)   a %= BASE
 
#define MOD63(a)   a %= BASE
 

Functions

static uLong adler32_combine_ OF ((uLong adler1, uLong adler2, z_off64_t len2))
 
uLong ZEXPORT adler32 (uLong adler, const Bytef *buf, uInt len)
 
static uLong adler32_combine_ (uLong adler1, uLong adler2, z_off64_t len2)
 
uLong ZEXPORT adler32_combine (uLong adler1, uLong adler2, z_off_t len2)
 
uLong ZEXPORT adler32_combine64 (uLong adler1, uLong adler2, z_off64_t len2)
 

Macro Definition Documentation

#define local   static
#define BASE   65521 /* largest prime smaller than 65536 */
#define NMAX   5552
#define DO1 (   buf,
  i 
)    {adler += (buf)[i]; sum2 += adler;}
#define DO2 (   buf,
  i 
)    DO1(buf,i); DO1(buf,i+1);
#define DO4 (   buf,
  i 
)    DO2(buf,i); DO2(buf,i+2);
#define DO8 (   buf,
  i 
)    DO4(buf,i); DO4(buf,i+4);
#define DO16 (   buf)    DO8(buf,0); DO8(buf,8);
#define MOD (   a)    a %= BASE
#define MOD28 (   a)    a %= BASE
#define MOD63 (   a)    a %= BASE

Function Documentation

static uLong adler32_combine_ OF ( (uLong adler1, uLong adler2, z_off64_t len2)  )
static
uLong ZEXPORT adler32 ( uLong  adler,
const Bytef buf,
uInt  len 
)
69 {
70  unsigned long sum2;
71  unsigned n;
72 
73  /* split Adler-32 into component sums */
74  sum2 = (adler >> 16) & 0xffff;
75  adler &= 0xffff;
76 
77  /* in case user likes doing a byte at a time, keep it fast */
78  if (len == 1) {
79  adler += buf[0];
80  if (adler >= BASE)
81  adler -= BASE;
82  sum2 += adler;
83  if (sum2 >= BASE)
84  sum2 -= BASE;
85  return adler | (sum2 << 16);
86  }
87 
88  /* initial Adler-32 value (deferred check for len == 1 speed) */
89  if (buf == Z_NULL)
90  return 1L;
91 
92  /* in case short lengths are provided, keep it somewhat fast */
93  if (len < 16) {
94  while (len--) {
95  adler += *buf++;
96  sum2 += adler;
97  }
98  if (adler >= BASE)
99  adler -= BASE;
100  MOD28(sum2); /* only added so many BASE's */
101  return adler | (sum2 << 16);
102  }
103 
104  /* do length NMAX blocks -- requires just one modulo operation */
105  while (len >= NMAX) {
106  len -= NMAX;
107  n = NMAX / 16; /* NMAX is divisible by 16 */
108  do {
109  DO16(buf); /* 16 sums unrolled */
110  buf += 16;
111  } while (--n);
112  MOD(adler);
113  MOD(sum2);
114  }
115 
116  /* do remaining bytes (less than NMAX, still just one modulo) */
117  if (len) { /* avoid modulos if none remaining */
118  while (len >= 16) {
119  len -= 16;
120  DO16(buf);
121  buf += 16;
122  }
123  while (len--) {
124  adler += *buf++;
125  sum2 += adler;
126  }
127  MOD(adler);
128  MOD(sum2);
129  }
130 
131  /* return recombined sums */
132  return adler | (sum2 << 16);
133 }
#define MOD(a)
Definition: adler32.c:59
#define DO16(buf)
Definition: adler32.c:22
#define BASE
Definition: adler32.c:14
#define NMAX
Definition: adler32.c:15
#define MOD28(a)
Definition: adler32.c:60
char buf[128]
Definition: rw_test.cpp:40
#define Z_NULL
Definition: zlib.h:208
png_uint_32 adler
Definition: png.c:2173
static uLong adler32_combine_ ( uLong  adler1,
uLong  adler2,
z_off64_t  len2 
)
static
140 {
141  unsigned long sum1;
142  unsigned long sum2;
143  unsigned rem;
144 
145  /* for negative len, return invalid adler32 as a clue for debugging */
146  if (len2 < 0)
147  return 0xffffffffUL;
148 
149  /* the derivation of this formula is left as an exercise for the reader */
150  MOD63(len2); /* assumes len2 >= 0 */
151  rem = (unsigned)len2;
152  sum1 = adler1 & 0xffff;
153  sum2 = rem * sum1;
154  MOD(sum2);
155  sum1 += (adler2 & 0xffff) + BASE - 1;
156  sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
157  if (sum1 >= BASE) sum1 -= BASE;
158  if (sum1 >= BASE) sum1 -= BASE;
159  if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
160  if (sum2 >= BASE) sum2 -= BASE;
161  return sum1 | (sum2 << 16);
162 }
#define MOD(a)
Definition: adler32.c:59
#define BASE
Definition: adler32.c:14
#define MOD63(a)
Definition: adler32.c:61
uLong ZEXPORT adler32_combine ( uLong  adler1,
uLong  adler2,
z_off_t  len2 
)
169 {
170  return adler32_combine_(adler1, adler2, len2);
171 }
static uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2)
Definition: adler32.c:136
uLong ZEXPORT adler32_combine64 ( uLong  adler1,
uLong  adler2,
z_off64_t  len2 
)
177 {
178  return adler32_combine_(adler1, adler2, len2);
179 }
static uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2)
Definition: adler32.c:136