00001 #include <stdio.h>
00002 #include <stdint.h>
00003 #include "adler32.h"
00004
00005 #define MOD_ADLER 65521
00006
00007
00008
00009
00010
00011
00012
00013
00014 uint32_t adler32sum(uint32_t chksum, int len, const uint8_t *data)
00015 {
00016 uint32_t a, b;
00017
00018 a = chksum & 0xffff;
00019 b = (chksum >> 16 ) & 0xffff;
00020 while (len) {
00021 unsigned int tlen = len > 5550 ? 5550 : len;
00022 len -= tlen;
00023 do {
00024 a += *data++;
00025 b += a;
00026 } while (--tlen);
00027 a = (a & 0xffff) + (a >> 16) * (65536-MOD_ADLER);
00028 b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER);
00029 }
00030
00031 if (a >= MOD_ADLER)
00032 a -= MOD_ADLER;
00033
00034 b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER);
00035 if (b >= MOD_ADLER)
00036 b -= MOD_ADLER;
00037 return b << 16 | a;
00038 }
00039