#define wThisVerMajor  0
#define wThisVerMinor  999

#define bWordFormat 0x80  // Followed by 16 bit text format number
#define bNewLine	0x81  // Newline
#define bNewPara	0x82  // New paragraph
#define bTab		0x83  // Left-aligned tab
#define bBlankLine	0x85  // Followed by 16 bit skip count
#define bInlineObject	0x86  // Followed by inline layout object
#define bWrapObjLeft	0x87  // Left- aligned wrapping object
#define bWrapObjRight	0x88  // Right-aligned wrapping object
#define bEndHotspot 0x89  // End of a hotspot
#define bColdspot	0x8A  // Coldspot for searchable bitmaps
#define bEnd		0xFF  // End of text

// JOHNJOHN
//#define DECOMPRESS_NIL ((UINT16) -1)

#define ByteOff(va) ((va) .bf.byteoff)

typedef struct {
	ULONG	   lcbFc;	  // Size in bytes of Full Context
	VA	   vaPrev;	  // Offset in TP of prev FC
	VA	   vaCurr;	  // Offset to current FCP
	VA	   vaNext;	  // Offset in TP of next FC
	ULONG	   ichText;   // Offset with FCP to text
	ULONG	   lcbText;   // Size of the text portion of FCP
	ULONG	   lcbDisk;   // Size of the text portion of FCP
	COBJRG	   cobjrgP;
	HHF    hhf; 	  // Topic Identifier
	GH	   hphr;	  // Handle to phrase table
} FCINFO;

typedef FCINFO	*  QFCINFO;
typedef FCINFO		*	PFCINFO;
typedef FCINFO *  NPFCINFO;

typedef struct tag_ols {
	LONG  lichText;
	DWORD dwBlockCurr;
	DWORD dwcRegion;
} OLS, *QOLS;

extern PA paGlobal;

#define XPixelsFromPoints(p1, p2) MulDiv(p2, p1->wXAspectMul, p1->wXAspectDiv)
#define YPixelsFromPoints(p1, p2) MulDiv(p2, p1->wYAspectMul, p1->wYAspectDiv)
#define FResolvedQLA(qla)  \
  ((qla)->mla.va.dword != vaNil && (qla)->mla.objrg != objrgNil)

static INT16  STDCALL CbUnpackMOPG(QDE qde, QMOPG qmopg, LPVOID qv);
static INT16  STDCALL CbUnpackMTOP(QMTOP qmtop, LPVOID qv, WORD wHelpVer, VA vaTopic, DWORD lcbTopic, VA vaPostTopicFC, DWORD lcbTopicFC);
//static void STDCALL DestroyHphr(HPHR hphr);
static BOOL STDCALL fFix30MobjCrossing(QMFCP qmfcp, MOBJ *pmobj, LONG lcbBytesLeft, QDE qde, LONG blknum, INT16* qwErr);
//static BOOL STDCALL FGetNextMLTFile(FILE *, PSTR, INT16);
static BOOL STDCALL FGetSystemHeaderHfs(HFS hfs, QHHDR qhhdr);
static BOOL STDCALL FVerifyVersionInfo(QHHDR qhhdr);
static void STDCALL GetTopicFCTextData(QFCINFO qfcinfo, QTOP qtop);
//static HBGH STDCALL HbghReadBitmapHfs(HFS hfs, INT16 cBitmap, LONG *plcb);
static HFC	STDCALL HfcCreate(QDE qde, VA vaCurr, HPHR hphr, INT16* qwErr);
static HFC	STDCALL HfcFindPrevFc(QDE qde, VA vaPos, QTOP qtop, HPHR hphr, INT16* qwErr);
static HFC	STDCALL HfcNextPrevHfc(HFC hfc, BOOL fNext, QDE qde, INT16* qwErr, VA vaMarkTop, VA vaMarkBottom);
static INT16  STDCALL IDoForage(PSTR);
static void STDCALL OutBitmapCountedInfo(QDE, FID, LPBYTE, LPSTR, QOLS);
static void STDCALL OutCommandInfo(DWORD dwRegion, BYTE bCmd);
static void STDCALL OutEndGroupIndex(FID);
static void STDCALL OutError(void);
static void STDCALL OutFCHeaderInfo(FID fid, HFC hfc, QTOP qtop);
static void STDCALL OutFCTerminator(FID);
static void STDCALL OutHashInfo(QDE);
static void STDCALL OutHotspotInfo(LPBYTE);
static void STDCALL OutMOPGInfo(QMOPG);
static void STDCALL OutObjectInfo(QDE, FID, LPBYTE, LPSTR, QOLS);
static void STDCALL OutParaGroupInfo(QDE, FID, LPBYTE, LPSTR, QOLS);
static void STDCALL OutSideBySideInfo(QDE, FID, LPBYTE, LPSTR, QOLS);
static void STDCALL OutStartGroupIndex(FID);
static void STDCALL OutTextInfo(LPSTR qchStart, DWORD dwRegionFirst, DWORD dwRegionLast);
static void STDCALL OutTopicHeaderInfo(FID fid, QTOP qtop, QPA qpa);
static void STDCALL OutTopicTerminator(FID);
static void STDCALL OutWarning(void);
//static RC_TYPE	 STDCALL RcFirstHbt(HBT hbt, KEY key, LPVOID qvRec, QBTPOS qbtpos);
//static VA   STDCALL VaFromHfc(HFC hfc);
static WORD STDCALL WGetIOError(void);
//static void STDCALL CbReadMemQLA(QLA qla, LPBYTE qb, WORD wHelpVersion);
static HFC	STDCALL GetQFCINFO(QDE qde, VA va, HPHR hphr, INT16* qwErr);
//static RC_TYPE STDCALL RcScanBlockVA(GH gh, DWORD lcbRead, LPVOID qmbhd, VA va, OBJRG objrg, DWORD FAR* qdwOffset, WORD wVersion);

//static LPBYTE STDCALL QobjLockHfc(HFC hfc);

//void STDCALL CallbackLphs(LPHS, HANDLE);
void STDCALL FixUpBlock(LPVOID qmbhd, LPVOID qbBuf, WORD wVersion);
void STDCALL OutForageText(FID, DWORD, LPSTR, LONG, BOOL, UINT16);
UINT16 STDCALL CbDecompressQch(LPSTR, LONG, LPSTR, HPHR, UINT16);
VOID STDCALL TranslateMFCP(LPVOID qvDst, LPVOID qvSrc, VA va, WORD wVersion);
VA	 STDCALL VAFromQLA(QLA, QDE);
void STDCALL TranslateMBHD(LPVOID qvDst, LPVOID qvSrc, WORD wVersion);
INT16  STDCALL CbUnpackMOBJ(QMOBJ qmobj, LPVOID qv);
GH	 STDCALL GhFillBuf(QDE, DWORD, LONG*, INT16*);
WORD STDCALL WCopyContext(QDE qde, VA vaPos, LPSTR qchDest, LONG cb);
WORD STDCALL CbDecompressQch(LPSTR qchSrc, LONG lcb, LPSTR qchDest, HPHR hphr, WORD wVersionNo);

INT16 CDECL main( INT16, char *[] );

#ifdef _DEBUG
void STDCALL FVerifyQLA(QLA qla);
void STDCALL FVerifyQMOPG(QMOPG qmopg);
#else
#define FVerifyQLA(qla)
#define FVerifyQMOPG(qmopg)
#endif