📄 zlib.cpp
字号:
// (C) Copyright Jonathan Turkanis 2003.// Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)// See http://www.boost.org/libs/iostreams for documentation.// To configure Boost to work with zlib, see the // installation instructions here:// http://boost.org/libs/iostreams/doc/index.html?path=7// Define BOOST_IOSTREAMS_SOURCE so that <boost/iostreams/detail/config.hpp> // knows that we are building the library (possibly exporting code), rather // than using it (possibly importing code).#define BOOST_IOSTREAMS_SOURCE #include <boost/iostreams/detail/config/dyn_link.hpp>#include <boost/iostreams/filter/zlib.hpp> #include "zlib.h" // Jean-loup Gailly's and Mark Adler's "zlib.h" header. // To configure Boost to work with zlib, see the // installation instructions here: // http://boost.org/libs/iostreams/doc/index.html?path=7namespace boost { namespace iostreams {namespace zlib { // Compression levelsconst int no_compression = Z_NO_COMPRESSION;const int best_speed = Z_BEST_SPEED;const int best_compression = Z_BEST_COMPRESSION;const int default_compression = Z_DEFAULT_COMPRESSION; // Compression methodsconst int deflated = Z_DEFLATED; // Compression strategiesconst int default_strategy = Z_DEFAULT_STRATEGY;const int filtered = Z_FILTERED;const int huffman_only = Z_HUFFMAN_ONLY; // Status codesconst int okay = Z_OK;const int stream_end = Z_STREAM_END;const int stream_error = Z_STREAM_ERROR;const int version_error = Z_VERSION_ERROR;const int data_error = Z_DATA_ERROR;const int mem_error = Z_MEM_ERROR;const int buf_error = Z_BUF_ERROR; // Flush codesconst int finish = Z_FINISH;const int no_flush = Z_NO_FLUSH;const int sync_flush = Z_SYNC_FLUSH; // Code for current OS//const int os_code = OS_CODE;} // End namespace zlib. //------------------Implementation of zlib_error------------------------------// zlib_error::zlib_error(int error) : BOOST_IOSTREAMS_FAILURE("zlib error"), error_(error) { }void zlib_error::check(int error){ switch (error) { case Z_OK: case Z_STREAM_END: //case Z_BUF_ERROR: return; case Z_MEM_ERROR: throw std::bad_alloc(); default: throw zlib_error(error); ; }}//------------------Implementation of zlib_base-------------------------------//namespace detail {zlib_base::zlib_base() : stream_(new z_stream), calculate_crc_(false), crc_(0) { }zlib_base::~zlib_base() { delete static_cast<z_stream*>(stream_); }void zlib_base::before( const char*& src_begin, const char* src_end, char*& dest_begin, char* dest_end ){ z_stream* s = static_cast<z_stream*>(stream_); s->next_in = reinterpret_cast<zlib::byte*>(const_cast<char*>(src_begin)); s->avail_in = static_cast<zlib::uint>(src_end - src_begin); s->next_out = reinterpret_cast<zlib::byte*>(dest_begin); s->avail_out= static_cast<zlib::uint>(dest_end - dest_begin);}void zlib_base::after(const char*& src_begin, char*& dest_begin, bool compress){ z_stream* s = static_cast<z_stream*>(stream_); char* next_in = reinterpret_cast<char*>(s->next_in); char* next_out = reinterpret_cast<char*>(s->next_out); if (calculate_crc_) { const zlib::byte* buf = compress ? reinterpret_cast<const zlib::byte*>(src_begin) : reinterpret_cast<const zlib::byte*>( const_cast<const char*>(dest_begin) ); zlib::uint length = compress ? static_cast<zlib::uint>(next_in - src_begin) : static_cast<zlib::uint>(next_out - dest_begin); if (length > 0) crc_ = crc32(crc_, buf, length); } total_in_ = s->total_in; total_out_ = s->total_out; src_begin = const_cast<const char*>(next_in); dest_begin = next_out;}int zlib_base::deflate(int flush){ return ::deflate(static_cast<z_stream*>(stream_), flush);}int zlib_base::inflate(int flush){ return ::inflate(static_cast<z_stream*>(stream_), flush);}void zlib_base::reset(bool compress, bool realloc){ z_stream* s = static_cast<z_stream*>(stream_); // Undiagnosed bug: // deflateReset(), etc., return Z_DATA_ERROR zlib_error::check( realloc ? (compress ? deflateReset(s) : inflateReset(s)) : (compress ? deflateEnd(s) : inflateEnd(s)) ); if (realloc && !compress) { crc_ = 0; }}void zlib_base::do_init ( const zlib_params& p, bool compress, #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) zlib::alloc_func alloc, zlib::free_func free, #endif void* derived ){ calculate_crc_ = p.calculate_crc; z_stream* s = static_cast<z_stream*>(stream_); // Current interface for customizing memory management // is non-conforming and has been disabled: //#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) // s->zalloc = alloc; // s->zfree = free; //#else s->zalloc = 0; s->zfree = 0; //#endif s->opaque = derived; int window_bits = p.noheader? -p.window_bits : p.window_bits; zlib_error::check( compress ? deflateInit2( s, p.level, p.method, window_bits, p.mem_level, p.strategy ) : inflateInit2(s, window_bits) );}} // End namespace detail.//----------------------------------------------------------------------------//} } // End namespaces iostreams, boost.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -