diff options
author | Jeffrey Walton <noloader@gmail.com> | 2015-11-05 01:59:46 -0500 |
---|---|---|
committer | Jeffrey Walton <noloader@gmail.com> | 2015-11-05 01:59:46 -0500 |
commit | 48809d4e85c125814425c621d8d0d89f95405924 (patch) | |
tree | 1010fd16c4b1199f3d27dd726dda241a2bd29f83 /zdeflate.h | |
parent | 025337a94aceb75d188149db70c2094673772816 (diff) | |
download | cryptopp-git-48809d4e85c125814425c621d8d0d89f95405924.tar.gz |
CRYPTOPP 5.6.3 RC6 checkin
Diffstat (limited to 'zdeflate.h')
-rw-r--r-- | zdeflate.h | 253 |
1 files changed, 132 insertions, 121 deletions
@@ -1,121 +1,132 @@ -#ifndef CRYPTOPP_ZDEFLATE_H -#define CRYPTOPP_ZDEFLATE_H - -#include "filters.h" -#include "misc.h" - -NAMESPACE_BEGIN(CryptoPP) - -//! _ -class LowFirstBitWriter : public Filter -{ -public: - LowFirstBitWriter(BufferedTransformation *attachment); - void PutBits(unsigned long value, unsigned int length); - void FlushBitBuffer(); - void ClearBitBuffer(); - - void StartCounting(); - unsigned long FinishCounting(); - -protected: - bool m_counting; - unsigned long m_bitCount; - unsigned long m_buffer; - unsigned int m_bitsBuffered, m_bytesBuffered; - FixedSizeSecBlock<byte, 256> m_outputBuffer; -}; - -//! Huffman Encoder -class HuffmanEncoder -{ -public: - typedef unsigned int code_t; - typedef unsigned int value_t; - - HuffmanEncoder() {} - HuffmanEncoder(const unsigned int *codeBits, unsigned int nCodes); - void Initialize(const unsigned int *codeBits, unsigned int nCodes); - - static void GenerateCodeLengths(unsigned int *codeBits, unsigned int maxCodeBits, const unsigned int *codeCounts, size_t nCodes); - - void Encode(LowFirstBitWriter &writer, value_t value) const; - - struct Code - { - unsigned int code; - unsigned int len; - }; - - SecBlock<Code> m_valueToCode; -}; - -//! DEFLATE (RFC 1951) compressor - -class Deflator : public LowFirstBitWriter -{ -public: - enum {MIN_DEFLATE_LEVEL = 0, DEFAULT_DEFLATE_LEVEL = 6, MAX_DEFLATE_LEVEL = 9}; - enum {MIN_LOG2_WINDOW_SIZE = 9, DEFAULT_LOG2_WINDOW_SIZE = 15, MAX_LOG2_WINDOW_SIZE = 15}; - /*! \note detectUncompressible makes it faster to process uncompressible files, but - if a file has both compressible and uncompressible parts, it may fail to compress some of the - compressible parts. */ - Deflator(BufferedTransformation *attachment=NULL, int deflateLevel=DEFAULT_DEFLATE_LEVEL, int log2WindowSize=DEFAULT_LOG2_WINDOW_SIZE, bool detectUncompressible=true); - //! possible parameter names: Log2WindowSize, DeflateLevel, DetectUncompressible - Deflator(const NameValuePairs ¶meters, BufferedTransformation *attachment=NULL); - - //! this function can be used to set the deflate level in the middle of compression - void SetDeflateLevel(int deflateLevel); - int GetDeflateLevel() const {return m_deflateLevel;} - int GetLog2WindowSize() const {return m_log2WindowSize;} - - void IsolatedInitialize(const NameValuePairs ¶meters); - size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking); - bool IsolatedFlush(bool hardFlush, bool blocking); - -protected: - virtual void WritePrestreamHeader() {} - virtual void ProcessUncompressedData(const byte *string, size_t length) {} - virtual void WritePoststreamTail() {} - - enum {STORED = 0, STATIC = 1, DYNAMIC = 2}; - enum {MIN_MATCH = 3, MAX_MATCH = 258}; - - void InitializeStaticEncoders(); - void Reset(bool forceReset = false); - unsigned int FillWindow(const byte *str, size_t length); - unsigned int ComputeHash(const byte *str) const; - unsigned int LongestMatch(unsigned int &bestMatch) const; - void InsertString(unsigned int start); - void ProcessBuffer(); - - void LiteralByte(byte b); - void MatchFound(unsigned int distance, unsigned int length); - void EncodeBlock(bool eof, unsigned int blockType); - void EndBlock(bool eof); - - struct EncodedMatch - { - unsigned literalCode : 9; - unsigned literalExtra : 5; - unsigned distanceCode : 5; - unsigned distanceExtra : 13; - }; - - int m_deflateLevel, m_log2WindowSize, m_compressibleDeflateLevel; - unsigned int m_detectSkip, m_detectCount; - unsigned int DSIZE, DMASK, HSIZE, HMASK, GOOD_MATCH, MAX_LAZYLENGTH, MAX_CHAIN_LENGTH; - bool m_headerWritten, m_matchAvailable; - unsigned int m_dictionaryEnd, m_stringStart, m_lookahead, m_minLookahead, m_previousMatch, m_previousLength; - HuffmanEncoder m_staticLiteralEncoder, m_staticDistanceEncoder, m_dynamicLiteralEncoder, m_dynamicDistanceEncoder; - SecByteBlock m_byteBuffer; - SecBlock<word16> m_head, m_prev; - FixedSizeSecBlock<unsigned int, 286> m_literalCounts; - FixedSizeSecBlock<unsigned int, 30> m_distanceCounts; - SecBlock<EncodedMatch> m_matchBuffer; - unsigned int m_matchBufferEnd, m_blockStart, m_blockLength; -}; - -NAMESPACE_END - -#endif +#ifndef CRYPTOPP_ZDEFLATE_H
+#define CRYPTOPP_ZDEFLATE_H
+
+#include "cryptlib.h"
+#include "filters.h"
+#include "misc.h"
+
+NAMESPACE_BEGIN(CryptoPP)
+
+//! _
+class LowFirstBitWriter : public Filter
+{
+public:
+ LowFirstBitWriter(BufferedTransformation *attachment);
+ void PutBits(unsigned long value, unsigned int length);
+ void FlushBitBuffer();
+ void ClearBitBuffer();
+
+ void StartCounting();
+ unsigned long FinishCounting();
+
+protected:
+ bool m_counting;
+ unsigned long m_bitCount;
+ unsigned long m_buffer;
+ unsigned int m_bitsBuffered, m_bytesBuffered;
+ FixedSizeSecBlock<byte, 256> m_outputBuffer;
+};
+
+//! \class HuffmanEncoder
+class HuffmanEncoder
+{
+public:
+ typedef unsigned int code_t;
+ typedef unsigned int value_t;
+
+ //! \brief Construct a HuffmanEncoder
+ HuffmanEncoder() {}
+
+ //! \brief Construct a HuffmanEncoder
+ //! \param codeBits a table of code bits
+ //! \param nCodes the number of codes in the table
+ HuffmanEncoder(const unsigned int *codeBits, unsigned int nCodes);
+
+ //! \brief Initialize or reinitialize this object
+ //! \param codeBits a table of code bits
+ //! \param nCodes the number of codes in the table
+ void Initialize(const unsigned int *codeBits, unsigned int nCodes);
+
+ static void GenerateCodeLengths(unsigned int *codeBits, unsigned int maxCodeBits, const unsigned int *codeCounts, size_t nCodes);
+
+ void Encode(LowFirstBitWriter &writer, value_t value) const;
+
+ struct Code
+ {
+ unsigned int code;
+ unsigned int len;
+ };
+
+ SecBlock<Code> m_valueToCode;
+};
+
+//! DEFLATE (RFC 1951) compressor
+
+class Deflator : public LowFirstBitWriter
+{
+public:
+ enum {MIN_DEFLATE_LEVEL = 0, DEFAULT_DEFLATE_LEVEL = 6, MAX_DEFLATE_LEVEL = 9};
+ enum {MIN_LOG2_WINDOW_SIZE = 9, DEFAULT_LOG2_WINDOW_SIZE = 15, MAX_LOG2_WINDOW_SIZE = 15};
+ /*! \note detectUncompressible makes it faster to process uncompressible files, but
+ if a file has both compressible and uncompressible parts, it may fail to compress some of the
+ compressible parts. */
+ Deflator(BufferedTransformation *attachment=NULL, int deflateLevel=DEFAULT_DEFLATE_LEVEL, int log2WindowSize=DEFAULT_LOG2_WINDOW_SIZE, bool detectUncompressible=true);
+ //! possible parameter names: Log2WindowSize, DeflateLevel, DetectUncompressible
+ Deflator(const NameValuePairs ¶meters, BufferedTransformation *attachment=NULL);
+
+ //! this function can be used to set the deflate level in the middle of compression
+ void SetDeflateLevel(int deflateLevel);
+ int GetDeflateLevel() const {return m_deflateLevel;}
+ int GetLog2WindowSize() const {return m_log2WindowSize;}
+
+ void IsolatedInitialize(const NameValuePairs ¶meters);
+ size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking);
+ bool IsolatedFlush(bool hardFlush, bool blocking);
+
+protected:
+ virtual void WritePrestreamHeader() {}
+ virtual void ProcessUncompressedData(const byte *string, size_t length)
+ {CRYPTOPP_UNUSED(string), CRYPTOPP_UNUSED(length);}
+ virtual void WritePoststreamTail() {}
+
+ enum {STORED = 0, STATIC = 1, DYNAMIC = 2};
+ enum {MIN_MATCH = 3, MAX_MATCH = 258};
+
+ void InitializeStaticEncoders();
+ void Reset(bool forceReset = false);
+ unsigned int FillWindow(const byte *str, size_t length);
+ unsigned int ComputeHash(const byte *str) const;
+ unsigned int LongestMatch(unsigned int &bestMatch) const;
+ void InsertString(unsigned int start);
+ void ProcessBuffer();
+
+ void LiteralByte(byte b);
+ void MatchFound(unsigned int distance, unsigned int length);
+ void EncodeBlock(bool eof, unsigned int blockType);
+ void EndBlock(bool eof);
+
+ struct EncodedMatch
+ {
+ unsigned literalCode : 9;
+ unsigned literalExtra : 5;
+ unsigned distanceCode : 5;
+ unsigned distanceExtra : 13;
+ };
+
+ int m_deflateLevel, m_log2WindowSize, m_compressibleDeflateLevel;
+ unsigned int m_detectSkip, m_detectCount;
+ unsigned int DSIZE, DMASK, HSIZE, HMASK, GOOD_MATCH, MAX_LAZYLENGTH, MAX_CHAIN_LENGTH;
+ bool m_headerWritten, m_matchAvailable;
+ unsigned int m_dictionaryEnd, m_stringStart, m_lookahead, m_minLookahead, m_previousMatch, m_previousLength;
+ HuffmanEncoder m_staticLiteralEncoder, m_staticDistanceEncoder, m_dynamicLiteralEncoder, m_dynamicDistanceEncoder;
+ SecByteBlock m_byteBuffer;
+ SecBlock<word16> m_head, m_prev;
+ FixedSizeSecBlock<unsigned int, 286> m_literalCounts;
+ FixedSizeSecBlock<unsigned int, 30> m_distanceCounts;
+ SecBlock<EncodedMatch> m_matchBuffer;
+ unsigned int m_matchBufferEnd, m_blockStart, m_blockLength;
+};
+
+NAMESPACE_END
+
+#endif
|