aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2023-04-10 21:38:02 -0500
committerRob Landley <rob@landley.net>2023-04-10 21:38:02 -0500
commitaa88571a6b847a96bb8ee998a9868c5a1bdb3a6e (patch)
tree9e65a00479d5a62db3e5fa8637f5d20e961c1ef9
parent1ad96558227fd57506099ba31af6d557d8c8dc50 (diff)
downloadtoybox-aa88571a6b847a96bb8ee998a9868c5a1bdb3a6e.tar.gz
Better adler32.
-rw-r--r--lib/deflate.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/deflate.c b/lib/deflate.c
index 06d61e97..a418c21c 100644
--- a/lib/deflate.c
+++ b/lib/deflate.c
@@ -433,16 +433,17 @@ static void gzip_crc(struct deflate *dd, char *data, unsigned len)
/*
// Start with crc = 1, or pass in last crc to append more data
+// Deferred modulus good for paged size inputs (can't overflow for ~5500 bytes)
unsigned adler32(char *buf, unsigned len, unsigned crc)
{
unsigned aa = crc&((1<<16)-1), bb = crc>>16;
while (len--) {
- aa = (aa+*buf)%65521;
- bb = (bb+aa)%65521;
+ aa += *buf++;
+ bb += aa;
}
- return (bb<16)+aa;
+ return ((bb%65521)<<16)+aa%65521;
}
*/