File indexing completed on 2025-05-11 08:24:10
0001
0002
0003
0004
0005
0006
0007
0008 #include "zutil.h"
0009
0010 local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
0011
0012 #define BASE 65521U
0013 #define NMAX 5552
0014
0015
0016 #define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
0017 #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
0018 #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
0019 #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
0020 #define DO16(buf) DO8(buf,0); DO8(buf,8);
0021
0022
0023
0024 #ifdef NO_DIVIDE
0025
0026
0027 # define CHOP(a) \
0028 do { \
0029 unsigned long tmp = a >> 16; \
0030 a &= 0xffffUL; \
0031 a += (tmp << 4) - tmp; \
0032 } while (0)
0033 # define MOD28(a) \
0034 do { \
0035 CHOP(a); \
0036 if (a >= BASE) a -= BASE; \
0037 } while (0)
0038 # define MOD(a) \
0039 do { \
0040 CHOP(a); \
0041 MOD28(a); \
0042 } while (0)
0043 # define MOD63(a) \
0044 do { \
0045 z_off64_t tmp = a >> 32; \
0046 a &= 0xffffffffL; \
0047 a += (tmp << 8) - (tmp << 5) + tmp; \
0048 tmp = a >> 16; \
0049 a &= 0xffffL; \
0050 a += (tmp << 4) - tmp; \
0051 tmp = a >> 16; \
0052 a &= 0xffffL; \
0053 a += (tmp << 4) - tmp; \
0054 if (a >= BASE) a -= BASE; \
0055 } while (0)
0056 #else
0057 # define MOD(a) a %= BASE
0058 # define MOD28(a) a %= BASE
0059 # define MOD63(a) a %= BASE
0060 #endif
0061
0062
0063 uLong ZEXPORT adler32_z(adler, buf, len)
0064 uLong adler;
0065 const Bytef *buf;
0066 z_size_t len;
0067 {
0068 unsigned long sum2;
0069 unsigned n;
0070
0071
0072 sum2 = (adler >> 16) & 0xffff;
0073 adler &= 0xffff;
0074
0075
0076 if (len == 1) {
0077 adler += buf[0];
0078 if (adler >= BASE)
0079 adler -= BASE;
0080 sum2 += adler;
0081 if (sum2 >= BASE)
0082 sum2 -= BASE;
0083 return adler | (sum2 << 16);
0084 }
0085
0086
0087 if (buf == Z_NULL)
0088 return 1L;
0089
0090
0091 if (len < 16) {
0092 while (len--) {
0093 adler += *buf++;
0094 sum2 += adler;
0095 }
0096 if (adler >= BASE)
0097 adler -= BASE;
0098 MOD28(sum2);
0099 return adler | (sum2 << 16);
0100 }
0101
0102
0103 while (len >= NMAX) {
0104 len -= NMAX;
0105 n = NMAX / 16;
0106 do {
0107 DO16(buf);
0108 buf += 16;
0109 } while (--n);
0110 MOD(adler);
0111 MOD(sum2);
0112 }
0113
0114
0115 if (len) {
0116 while (len >= 16) {
0117 len -= 16;
0118 DO16(buf);
0119 buf += 16;
0120 }
0121 while (len--) {
0122 adler += *buf++;
0123 sum2 += adler;
0124 }
0125 MOD(adler);
0126 MOD(sum2);
0127 }
0128
0129
0130 return adler | (sum2 << 16);
0131 }
0132
0133
0134 uLong ZEXPORT adler32(adler, buf, len)
0135 uLong adler;
0136 const Bytef *buf;
0137 uInt len;
0138 {
0139 return adler32_z(adler, buf, len);
0140 }
0141
0142
0143 local uLong adler32_combine_(adler1, adler2, len2)
0144 uLong adler1;
0145 uLong adler2;
0146 z_off64_t len2;
0147 {
0148 unsigned long sum1;
0149 unsigned long sum2;
0150 unsigned rem;
0151
0152
0153 if (len2 < 0)
0154 return 0xffffffffUL;
0155
0156
0157 MOD63(len2);
0158 rem = (unsigned)len2;
0159 sum1 = adler1 & 0xffff;
0160 sum2 = rem * sum1;
0161 MOD(sum2);
0162 sum1 += (adler2 & 0xffff) + BASE - 1;
0163 sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
0164 if (sum1 >= BASE) sum1 -= BASE;
0165 if (sum1 >= BASE) sum1 -= BASE;
0166 if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
0167 if (sum2 >= BASE) sum2 -= BASE;
0168 return sum1 | (sum2 << 16);
0169 }
0170
0171
0172 uLong ZEXPORT adler32_combine(adler1, adler2, len2)
0173 uLong adler1;
0174 uLong adler2;
0175 z_off_t len2;
0176 {
0177 return adler32_combine_(adler1, adler2, len2);
0178 }
0179
0180 uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
0181 uLong adler1;
0182 uLong adler2;
0183 z_off64_t len2;
0184 {
0185 return adler32_combine_(adler1, adler2, len2);
0186 }