Add unit tests for Adler-32.

This commit is contained in:
2021-10-05 02:21:51 +01:00
parent 513ef08c43
commit a9c49a64b4
9 changed files with 245 additions and 105 deletions

186
adler32.c
View File

@@ -73,22 +73,30 @@ AARU_EXPORT int AARU_CALL adler32_update(adler32_ctx* ctx, const uint8_t* data,
}
#endif
uint32_t sum1 = ctx->sum1;
uint32_t sum2 = ctx->sum2;
adler32_slicing(&ctx->sum1, &ctx->sum2, data, len);
return 0;
}
void adler32_slicing(uint16_t* sum1, uint16_t* sum2, const unsigned char* data, long len)
{
uint32_t s1 = *sum1;
uint32_t s2 = *sum2;
unsigned n;
/* in case user likes doing a byte at a time, keep it fast */
if(len == 1)
{
sum1 += data[0];
if(sum1 >= ADLER_MODULE) sum1 -= ADLER_MODULE;
sum2 += sum1;
if(sum2 >= ADLER_MODULE) sum2 -= ADLER_MODULE;
s1 += data[0];
if(s1 >= ADLER_MODULE) s1 -= ADLER_MODULE;
s2 += s1;
if(s2 >= ADLER_MODULE) s2 -= ADLER_MODULE;
ctx->sum1 = sum1 & 0xFFFF;
ctx->sum2 = sum2 & 0xFFFF;
return 0;
*sum1 = s1 & 0xFFFF;
*sum2 = s2 & 0xFFFF;
return;
}
/* in case short lengths are provided, keep it somewhat fast */
@@ -96,14 +104,15 @@ AARU_EXPORT int AARU_CALL adler32_update(adler32_ctx* ctx, const uint8_t* data,
{
while(len--)
{
sum1 += *data++;
sum2 += sum1;
s1 += *data++;
s2 += s1;
}
if(sum1 >= ADLER_MODULE) sum1 -= ADLER_MODULE;
sum2 %= ADLER_MODULE; /* only added so many ADLER_MODULE's */
ctx->sum1 = sum1 & 0xFFFF;
ctx->sum2 = sum2 & 0xFFFF;
return 0;
if(s1 >= ADLER_MODULE) s1 -= ADLER_MODULE;
s2 %= ADLER_MODULE; /* only added so many ADLER_MODULE's */
*sum1 = s1 & 0xFFFF;
*sum2 = s2 & 0xFFFF;
return;
}
/* do length NMAX blocks -- requires just one modulo operation */
@@ -112,44 +121,44 @@ AARU_EXPORT int AARU_CALL adler32_update(adler32_ctx* ctx, const uint8_t* data,
len -= NMAX;
n = NMAX / 16; /* NMAX is divisible by 16 */
do {
sum1 += (data)[0];
sum2 += sum1;
sum1 += (data)[0 + 1];
sum2 += sum1;
sum1 += (data)[0 + 2];
sum2 += sum1;
sum1 += (data)[0 + 2 + 1];
sum2 += sum1;
sum1 += (data)[0 + 4];
sum2 += sum1;
sum1 += (data)[0 + 4 + 1];
sum2 += sum1;
sum1 += (data)[0 + 4 + 2];
sum2 += sum1;
sum1 += (data)[0 + 4 + 2 + 1];
sum2 += sum1;
sum1 += (data)[8];
sum2 += sum1;
sum1 += (data)[8 + 1];
sum2 += sum1;
sum1 += (data)[8 + 2];
sum2 += sum1;
sum1 += (data)[8 + 2 + 1];
sum2 += sum1;
sum1 += (data)[8 + 4];
sum2 += sum1;
sum1 += (data)[8 + 4 + 1];
sum2 += sum1;
sum1 += (data)[8 + 4 + 2];
sum2 += sum1;
sum1 += (data)[8 + 4 + 2 + 1];
sum2 += sum1;
s1 += (data)[0];
s2 += s1;
s1 += (data)[0 + 1];
s2 += s1;
s1 += (data)[0 + 2];
s2 += s1;
s1 += (data)[0 + 2 + 1];
s2 += s1;
s1 += (data)[0 + 4];
s2 += s1;
s1 += (data)[0 + 4 + 1];
s2 += s1;
s1 += (data)[0 + 4 + 2];
s2 += s1;
s1 += (data)[0 + 4 + 2 + 1];
s2 += s1;
s1 += (data)[8];
s2 += s1;
s1 += (data)[8 + 1];
s2 += s1;
s1 += (data)[8 + 2];
s2 += s1;
s1 += (data)[8 + 2 + 1];
s2 += s1;
s1 += (data)[8 + 4];
s2 += s1;
s1 += (data)[8 + 4 + 1];
s2 += s1;
s1 += (data)[8 + 4 + 2];
s2 += s1;
s1 += (data)[8 + 4 + 2 + 1];
s2 += s1;
/* 16 sums unrolled */
data += 16;
} while(--n);
sum1 %= ADLER_MODULE;
sum2 %= ADLER_MODULE;
s1 %= ADLER_MODULE;
s2 %= ADLER_MODULE;
}
/* do remaining bytes (less than NMAX, still just one modulo) */
@@ -158,53 +167,52 @@ AARU_EXPORT int AARU_CALL adler32_update(adler32_ctx* ctx, const uint8_t* data,
while(len >= 16)
{
len -= 16;
sum1 += (data)[0];
sum2 += sum1;
sum1 += (data)[0 + 1];
sum2 += sum1;
sum1 += (data)[0 + 2];
sum2 += sum1;
sum1 += (data)[0 + 2 + 1];
sum2 += sum1;
sum1 += (data)[0 + 4];
sum2 += sum1;
sum1 += (data)[0 + 4 + 1];
sum2 += sum1;
sum1 += (data)[0 + 4 + 2];
sum2 += sum1;
sum1 += (data)[0 + 4 + 2 + 1];
sum2 += sum1;
sum1 += (data)[8];
sum2 += sum1;
sum1 += (data)[8 + 1];
sum2 += sum1;
sum1 += (data)[8 + 2];
sum2 += sum1;
sum1 += (data)[8 + 2 + 1];
sum2 += sum1;
sum1 += (data)[8 + 4];
sum2 += sum1;
sum1 += (data)[8 + 4 + 1];
sum2 += sum1;
sum1 += (data)[8 + 4 + 2];
sum2 += sum1;
sum1 += (data)[8 + 4 + 2 + 1];
sum2 += sum1;
s1 += (data)[0];
s2 += s1;
s1 += (data)[0 + 1];
s2 += s1;
s1 += (data)[0 + 2];
s2 += s1;
s1 += (data)[0 + 2 + 1];
s2 += s1;
s1 += (data)[0 + 4];
s2 += s1;
s1 += (data)[0 + 4 + 1];
s2 += s1;
s1 += (data)[0 + 4 + 2];
s2 += s1;
s1 += (data)[0 + 4 + 2 + 1];
s2 += s1;
s1 += (data)[8];
s2 += s1;
s1 += (data)[8 + 1];
s2 += s1;
s1 += (data)[8 + 2];
s2 += s1;
s1 += (data)[8 + 2 + 1];
s2 += s1;
s1 += (data)[8 + 4];
s2 += s1;
s1 += (data)[8 + 4 + 1];
s2 += s1;
s1 += (data)[8 + 4 + 2];
s2 += s1;
s1 += (data)[8 + 4 + 2 + 1];
s2 += s1;
data += 16;
}
while(len--)
{
sum1 += *data++;
sum2 += sum1;
s1 += *data++;
s2 += s1;
}
sum1 %= ADLER_MODULE;
sum2 %= ADLER_MODULE;
s1 %= ADLER_MODULE;
s2 %= ADLER_MODULE;
}
ctx->sum1 = sum1 & 0xFFFF;
ctx->sum2 = sum2 & 0xFFFF;
return 0;
*sum1 = s1 & 0xFFFF;
*sum2 = s2 & 0xFFFF;
}
AARU_EXPORT int AARU_CALL adler32_final(adler32_ctx* ctx, uint32_t* checksum)