1#ifndef __XRDCKSCALCADLER32_HH__
2#define __XRDCKSCALCADLER32_HH__
34#include <netinet/in.h>
76#define DO1(buf) {unSum1 += *buf++; unSum2 += unSum1;}
77#define DO2(buf) DO1(buf); DO1(buf);
78#define DO4(buf) DO2(buf); DO2(buf);
79#define DO8(buf) DO4(buf); DO4(buf);
80#define DO16(buf) DO8(buf); DO8(buf);
88const char*
Combine(
const char *Cksum,
int DLen)
override
89 {uint32_t adler2 = getCS(Cksum);
90 uint32_t adler1 = (unSum2 << 16) | unSum1;
91 uLong newcs = adler32_combine(adler1, adler2, DLen);
92 unSum1 = newcs & 0xffff;
93 unSum2 = (newcs >> 16) & 0xffff;
97const char*
Combine(
const char* Cksum1,
const char* Cksum2,
int DLen)
override
98 {uint32_t adler1 = getCS(Cksum1);
99 uint32_t adler2 = getCS(Cksum2);
100 AdlerValue = (uint32_t)adler32_combine(adler1, adler2, DLen);
101#ifndef Xrd_Big_Endian
102 AdlerValue = htonl(AdlerValue);
104 return (
const char *)&AdlerValue;
108 {AdlerValue = (unSum2 << 16) | unSum1;
109#ifndef Xrd_Big_Endian
110 AdlerValue = htonl(AdlerValue);
112 return (
char *)&AdlerValue;
115void Init()
override {unSum1 = AdlerStart; unSum2 = 0;}
119void Update(
const char *Buff,
int BLen)
override
121 unsigned char *buff = (
unsigned char *)Buff;
123 {k = (BLen < AdlerNMax ? BLen : AdlerNMax);
125 while(k >= 16) {
DO16(buff); k -= 16;}
126 if (k != 0)
do {
DO1(buff);}
while (--k);
127 unSum1 %= AdlerBase; unSum2 %= AdlerBase;
131const char *
Type(
int &csSize)
override
132 {csSize =
sizeof(AdlerValue);
return "adler32";}
139uint32_t getCS(
const char* csVal)
141 memcpy(&aVal, csVal,
sizeof(aVal));
142#ifndef Xrd_Big_Endian
148static const uint32_t AdlerBase = 0xFFF1;
149static const uint32_t AdlerStart = 0x0001;
150static const int AdlerNMax = 5552;
const char * Combine(const char *Cksum1, const char *Cksum2, int DLen) override
bool Combinable() override
const char * Combine(const char *Cksum, int DLen) override
const char * Type(int &csSize) override
void Update(const char *Buff, int BLen) override
virtual ~XrdCksCalcadler32()
XrdCksCalc * New() override