tripwire-open-source/src/cryptlib/zinflate.h

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