diff options
author | Rob Landley <rob@landley.net> | 2023-04-10 21:38:02 -0500 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2023-04-10 21:38:02 -0500 |
commit | aa88571a6b847a96bb8ee998a9868c5a1bdb3a6e (patch) | |
tree | 9e65a00479d5a62db3e5fa8637f5d20e961c1ef9 | |
parent | 1ad96558227fd57506099ba31af6d557d8c8dc50 (diff) | |
download | toybox-aa88571a6b847a96bb8ee998a9868c5a1bdb3a6e.tar.gz |
Better adler32.
-rw-r--r-- | lib/deflate.c | 7 |
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; } */ |