64 lines
1.8 KiB
C++
64 lines
1.8 KiB
C++
#ifndef ZINFLATE_H
|
|
#define ZINFLATE_H
|
|
|
|
#include "forkjoin.h"
|
|
#include "misc.h"
|
|
#include "queue.h"
|
|
|
|
class Inflator : public Fork
|
|
{
|
|
public:
|
|
class Err : public CryptlibException {public: Err(const char *message) : CryptlibException(message) {}};
|
|
class UnexpectedEndErr : public Err {public: UnexpectedEndErr() : Err("Inflator: unexpected end of compressed block") {}};
|
|
|
|
Inflator(BufferedTransformation *output = NULL,
|
|
BufferedTransformation *bypassed = NULL);
|
|
|
|
void Put(byte b)
|
|
{Inflator::Put(&b, 1);}
|
|
|
|
void Put(const byte *inString, unsigned int length);
|
|
void InputFinished();
|
|
|
|
private:
|
|
struct huft {
|
|
byte e; /* number of extra bits or operation */
|
|
byte b; /* number of bits in this code or subcode */
|
|
union {
|
|
word16 n; /* literal, length base, or distance base */
|
|
struct huft *t; /* pointer to next level of table */
|
|
} v;
|
|
};
|
|
|
|
int huft_build (unsigned *, unsigned, unsigned, const word16 *, const word16 *,
|
|
huft **, int *);
|
|
int huft_free (huft *);
|
|
int inflate_codes (huft *, huft *, int, int);
|
|
int inflate_stored (void);
|
|
int inflate_fixed (void);
|
|
int inflate_dynamic (void);
|
|
int inflate_block (bool &);
|
|
void flush_output(unsigned int w);
|
|
|
|
static const word16 border[19];
|
|
static const word16 cplens[31];
|
|
static const word16 cplext[31];
|
|
static const word16 cpdist[31];
|
|
static const word16 cpdext[31];
|
|
|
|
static const word16 mask_bits[18];
|
|
|
|
ByteQueue inQueue;
|
|
byte NEXTBYTE();
|
|
|
|
SecByteBlock slide;
|
|
unsigned int wp;
|
|
word32 bb; /* bit buffer */
|
|
unsigned bk; /* bits in bit buffer */
|
|
|
|
bool afterEnd;
|
|
};
|
|
|
|
#endif
|
|
|