From 3a2ffc5e0778466b63cdf1e8e9693087a3b2eeaf Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sat, 24 Feb 2018 22:28:58 -0400 Subject: [PATCH] Add support for header-less DEFLATE data to love.data.compress/decompress. --- src/modules/data/Compressor.cpp | 18 ++++++++++++------ src/modules/data/Compressor.h | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/modules/data/Compressor.cpp b/src/modules/data/Compressor.cpp index 4fa82f9bf..af4a05d32 100644 --- a/src/modules/data/Compressor.cpp +++ b/src/modules/data/Compressor.cpp @@ -198,6 +198,8 @@ private: int windowbits = 15; if (format == FORMAT_GZIP) windowbits += 16; // This tells zlib to use a gzip header. + else if (format == FORMAT_DEFLATE) + windowbits = -windowbits; int err = deflateInit2(&stream, level, Z_DEFLATED, windowbits, 8, Z_DEFAULT_STRATEGY); @@ -217,7 +219,7 @@ private: return deflateEnd(&stream); } - int zlibDecompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) + int zlibDecompress(Format format, Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) { z_stream stream = {}; @@ -230,6 +232,9 @@ private: // 15 is the default. Adding 32 makes zlib auto-detect the header type. int windowbits = 15 + 32; + if (format == FORMAT_DEFLATE) + windowbits = -15; + int err = inflateInit2(&stream, windowbits); if (err != Z_OK) @@ -324,7 +329,7 @@ public: } uLongf destLen = (uLongf) rawsize; - int status = zlibDecompress((Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize); + int status = zlibDecompress(format, (Bytef *) rawbytes, &destLen, (const Bytef *) data, (uLong) dataSize); if (status == Z_OK) { @@ -348,7 +353,7 @@ public: bool isSupported(Format format) const override { - return format == FORMAT_ZLIB || format == FORMAT_GZIP; + return format == FORMAT_ZLIB || format == FORMAT_GZIP || format == FORMAT_DEFLATE; } }; // zlibCompressor @@ -386,9 +391,10 @@ std::vector Compressor::getConstants(Format) StringMap::Entry Compressor::formatEntries[] = { - { "lz4", FORMAT_LZ4 }, - { "zlib", FORMAT_ZLIB }, - { "gzip", FORMAT_GZIP }, + { "lz4", FORMAT_LZ4 }, + { "zlib", FORMAT_ZLIB }, + { "gzip", FORMAT_GZIP }, + { "deflate", FORMAT_DEFLATE }, }; StringMap Compressor::formatNames(Compressor::formatEntries, sizeof(Compressor::formatEntries)); diff --git a/src/modules/data/Compressor.h b/src/modules/data/Compressor.h index 2bbfbd612..68361ac82 100644 --- a/src/modules/data/Compressor.h +++ b/src/modules/data/Compressor.h @@ -40,6 +40,7 @@ public: FORMAT_LZ4, FORMAT_ZLIB, FORMAT_GZIP, + FORMAT_DEFLATE, FORMAT_MAX_ENUM };