/*
       rtf.h - RTF document processing stuff.  Distribution 1.06a2.
*/


/*
       Twentieths of a point (twips) per inch (Many RTF measurements
       are in twips per inch (tpi) units).  Assumes 72 points/inch.
*/

# define        rtfTpi          1440

/*
       RTF buffer size (avoids BUFSIZ, which differs across systems)
*/

# define        rtfBufSiz       1024

/*
       Tokens are associated with up to three classification numbers:

       Class number: Broadest (least detailed) breakdown.  For programs
               that only care about gross token distinctions.
       Major/minor numbers: Within their class, tokens have a major
               number, and may also have a minor number to further
               distinquish tokens with the same major number.

       *** Class, major and minor token numbers are all >= 0 ***

       Tokens that can't be classified are put in the "unknown" class.
       For such, the major and minor numbers are meaningless, although
       rtfTextBuf may be of interest then.

       Text tokens are a single character, and the major number indicates
       the character value (note: can be non-ascii, i.e., greater than 127).
       There is no minor number.

       Control symbols may have a parameter value, which will be found in
       rtfParam.  If no parameter was given, rtfParam = rtfNoParam.

       RTFGetToken() return value is the class number, but it sets all the
       global token vars.

       rtfEOF is a fake token used by the reader; the writer never sees
       it (except in the token reader hook, if it installs one).
*/


/*
       Information pertaining to last token read by RTFToken.  The
       text is exactly as it occurs in the input file, e.g., "\{"
       will be found in rtfTextBuf as "\{", even though it means "{".
       These variables are also set when styles are reprocessed.
*/

extern char     rtfTextBuf[rtfBufSiz];  /* text of token */
extern int      rtfTextLen;             /* length of token in rtfTextBuf */
extern int      rtfClass;               /* token class */
extern int      rtfMajor;               /* token major number */
extern int      rtfMinor;               /* token minor number */
extern int      rtfParam;               /* control symbol parameter */


# define        rtfNoParam      (-1000000)


/*
       Token classes (must be zero-based and sequential)
*/

# define        rtfUnknown      0
# define        rtfGroup        1
# define        rtfText         2
# define        rtfControl      3
# define        rtfEOF          4
# define        rtfMaxClass     5       /* highest class + 1 */

/*
       Group class major numbers
*/

# define        rtfBeginGroup   0
# define        rtfEndGroup     1

/*
       Control class major and minor numbers.
*/

# define        rtfVersion      0

# define        rtfDefFont      1

# define        rtfCharSet      2
# define                rtfAnsiCharSet          0
# define                rtfMacCharSet           1
# define                rtfPcCharSet            2
# define                rtfPcaCharSet           3


/*      destination minor numbers should be zero-based, sequential */

# define        rtfDestination  3
# define                rtfPict                 0
# define                rtfNeXTGraphic          1
# define                rtfFootnote             2
# define                rtfHeader               3
# define                rtfHeaderLeft           4
# define                rtfHeaderRight          5
# define                rtfHeaderFirst          6
# define                rtfFooter               7
# define                rtfFooterLeft           8
# define                rtfFooterRight          9
# define                rtfFooterFirst          10
# define                rtfFNSep                11
# define                rtfFNContSep            12
# define                rtfFNContNotice         13
# define                rtfInfo                 14
# define                rtfStyleSheet           15
# define                rtfFontTbl              16
# define                rtfColorTbl             17
# define                rtfField                18
# define                rtfFieldInst            19
# define                rtfFieldResult          20
# define                rtfIndex                21
# define                rtfIndexBold            22
# define                rtfIndexItalic          23
# define                rtfIndexText            24
# define                rtfIndexRange           25
# define                rtfTOC                  26
# define                rtfBookmarkStart        27
# define                rtfBookmarkEnd          28
# define                rtfITitle               29
# define                rtfISubject             30
# define                rtfIAuthor              31
# define                rtfIOperator            32
# define                rtfIKeywords            33
# define                rtfIComment             34
# define                rtfIVersion             35
# define                rtfIDoccomm             36
# define                rtfMaxDestination       37      /* highest dest + 1 */

# define        rtfFontFamily   4
# define                rtfFFNil                0
# define                rtfFFRoman              1
# define                rtfFFSwiss              2
# define                rtfFFModern             3
# define                rtfFFScript             4
# define                rtfFFDecor              5
# define                rtfFFTech               6

# define        rtfColorName    5
# define                rtfRed                  0
# define                rtfGreen                1
# define                rtfBlue                 2

# define        rtfSpecialChar  6
# define                rtfCurHeadPage          0
# define                rtfCurFNote             1
# define                rtfCurHeadPict          2       /* valid? */
# define                rtfCurHeadDate          3
# define                rtfCurHeadTime          4
# define                rtfFormula              5
# define                rtfNoBrkSpace           6
# define                rtfNoReqHyphen          7
# define                rtfNoBrkHyphen          8
# define                rtfPage                 9
# define                rtfLine                 10
# define                rtfPar                  11
# define                rtfSect                 12
# define                rtfTab                  13
# define                rtfCell                 14
# define                rtfRow                  15
# define                rtfCurAnnot             16
# define                rtfAnnotation           17
# define                rtfAnnotID              18
# define                rtfCurAnnotRef          19
# define                rtfFNoteSep             20
# define                rtfFNoteCont            21
# define                rtfColumn               22
# define                rtfOptDest              23
# define                rtfIIntVersion          24
# define                rtfICreateTime          25
# define                rtfIRevisionTime        26
# define                rtfIPrintTime           27
# define                rtfIBackupTime          28
# define                rtfIEditTime            29
# define                rtfIYear                30
# define                rtfIMonth               31
# define                rtfIDay                 32
# define                rtfIHour                33
# define                rtfIMinute              34
# define                rtfINPages              35
# define                rtfINWords              36
# define                rtfINChars              37
# define                rtfIIntID               38

# define        rtfStyleAttr    7
# define                rtfBasedOn              0
# define                rtfNext                 1

# define        rtfDocAttr      8
# define                rtfPaperWidth           0
# define                rtfPaperHeight          1
# define                rtfLeftMargin           2
# define                rtfRightMargin          3
# define                rtfTopMargin            4
# define                rtfBottomMargin         5
# define                rtfFacingPage           6
# define                rtfGutterWid            7
# define                rtfDefTab               8
# define                rtfWidowCtrl            9
# define                rtfHyphHotZone          10
# define                rtfFNoteEndSect         11
# define                rtfFNoteEndDoc          12
# define                rtfFNoteText            13
# define                rtfFNoteBottom          14
# define                rtfFNoteStart           15
# define                rtfFNoteRestart         16
# define                rtfPageStart            17
# define                rtfLineStart            18
# define                rtfLandscape            19
# define                rtfFracWidth            20
# define                rtfNextFile             21
# define                rtfTemplate             22
# define                rtfMakeBackup           23
# define                rtfRTFDefault           24
# define                rtfRevisions            25
# define                rtfMirrorMargin         26
# define                rtfRevDisplay           27
# define                rtfRevBar               28

# define        rtfSectAttr     9
# define                rtfSectDef              0
# define                rtfNoBreak              1
# define                rtfColBreak             2
# define                rtfPageBreak            3
# define                rtfEvenBreak            4
# define                rtfOddBreak             5
# define                rtfPageStarts           6
# define                rtfPageCont             7
# define                rtfPageRestart          8
# define                rtfPageDecimal          9
# define                rtfPageURoman           10
# define                rtfPageLRoman           11
# define                rtfPageULetter          12
# define                rtfPageLLetter          13
# define                rtfPageNumLeft          14
# define                rtfPageNumTop           15
# define                rtfHeaderY              16
# define                rtfFooterY              17
# define                rtfLineModulus          18
# define                rtfLineDist             19
# define                rtfLineStarts           20
# define                rtfLineRestart          21
# define                rtfLineRestartPg        22
# define                rtfLineCont             23
# define                rtfTopVAlign            24
# define                rtfBottomVAlign         25
# define                rtfCenterVAlign         26
# define                rtfJustVAlign           27
# define                rtfColumns              28
# define                rtfColumnSpace          29
# define                rtfColumnLine           30
# define                rtfENoteHere            31
# define                rtfTitleSpecial         32

# define        rtfTblAttr      10
# define                rtfCellBordBottom       0
# define                rtfCellBordTop          1
# define                rtfCellBordLeft         2
# define                rtfCellBordRight        3
# define                rtfRowDef               4
# define                rtfRowLeft              5
# define                rtfRowRight             6
# define                rtfRowCenter            7
# define                rtfRowGapH              8
# define                rtfRowHt                9
# define                rtfRowLeftEdge          10
# define                rtfCellPos              11
# define                rtfMergeRngFirst        12
# define                rtfMergePrevious        13

# define        rtfParAttr      11
# define                rtfParDef               0
# define                rtfStyleNum             1
# define                rtfQuadLeft             2
# define                rtfQuadRight            3
# define                rtfQuadJust             4
# define                rtfQuadCenter           5
# define                rtfFirstIndent          6
# define                rtfLeftIndent           7
# define                rtfRightIndent          8
# define                rtfSpaceBefore          9
# define                rtfSpaceAfter           10
# define                rtfSpaceBetween         11
# define                rtfInTable              12
# define                rtfKeep                 13
# define                rtfKeepNext             14
# define                rtfSideBySide           15
# define                rtfPBBefore             16
# define                rtfNoLineNum            17
# define                rtfTabPos               18
# define                rtfTabRight             19
# define                rtfTabCenter            20
# define                rtfTabDecimal           21
# define                rtfTabBar               22
# define                rtfBorderTop            23
# define                rtfBorderBottom         24
# define                rtfBorderLeft           25
# define                rtfBorderRight          26
# define                rtfBorderBox            27
# define                rtfBorderBar            28
# define                rtfBorderBetween        29
# define                rtfBorderSingle         30
# define                rtfBorderThick          31
# define                rtfBorderShadow         32
# define                rtfBorderDouble         33
# define                rtfBorderDot            34
# define                rtfBorderHair           35
# define                rtfBorderSpace          36
# define                rtfLeaderDot            37
# define                rtfLeaderHyphen         38
# define                rtfLeaderUnder          39
# define                rtfLeaderThick          40

# define        rtfCharAttr     12
# define                rtfPlain                0
# define                rtfBold                 1
# define                rtfItalic               2
# define                rtfStrikeThru           3
# define                rtfOutline              4
# define                rtfShadow               5
# define                rtfSmallCaps            6
# define                rtfAllCaps              7
# define                rtfInvisible            8
# define                rtfFontNum              9
# define                rtfFontSize             10
# define                rtfExpand               11
# define                rtfUnderline            12
# define                rtfWUnderline           13
# define                rtfDUnderline           14
# define                rtfDbUnderline          15
# define                rtfNoUnderline          16
# define                rtfSuperScript          17
# define                rtfSubScript            18
# define                rtfRevised              19
# define                rtfForeColor            20
# define                rtfBackColor            21
# define                rtfGray                 22

# define        rtfPictAttr     13
# define                rtfMacQD                0
# define                rtfWinMetafile          1
# define                rtfWinBitmap            2
# define                rtfPicWid               3
# define                rtfPicHt                4
# define                rtfPicGoalWid           5
# define                rtfPicGoalHt            6
# define                rtfPicScaleX            7
# define                rtfPicScaleY            8
# define                rtfPicScaled            9
# define                rtfPicCropTop           10
# define                rtfPicCropBottom        11
# define                rtfPicCropLeft          12
# define                rtfPicCropRight         13
# define                rtfPixelBits            14
# define                rtfBitmapPlanes         15
# define                rtfBitmapWid            16
# define                rtfPicBinary            17

# define        rtfNeXTGrAttr   14
# define                rtfNeXTGWidth           0
# define                rtfNeXTGHeight          1

# define        rtfFieldAttr    15
# define                rtfFieldDirty           0
# define                rtfFieldEdited          1
# define                rtfFieldLocked          2
# define                rtfFieldPrivate         3

# define        rtfTOCAttr      16
# define                rtfTOCType              0
# define                rtfTOCLevel             1

# define        rtfPosAttr      17
# define                rtfPosX                 0
# define                rtfPosXCenter           1
# define                rtfPosXInside           2
# define                rtfPosXLeft             3
# define                rtfPosXOutSide          4
# define                rtfPosXRight            5
# define                rtfPosY                 6
# define                rtfPosYInline           7
# define                rtfPosYTop              8
# define                rtfPosYCenter           9
# define                rtfPosYBottom           10
# define                rtfAbsWid               11
# define                rtfTextDist             12
# define                rtfRPosMargV            13
# define                rtfRPosPageV            14
# define                rtfRPosMargH            15
# define                rtfRPosPageH            16
# define                rtfRPosColH             17



/*
       RTF font, color and style structures.  Used for font table,
       color table, and stylesheet processing.
*/

typedef struct RTFFont          RTFFont;
typedef struct RTFColor         RTFColor;
typedef struct RTFStyle         RTFStyle;
typedef struct RTFStyleElt      RTFStyleElt;


struct RTFFont
{
       char    *rtfFName;              /* font name */
       int     rtfFNum;                /* font number */
       int     rtfFFamily;             /* font family */
       RTFFont *rtfNextFont;           /* next font in list */
};


/*
       Color values are -1 if the default color for the the color
       number should be used.  The default color is writer-dependent.
*/

struct RTFColor
{
       int             rtfCNum;        /* color number */
       int             rtfCRed;        /* red value */
       int             rtfCGreen;      /* green value */
       int             rtfCBlue;       /* blue value */
       RTFColor        *rtfNextColor;  /* next color in list */
};


struct RTFStyle
{
       char            *rtfSName;      /* style name */
       int             rtfSNum;        /* style number */
       int             rtfSBasedOn;    /* style this one's based on */
       int             rtfSNextPar;    /* style next paragraph style */
       RTFStyleElt     *rtfSSEList;    /* list of style words */
       int             rtfExpanding;   /* non-zero = being expanded */
       RTFStyle        *rtfNextStyle;  /* next style in style list */
};

# define        rtfBasedOnNone  222     /* "no based-on style" */


struct RTFStyleElt
{
       int             rtfSEClass;     /* token class */
       int             rtfSEMajor;     /* token major number */
       int             rtfSEMinor;     /* token minor number */
       int             rtfSEParam;     /* control symbol parameter */
       char            *rtfSEText;     /* text of symbol */
       RTFStyleElt     *rtfNextSE;     /* next element in style */
};


typedef void (*RTFFuncPtr) ();          /* generic function pointer */


/*
       Public RTF reader routines
*/

extern void             RTFInit ();
extern void             RTFSetStream ();
extern void             RTFSetClassCallback ();
extern RTFFuncPtr       RTFGetClassCallback ();
extern void             RTFSetDestinationCallback ();
extern RTFFuncPtr       RTFGetDestinationCallback ();
extern void             RTFRead ();
extern int              RTFGetToken (); /* writer should rarely need this */
extern void             RTFUngetToken ();
extern int              RTFPeekToken ();
extern void             RTFSetToken ();
extern void             RTFSetReadHook ();
extern RTFFuncPtr       RTFGetReadHook ();
extern void             RTFRouteToken ();
extern void             RTFSkipGroup ();
extern void             RTFExpandStyle ();
extern int              RTFCheckCM ();
extern int              RTFCheckCMM ();
extern int              RTFCheckMM ();
extern RTFFont          *RTFGetFont ();
extern RTFColor         *RTFGetColor ();
extern RTFStyle         *RTFGetStyle ();
extern char             *RTFAlloc ();
extern char             *RTFStrSave ();
extern void             RTFFree ();