/* compression_utils_portable.cc * * Copyright 2019 The Chromium Authors * Use of this source code is governed by a BSD-style license that can be * found in the Chromium source repository LICENSE file. */ #include "compression_utils_portable.h" #include <stddef.h> #include <stdlib.h> #include <string.h> namespace zlib_internal { // The difference in bytes between a zlib header and a gzip header. const size_t kGzipZlibHeaderDifferenceBytes = …; // Pass an integer greater than the following get a gzip header instead of a // zlib header when calling deflateInit2() and inflateInit2(). const int kWindowBitsToGetGzipHeader = …; // This describes the amount of memory zlib uses to compress data. It can go // from 1 to 9, with 8 being the default. For details, see: // http://www.zlib.net/manual.html (search for memLevel). const int kZlibMemoryLevel = …; // The expected compressed size is based on the input size factored by // internal Zlib constants (e.g. window size, etc) plus the wrapper // header size. uLongf GzipExpectedCompressedSize(uLongf input_size) { … } // The expected decompressed size is stored in the last // 4 bytes of |input| in LE. See https://tools.ietf.org/html/rfc1952#page-5 uint32_t GetGzipUncompressedSize(const Bytef* compressed_data, size_t length) { … } // The number of window bits determines the type of wrapper to use - see // https://cs.chromium.org/chromium/src/third_party/zlib/zlib.h?l=566 inline int ZlibStreamWrapperType(WrapperType type) { … } int GzipCompressHelper(Bytef* dest, uLongf* dest_length, const Bytef* source, uLong source_length, void* (*malloc_fn)(size_t), void (*free_fn)(void*)) { … } // This code is taken almost verbatim from third_party/zlib/compress.c. The only // difference is deflateInit2() is called which allows different window bits to // be set. > 16 causes a gzip header to be emitted rather than a zlib header, // and negative causes no header to emitted. // // Compression level can be a number from 1-9, with 1 being the fastest, 9 being // the best compression. The default, which the GZIP helper uses, is 6. int CompressHelper(WrapperType wrapper_type, Bytef* dest, uLongf* dest_length, const Bytef* source, uLong source_length, int compression_level, void* (*malloc_fn)(size_t), void (*free_fn)(void*)) { … } int GzipUncompressHelper(Bytef* dest, uLongf* dest_length, const Bytef* source, uLong source_length) { … } // This code is taken almost verbatim from third_party/zlib/uncompr.c. The only // difference is inflateInit2() is called which allows different window bits to // be set. > 16 causes a gzip header to be emitted rather than a zlib header, // and negative causes no header to emitted. int UncompressHelper(WrapperType wrapper_type, Bytef* dest, uLongf* dest_length, const Bytef* source, uLong source_length) { … } } // namespace zlib_internal