hrev47454 adds 2 changesets to branch 'master' old head: 3b19a781372517c294c6aba6cc3d744ce686699d new head: 5c8bfe24eab3045337f5316e533107751078a2e7 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=5c8bfe2+%5E3b19a78 ---------------------------------------------------------------------------- 72cf56a: BZlibCompressionAlgorithm: Basic support for gzip format 5c8bfe2: compression_test: Add option for gzip format [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 4 files changed, 84 insertions(+), 19 deletions(-) .../private/support/ZlibCompressionAlgorithm.h | 5 ++ src/kits/support/ZlibCompressionAlgorithm.cpp | 36 ++++++++++-- src/tests/kits/support/Jamfile | 2 +- src/tests/kits/support/compression_test.cpp | 60 ++++++++++++++++---- ############################################################################ Commit: 72cf56a0fd536ab9eb5398f95df9347b25a5e707 URL: http://cgit.haiku-os.org/haiku/commit/?id=72cf56a Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Tue Jul 1 19:53:49 2014 UTC BZlibCompressionAlgorithm: Basic support for gzip format ---------------------------------------------------------------------------- diff --git a/headers/private/support/ZlibCompressionAlgorithm.h b/headers/private/support/ZlibCompressionAlgorithm.h index 6e8099d..df9ddae 100644 --- a/headers/private/support/ZlibCompressionAlgorithm.h +++ b/headers/private/support/ZlibCompressionAlgorithm.h @@ -31,9 +31,14 @@ public: size_t BufferSize() const; void SetBufferSize(size_t size); + // TODO: Support setting the gzip header. + bool IsGzipFormat() const; + void SetGzipFormat(bool gzipFormat); + private: int32 fCompressionLevel; size_t fBufferSize; + bool fGzipFormat; }; diff --git a/src/kits/support/ZlibCompressionAlgorithm.cpp b/src/kits/support/ZlibCompressionAlgorithm.cpp index ca02633..9aaaf26 100644 --- a/src/kits/support/ZlibCompressionAlgorithm.cpp +++ b/src/kits/support/ZlibCompressionAlgorithm.cpp @@ -45,7 +45,8 @@ BZlibCompressionParameters::BZlibCompressionParameters( : BCompressionParameters(), fCompressionLevel(compressionLevel), - fBufferSize(kDefaultBufferSize) + fBufferSize(kDefaultBufferSize), + fGzipFormat(false) { } @@ -83,6 +84,20 @@ BZlibCompressionParameters::SetBufferSize(size_t size) } +bool +BZlibCompressionParameters::IsGzipFormat() const +{ + return fGzipFormat; +} + + +void +BZlibCompressionParameters::SetGzipFormat(bool gzipFormat) +{ + fGzipFormat = gzipFormat; +} + + // #pragma mark - BZlibDecompressionParameters @@ -127,10 +142,18 @@ struct BZlibCompressionAlgorithm::CompressionStrategy { static int Init(z_stream& stream, const BZlibCompressionParameters* parameters) { - return deflateInit(&stream, - parameters != NULL - ? parameters->CompressionLevel() - : B_ZLIB_COMPRESSION_DEFAULT); + int32 compressionLevel = B_ZLIB_COMPRESSION_DEFAULT; + bool gzipFormat = false; + if (parameters != NULL) { + compressionLevel = parameters->CompressionLevel(); + gzipFormat = parameters->IsGzipFormat(); + } + + return deflateInit2(&stream, compressionLevel, + Z_DEFLATED, + MAX_WBITS + (gzipFormat ? 16 : 0), + MAX_MEM_LEVEL, + Z_DEFAULT_STRATEGY); } static void Uninit(z_stream& stream) @@ -159,7 +182,8 @@ struct BZlibCompressionAlgorithm::DecompressionStrategy { static int Init(z_stream& stream, const BZlibDecompressionParameters* /*parameters*/) { - return inflateInit(&stream); + // auto-detect zlib/gzip header + return inflateInit2(&stream, 32 + MAX_WBITS); } static void Uninit(z_stream& stream) ############################################################################ Revision: hrev47454 Commit: 5c8bfe24eab3045337f5316e533107751078a2e7 URL: http://cgit.haiku-os.org/haiku/commit/?id=5c8bfe2 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Tue Jul 1 19:54:27 2014 UTC compression_test: Add option for gzip format ---------------------------------------------------------------------------- diff --git a/src/tests/kits/support/Jamfile b/src/tests/kits/support/Jamfile index 6257f21..86a90ae 100644 --- a/src/tests/kits/support/Jamfile +++ b/src/tests/kits/support/Jamfile @@ -85,7 +85,7 @@ UnitTestLib libsupporttest.so UsePrivateHeaders support ; -SimpleTest compression_test : compression_test.cpp : be ; +SimpleTest compression_test : compression_test.cpp : be $(TARGET_LIBSUPC++) ; SimpleTest string_utf8_tests : string_utf8_tests.cpp : be ; SubInclude HAIKU_TOP src tests kits support barchivable ; diff --git a/src/tests/kits/support/compression_test.cpp b/src/tests/kits/support/compression_test.cpp index 21cdd25..c752a90 100644 --- a/src/tests/kits/support/compression_test.cpp +++ b/src/tests/kits/support/compression_test.cpp @@ -19,6 +19,12 @@ extern const char* __progname; const char* kCommandName = __progname; +enum CompressionType { + ZlibCompression, + GzipCompression, +}; + + static const char* kUsage = "Usage: %s <options> <input file> <output file>\n" "Compresses or decompresses (option -d) a file.\n" @@ -29,6 +35,8 @@ static const char* kUsage = " Defaults to 9.\n" " -d, --decompress\n" " Decompress the input file (default is compress).\n" + " -f <format>\n" + " Specify the compression format: \"zlib\" (default), or \"gzip\"\n" " -h, --help\n" " Print this usage info.\n" " -i, --input-stream\n" @@ -50,6 +58,7 @@ main(int argc, const char* const* argv) int compressionLevel = B_ZLIB_COMPRESSION_DEFAULT; bool compress = true; bool useInputStream = true; + CompressionType compressionType = ZlibCompression; while (true) { static struct option sLongOptions[] = { @@ -60,7 +69,7 @@ main(int argc, const char* const* argv) }; opterr = 0; // don't print errors - int c = getopt_long(argc, (char**)argv, "+0123456789dhi", + int c = getopt_long(argc, (char**)argv, "+0123456789df:hi", sLongOptions, NULL); if (c == -1) break; @@ -87,6 +96,18 @@ main(int argc, const char* const* argv) compress = false; break; + case 'f': + if (strcmp(optarg, "zlib") == 0) { + compressionType = ZlibCompression; + } else if (strcmp(optarg, "gzip") == 0) { + compressionType = GzipCompression; + } else { + fprintf(stderr, "Error: Unsupported compression type " + "\"%s\"\n", optarg); + return 1; + } + break; + case 'i': useInputStream = true; break; @@ -123,19 +144,34 @@ main(int argc, const char* const* argv) return 1; } - // init parameters - BZlibCompressionParameters compressionParameters(compressionLevel); - BZlibDecompressionParameters decompressionParameters; + // create compression algorithm and parameters + BCompressionAlgorithm* compressionAlgorithm; + BCompressionParameters* compressionParameters; + BDecompressionParameters* decompressionParameters; + switch (compressionType) { + case ZlibCompression: + case GzipCompression: + { + compressionAlgorithm = new BZlibCompressionAlgorithm; + BZlibCompressionParameters* zlibCompressionParameters + = new BZlibCompressionParameters(compressionLevel); + zlibCompressionParameters->SetGzipFormat( + compressionType == GzipCompression); + compressionParameters = zlibCompressionParameters; + decompressionParameters = new BZlibDecompressionParameters; + break; + } + } if (useInputStream) { // create input stream BDataIO* inputStream; if (compress) { - error = BZlibCompressionAlgorithm().CreateCompressingInputStream( - &inputFile, &compressionParameters, inputStream); + error = compressionAlgorithm->CreateCompressingInputStream( + &inputFile, compressionParameters, inputStream); } else { - error = BZlibCompressionAlgorithm().CreateDecompressingInputStream( - &inputFile, &decompressionParameters, inputStream); + error = compressionAlgorithm->CreateDecompressingInputStream( + &inputFile, decompressionParameters, inputStream); } if (error != B_OK) { @@ -167,11 +203,11 @@ main(int argc, const char* const* argv) // create output stream BDataIO* outputStream; if (compress) { - error = BZlibCompressionAlgorithm().CreateCompressingOutputStream( - &outputFile, &compressionParameters, outputStream); + error = compressionAlgorithm->CreateCompressingOutputStream( + &outputFile, compressionParameters, outputStream); } else { - error = BZlibCompressionAlgorithm().CreateDecompressingOutputStream( - &outputFile, &decompressionParameters, outputStream); + error = compressionAlgorithm->CreateDecompressingOutputStream( + &outputFile, decompressionParameters, outputStream); } if (error != B_OK) {