From dec2e0d9e493b53c48ca26b47028ab309d3cc586 Mon Sep 17 00:00:00 2001 From: lloyd Date: Tue, 18 Nov 2014 13:42:36 +0000 Subject: Convert compression filters to in-place transforms and refactor to minimize the amount of logic needed in the files specific to each library. --- src/lib/compression/comp_util.h | 90 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/lib/compression/comp_util.h (limited to 'src/lib/compression/comp_util.h') diff --git a/src/lib/compression/comp_util.h b/src/lib/compression/comp_util.h new file mode 100644 index 000000000..15fc23418 --- /dev/null +++ b/src/lib/compression/comp_util.h @@ -0,0 +1,90 @@ +/* +* Shared code for compression libraries +* (C) 2014 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#ifndef BOTAN_COMPRESSION_UTILS_H__ +#define BOTAN_COMPRESSION_UTILS_H__ + +#include +#include +#include +#include + +namespace Botan { + +/* +* Allocation Size Tracking Helper for Zlib/Bzlib/LZMA +*/ +class Compression_Alloc_Info + { + public: + template + static void* malloc(void* self, T n, T size) + { + return static_cast(self)->do_malloc(n, size); + } + + static void free(void* self, void* ptr) + { + static_cast(self)->do_free(ptr); + } + + private: + void* do_malloc(size_t n, size_t size); + void do_free(void* ptr); + + std::unordered_map m_current_allocs; + }; + +/** +* Wrapper for Zlib/Bzlib/LZMA stream types +*/ +template +class Zlib_Style_Stream : public Compression_Stream + { + public: + void next_in(byte* b, size_t len) override + { + m_stream.next_in = reinterpret_cast(b); + m_stream.avail_in = len; + } + + void next_out(byte* b, size_t len) override + { + m_stream.next_out = reinterpret_cast(b); + m_stream.avail_out = len; + } + + size_t avail_in() const override { return m_stream.avail_in; } + + size_t avail_out() const override { return m_stream.avail_out; } + + Zlib_Style_Stream() + { + std::memset(&m_stream, 0, sizeof(stream_t)); + m_allocs.reset(new Compression_Alloc_Info); + } + + ~Zlib_Style_Stream() + { + std::memset(&m_stream, 0, sizeof(stream_t)); + m_allocs.reset(); + } + + protected: + typedef Stream stream_t; + + stream_t* streamp() { return &m_stream; } + + Compression_Alloc_Info* alloc() { return m_allocs.get(); } + private: + stream_t m_stream; + std::unique_ptr m_allocs; + }; + +} + +#endif -- cgit v1.2.3