/*
	rtf2troff.h - rtf2troff defines, structures, externs
*/

/* troff versions understood */

# define	TROFF	0	/* generic troff */
# define	XROFF	1	/* Image Network xroff */
# define	PSTROFF	2	/* ditroff + public domain tpscript backend */

/* macro packages understood */

# define	noMacros	0
# define	meMacros	1
# define	mmMacros	2
# define	msMacros	3


/*
	macro/register names
*/

# define	mHeader		"He"
# define	mHeaderAll	"Ha"
# define	mHeaderFirst	"Hf"
# define	mHeaderLeft	"Hl"
# define	mHeaderRight	"Hr"
# define	mFooter		"Fo"
# define	mFooterAll	"Fa"
# define	mFooterFirst	"Ff"
# define	mFooterLeft	"Fl"
# define	mFooterRight	"Fr"

/* normally Hp > Tm > Bm > Fp */

# define	rTitlePageSpecial	"Tp"
# define	rTopMargin	"Tm"
# define	rHeaderPos	"Hp"
# define	rBottomMargin	"Bm"	/* from *top* of page! */
# define	rFooterPos	"Fp"	/* from *top* of page! */
# define	rHeaderAll	"Ha"
# define	rHeaderFirst	"Hf"
# define	rHeaderLeft	"Hl"
# define	rHeaderRight	"Hr"
# define	rFooterAll	"Fa"
# define	rFooterFirst	"Ff"
# define	rFooterLeft	"Fl"
# define	rFooterRight	"Fr"



/*
	rtfTabLeft is used to indicate the default tab type (left tab).
	RTF assumes that if some other type is not specified, a tab is
	a left tab and never indicates that explicitly.  It's given a
	number here so the writer can refer to it by a constant known
	to be different from the other tab types.  (All "real" token
	numbers are non-negative.)

	rtfLeaderMotion is used to indicate default tab char (motion only),
	which likewise is undefined in RTF.

	rtfNoDestination is used to indicate that a state has had no
	destination specified yet.

	rtfNoBorderType indicates that a paragraph has no borders.
*/

# define	rtfTabLeft		(-1)
# define	rtfLeaderMotion		(-1)
# define	rtfNoDestination	(-1)
# define	rtfNoBorderType		(-1)


# define	styleBold	0x0001
# define	styleItalic	0x0002
# define	styleStrikeThru	0x0004
# define	styleOutline	0x0008
# define	styleShadow	0x0010
# define	styleSmallCaps	0x0020
# define	styleAllCaps	0x0040
# define	styleInvisible	0x0080
# define	styleUnderline	0x0100
# define	styleWUnderline	0x0200

# define	StyleFontBits(s)	(s & (styleBold | styleItalic))

/*
	Values for operations that map border positions onto bits
	in flag word.
*/

# define	borderTop	0x0001
# define	borderBottom	0x0002
# define	borderLeft	0x0004
# define	borderRight	0x0008

/*
	Values for operations that map border positions to array indices.
	Must be zero-based and sequential.
*/

# define	topIndex	0
# define	leftIndex	1
# define	bottomIndex	2
# define	rightIndex	3


# define	lineBreakLen	60	/* break lines after 60 columns */


# define	maxIStack	10	/* internal state stack depth */
# define	maxWStack	3	/* written state stack depth */
# define	maxTab		20
# define	maxCell		20


typedef	struct State		State;
typedef	struct DocState		DocState;
typedef	struct SectState	SectState;
typedef	struct ParState		ParState;
typedef	struct CharState	CharState;

typedef	struct TblState		TblState;	/* this is separate */


/* document properties */

struct DocState
{
	int	landscape;		/* non-zero if landscape */
	double	pageWidth;		/* paper width */
	double	pageHeight;		/* paper height */
	double	leftMargin;		/* left margin */
	double	rightMargin;		/* right margin */
	double	topMargin;		/* top margin */
	double	bottomMargin;		/* bottom margin */
	double	tabWidth;		/* default tab width */
};


/* section properties */

struct SectState
{
	int	breakType;		/* section break type */
	int	pageStart;		/* section starting page number */
	int	pageRestart;		/* restart page numbering each sect. */
	double	headerPos;		/* from top of page */
	double	footerPos;		/* from bottom of page */
	int	titleSpecial;		/* first page special */
};


/* paragraph properties */

struct ParState
{
	double	firstIndent;		/* first indent */
	double	leftIndent;		/* left indent */
	double	rightIndent;		/* right indent */
	double	spaceBefore;		/* space before lines */
	double	spaceAfter;		/* space after lines */
	double	spaceBetween;		/* space between lines */
	int	tabFlag;		/* any tabs set yet? (0 = no) */
	int	nTabs;			/* number of tabs (0 = defaults) */
	double	tab[maxTab];		/* tab positions */
	int	tabType[maxTab];	/* tab types */
	int	tabChar;		/* tab (leader) character */
	int	justification;		/* justification */
	int	borderType;		/* type of border */
	int	borderFlags;		/* where to draw borders */
};


/* character properties */

struct CharState
{
	int	fontSize;		/* font (point) size */
	u_long	charStyle;		/* character style */
	double	superScript;		/* superscript */
	double	subScript;		/* subscript */
};

struct State
{
	int		destination;	/* state destination */
	DocState	docState;
	SectState	sectState;
	ParState	parState;
	CharState	charState;
};


/* table properties */

struct TblState
{
	int	tableHeader;		/* non-zero if table header written */
	int	nCells;			/* number of cells */
	int	curCell;		/* current cell (0-based) */
	double	cellPos[maxCell];	/* cell positions (right edge) */
	double	tableLeft;		/* table left edge position */
	double	cellGap;		/* horiz. gap between cells */
	int	border[maxCell][4];	/* cell borders */
};


extern int	tvers;		/* troff version */
extern int	mvers;		/* macro package version */

extern TblState	*its;
extern int	inTable;

extern FILE	*f;


extern State		*is;		/* current internal state */
extern DocState		*ids;		/* internal document state */
extern SectState	*iss;		/* internal section state */
extern ParState		*ips;		/* internal paragraph state */
extern CharState	*ics;		/* internal character state */

extern State		*ws;		/* written state */
extern DocState		*wds;		/* written document state */
extern SectState	*wss;		/* written section state */
extern ParState		*wps;		/* written paragraph state */
extern CharState	*wcs;		/* written character state */

extern int	docStateChanged;	/* document properties have changed */
extern int	sectStateChanged;	/* section properties have changed */
extern int	parStateChanged;	/* paragraph properties have changed */
extern int	charStateChanged;	/* character properties have changed */

# define	stateChanged	\
	(docStateChanged||sectStateChanged||parStateChanged||charStateChanged)


extern int	indirectionLevel;


extern void	InitState ();
extern void	CheckFinalState ();
extern void	PushIState ();
extern void	PopIState ();
extern void	PushWState ();
extern void	PopWState ();
extern void	BeginDiversion ();
extern void	EndDiversion ();
extern void	RestoreSectDefaults ();
extern void	RestoreParDefaults ();
extern void	RestoreCharDefaults ();


extern void	InitTabSet ();


extern int	MapBorderLocation ();


extern void	SelectFormatterMaps ();
extern void	SelectMacPackMaps ();
extern void	SelectCharSetMaps ();
extern char	*CharMapping ();


extern void	TblAttr ();
extern void	BeginTbl ();
extern void	EndTbl ();
extern void	BeginCell ();
extern void	EndCell ();


extern void	FlushState ();
extern void	FlushInitialState ();
extern void	FlushSectState ();
extern void	Flush ();
extern void	SaveTblFPV ();
extern void	FlushTblFPV ();

extern double	EnWidth ();

extern void	ResetPar ();
extern void	ResetParLine ();
extern void	Sect ();
extern void	Par ();
extern void	PutString ();
extern void	Comment ();
