/************************************************************************
*																		*
*  HALL.H 																*
*																		*
*  Copyright (C) Microsoft Corporation 1994 							*
*  All Rights reserved. 												*
*																		*
************************************************************************/

// HALL.h -- CCompressTable class definition

#ifndef __HALL_H__

#define __HALL_H__

typedef void *PVOID;


#define NDX_LOW_CLASS	 0x00
#define NDX_MEDIUM_CLASS 0x01
#define LITERAL_CLASS	 0x02
#define SPACES_CLASS	 0x03
#define NULL_CLASS		 0x04
#define SPACE_TOKEN_LIMIT  17

#define SYMBOL_CHAR 1

typedef struct _ENCODE // JOHN
	{
	BYTE fClass;
	BYTE abCode[3];
	} ENCODE;
typedef ENCODE *PENCODE;

typedef struct _WEIGHT // JOHN
		{
		BOOL		bSymbol;
		int 		cb;
		PSTR	   pb;
		} WEIGHT;
typedef WEIGHT FAR *PWEIGHTS;

typedef struct _JIndexHdr
	{
	DWORD cBits  :	5;
	DWORD cCount : 19;
	DWORD Magic  :	8;
	} JBITHDR;


#define ENCODE_LIMIT  1024
#ifdef _DEBUG
extern int iNumLiterals;
extern int iNumLiteralBytes;
#endif

class CCompressTable
{
public:

	static CCompressTable* STDCALL NewCompressTable(PBYTE pbImage, LONG cbImage, PBYTE pbIndex, LONG cbIndex);

	~CCompressTable();

	int STDCALL DeCompressString(PSTR pbComp, PSTR pbDecomp, int cbComp);  // JOHN

private:


	PWEIGHTS		 m_pWeights;		// JOHN
    PBYTE			 m_pTableImage;
};


#define BITS_AVAIL (sizeof(DWORD) * 8)

class CJCode
{
public:
	CJCode(int base, int cCount, PSTR pv);
	int GetNextDelta(void);
    BOOL IsSymbol();
    void NextFlagBits();

private:
	int GetBits(void);

	DWORD *m_pData;
	DWORD *m_pDataCurrent;
	int  m_cCount;
	int  m_cCurrent;
	int  m_base;
	DWORD  m_fBasisMask;
	int  m_iLeft;
};


#endif __HALL_H__