/*************************************************************************
**
** helpmake.h - misc definitions common to helpmake
**
**	Copyright <C> 1987, Microsoft Corporation
**
** Revision History:
**
**	31-Jul-1990 ln	csVal takes a param.
**      04-Jul-1990 JCK Add F_LOCALCONTEXT to allow escaped @
**	28-Oct-1988 ln	Add parameter to rlCompress
**	12-Aug-1988 ln	Add COLMAX, local context routines & pass1a
**  []	18-Dec-1987 LN	Created
**
*************************************************************************/

/************************************************************************
**
** Includes required for subsequent definitions in this file.
*/
#include "help.h"			// structires & constants
#include "helpfile.h"			// help file structure
#include "helpsys.h"			// misc commn defs
#include "hmmsg.h"			// error message numbers
#include "farutil.h"			// far memory utils
#include "vm.h" 			// virtual memory management

/*************************************************************************
**
** definitions
**
*/
#define	TRUE	1
#define	FALSE	0

#define ASTACKSIZE	50		// size of attribute stack
#define BUFSIZE 	512		// size of line buffers
#define CBFBUF		64000		// size of far buffer(s)
#define CBIOBUF 	16000		// file buffer size (60k)
#define CBRTFMAX	40		// max length of RTF keyword
#define CBSZCONTEXT	60000		// context string buffer size
#define CCONTEXTMAX	10000		// max number of contexts
#define CTOPICSMAX	10000		// max number of topics
#define COLMAX		250		// max column we can run into
#define FBUFSIZE	2048		// size of buffers used
#define MAXBACKC	128		// max number of back-up characters

#define F_RTF		1		// RTF file type
#define F_QH		2		// QuickHelp format
#define F_MINASCII	3		// minimal ascii
#define F_MAX		3		// maximum

#define F_LOCALCONTEXT  0xff            // marker for local context

#define CMP_RUNLENGTH	0x01		// runlength encoding
#define CMP_KEYWORD	0x02		// base keyword encoding
#define CMP_KEYWORD2	0x04		// "agressive" keyword
#define CMP_HUFFMAN	0x08		// huffman encoding
#define CMP_MAX 	0x0f		// maximum

/*
** formatting tokens. Embedded in non-rtf text, and converter from (longer)
** rtf equivalents by the RTF stripper.
*/
#define FM_ANCHOR	'a' | 0xff00	// anchor cross reference
#define FM_PLAIN	'p' | 0xff00	// plain text
#define FM_BOLD 	'b' | 0xff00	// bold text
#define FM_ITALIC	'i' | 0xff00	// italic
#define FM_HIDDEN	'v' | 0xff00	// hidden text
#define FM_UNDERLINE	'u' | 0xff00	// underline
#define FM_DEFAULT	'd' | 0xff00	// paragraph defaults
#define FM_FINDENT	'f' | 0xff00	// first line indent
#define FM_LINDENT	'l' | 0xff00	// paragraph left indent
#define FM_TAB		't' | 0xff00	// tab character
#define FM_LINE 	'n' | 0xff00	// exlicit line break
#define FM_BLOCKBEG	'{' | 0xff00	// block begin
#define FM_BLOCKEND	'}' | 0xff00	// block begin

typedef char    buffer[256];            // line buffer
typedef char	f;			// boolean

struct kwi {				// keyword info structure
    char far	*fpszKw;		// pointer to the actual keyword
    int 	cbKw;			// length of keyword
    ushort	cKwInst;		// count of keyword instances
    ushort	cKwSpInst;		// count of keyword-space instances
    int 	savings;		// computed savings for this word
    };

/*
** transitem
** dotcommand translation item
*/
struct transitem {
    char    *pdotcmd;			// original dot command
    int     cbdotcmd;			// length of said dot command
    char    *pnewcmd;			// replacement command
    char    cbnewcmd;			// length of said new cmd
    };

// context string
// context string item in a linked list
//
typedef struct _cshdr {
    va	    vaNext;			// next item in list or NULL
    va	    vaTopic;			// va of topic
    uchar   cbszCs;			// length of context string + null
    } cshdr;

typedef struct _cs {
    cshdr   cshdr;			// header info
    buffer  szCs;			// context string + terminating null
    } cs;

/*
** verbosity level definitions.
*/
#define V_BANNER	(verbose >= 1)	// (default) print banner
#define V_PASSES	(verbose >= 2)	// print pass names
#define V_CONTEXTS	(verbose >= 3)	// print contexts on 1st pass
#define V_CONTEXTS2	(verbose >= 4)	// print contexts on each pass
#define V_STEPS 	(verbose >= 5)	// print intermediate steps
#define V_STATS 	(verbose >= 6)	// print statistics
#define V_DSTATS	(verbose >= 10) // print debug statistics
#define V_ARGS		(verbose >= 20) // print prog arguments
#define V_KEYWORD	(verbose >= 30) // print keyword table
#define V_HUFFMAN	(verbose >= 40) // print huffman table

/************************************************************************
**
** HelpMake function forward definitions
*/
void	    pascal	AddContextString (char *);
va	    pascal	AddKw (uchar far *);
void	    pascal	addXref (uchar *, uchar *, ushort, ushort);
void	    pascal	BackUp (int);
void	    pascal	BackUpToken (int);
uchar *     pascal	basename (uchar *);
void	    pascal	ContextVA (va);
ushort	    pascal	counttab (struct hnode *, int, ulong);
void	    pascal	decode (int, char **, int, f);
int	    pascal	DofarWrite (int, uchar far *, int);
void	    pascal	DumpRtf (uchar far *, nc, int, f);
void	    pascal	encode (int, char **, int);
f	    pascal	fControlLine (void);
va	    pascal	FindKw	(uchar far *, f);
int	    pascal	getcProc (void);
int	    pascal	getcQH (void);
int	    pascal	getcRTF (void);
void	    pascal	help ();
void	    pascal	hmerror (ushort, uchar *, ulong);
f	    pascal	hmmsg (ushort);
int			hnodecomp (struct hnode **, struct hnode **);
void	    pascal	HuffBuild (void);
void	    pascal	HuffCompress (uchar far *, uchar far *);
ushort	    pascal	HuffDump (void);
void	    pascal	HuffInit (void);
void	    pascal	HuffFreq (uchar far *, ushort);
void	    pascal	HuffStats (void);
uchar *     pascal	getFarMsg (ushort, uchar *);
void	    pascal	InitOutput (int);
void	    pascal	kwAnal (uchar far *, int);
void	    pascal	kwCompress (uchar far *);
f	    pascal	kwSepar (char);
mh	    pascal	LoadPortion (int, mh);
ushort	    pascal	LocalContext (uchar *, ushort);
void	    pascal	LocalContextFix (uchar far *);
ushort	    pascal	MapLocalContext (ushort);
int	    pascal	NextChar (void);
char *	    pascal	NextContext (f);
uchar *     pascal	NextLine (void);
long	    pascal	NextNum (void);
void	    pascal	parserefs (uchar *, uchar *);
void	    pascal	pass1 (int, char **);
void	    pascal	pass1a (void);
void	    pascal	pass2 (void);
void	    pascal	pass3 (void);
void	    pascal	passfa (void);
void	    pascal	passfb (int);
uchar	    pascal	PopAttr (void);
f	    pascal	procRTF (char *, char *);
void	    pascal	PushAttr (uchar);
void	    pascal	rlCompress (uchar far *, ushort);
int	    pascal	SkipDest (int,char **);
void	    pascal	SkipSpace (void);
void	    pascal	SkipVal (char **);
void	    pascal	SortKw (void);
void	    pascal	split (int, char **);
uchar *     pascal	trim (uchar *, f);

#ifdef DEBUG
void	    pascal	csVal (va);
#else
#define csVal(x)
#endif