aboutsummaryrefslogtreecommitdiff
path: root/src/zopfli/gzip_container.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zopfli/gzip_container.c')
-rw-r--r--src/zopfli/gzip_container.c101
1 files changed, 54 insertions, 47 deletions
diff --git a/src/zopfli/gzip_container.c b/src/zopfli/gzip_container.c
index 8a062f2..7615db3 100644
--- a/src/zopfli/gzip_container.c
+++ b/src/zopfli/gzip_container.c
@@ -24,56 +24,63 @@ Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
#include "deflate.h"
-/* Table of CRCs of all 8-bit messages. */
-static unsigned long crc_table[256];
-
-/* Flag: has the table been computed? Initially false. */
-static int crc_table_computed = 0;
-
-/* Makes the table for a fast CRC. */
-static void MakeCRCTable() {
- unsigned long c;
- int n, k;
- for (n = 0; n < 256; n++) {
- c = (unsigned long) n;
- for (k = 0; k < 8; k++) {
- if (c & 1) {
- c = 0xedb88320L ^ (c >> 1);
- } else {
- c = c >> 1;
- }
- }
- crc_table[n] = c;
+/* CRC polynomial: 0xedb88320 */
+static const unsigned long crc32_table[256] = {
+ 0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u,
+ 3915621685u, 2657392035u, 249268274u, 2044508324u, 3772115230u, 2547177864u,
+ 162941995u, 2125561021u, 3887607047u, 2428444049u, 498536548u, 1789927666u,
+ 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u,
+ 325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u,
+ 4195302755u, 2366115317u, 997073096u, 1281953886u, 3579855332u, 2724688242u,
+ 1006888145u, 1258607687u, 3524101629u, 2768942443u, 901097722u, 1119000684u,
+ 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u,
+ 651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u,
+ 3485111705u, 3099436303u, 671266974u, 1594198024u, 3322730930u, 2970347812u,
+ 795835527u, 1483230225u, 3244367275u, 3060149565u, 1994146192u, 31158534u,
+ 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u,
+ 2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u,
+ 2439277719u, 3865271297u, 1802195444u, 476864866u, 2238001368u, 4066508878u,
+ 1812370925u, 453092731u, 2181625025u, 4111451223u, 1706088902u, 314042704u,
+ 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u,
+ 1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u,
+ 2765210733u, 3554079995u, 1131014506u, 879679996u, 2909243462u, 3663771856u,
+ 1141124467u, 855842277u, 2852801631u, 3708648649u, 1342533948u, 654459306u,
+ 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u,
+ 1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u,
+ 3082640443u, 3233442989u, 3988292384u, 2596254646u, 62317068u, 1957810842u,
+ 3939845945u, 2647816111u, 81470997u, 1943803523u, 3814918930u, 2489596804u,
+ 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u,
+ 4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u,
+ 426522225u, 1852507879u, 4275313526u, 2312317920u, 282753626u, 1742555852u,
+ 4189708143u, 2394877945u, 397917763u, 1622183637u, 3604390888u, 2714866558u,
+ 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
+ 3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u,
+ 829329135u, 1181335161u, 3412177804u, 3160834842u, 628085408u, 1382605366u,
+ 3423369109u, 3138078467u, 570562233u, 1426400815u, 3317316542u, 2998733608u,
+ 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u,
+ 2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u,
+ 1913087877u, 83908371u, 2512341634u, 3803740692u, 2075208622u, 213261112u,
+ 2463272603u, 3855990285u, 2094854071u, 198958881u, 2262029012u, 4057260610u,
+ 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u,
+ 2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u,
+ 1634467795u, 376229701u, 2685067896u, 3608007406u, 1308918612u, 956543938u,
+ 2808555105u, 3495958263u, 1231636301u, 1047427035u, 2932959818u, 3654703836u,
+ 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u,
+ 3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u,
+ 1423857449u, 601450431u, 3009837614u, 3294710456u, 1567103746u, 711928724u,
+ 3020668471u, 3272380065u, 1510334235u, 755167117u
+};
+
+/* Returns the CRC32 */
+static unsigned long CRC(const unsigned char* data, size_t size) {
+ unsigned long result = 0xffffffffu;
+ for (; size > 0; size--) {
+ result = crc32_table[(result ^ *(data++)) & 0xff] ^ (result >> 8);
}
- crc_table_computed = 1;
+ return result ^ 0xffffffffu;
}
-
-/*
-Updates a running crc with the bytes buf[0..len-1] and returns
-the updated crc. The crc should be initialized to zero.
-*/
-static unsigned long UpdateCRC(unsigned long crc,
- const unsigned char *buf, size_t len) {
- unsigned long c = crc ^ 0xffffffffL;
- unsigned n;
-
- if (!crc_table_computed)
- MakeCRCTable();
- for (n = 0; n < len; n++) {
- c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
- }
- return c ^ 0xffffffffL;
-}
-
-/* Returns the CRC of the bytes buf[0..len-1]. */
-static unsigned long CRC(const unsigned char* buf, int len) {
- return UpdateCRC(0L, buf, len);
-}
-
-/*
-Compresses the data according to the gzip specification.
-*/
+/* Compresses the data according to the gzip specification, RFC 1952. */
void ZopfliGzipCompress(const ZopfliOptions* options,
const unsigned char* in, size_t insize,
unsigned char** out, size_t* outsize) {