/*
       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 ();