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


/*
       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.

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


/*
       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 */

/*
       Brace 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                rtfFootnote             1
# define                rtfHeader               2
# define                rtfHeaderLeft           3
# define                rtfHeaderRight          4
# define                rtfHeaderFirst          5
# define                rtfFooter               6
# define                rtfFooterLeft           7
# define                rtfFooterRight          8
# define                rtfFooterFirst          9
# define                rtfFNSep                10
# define                rtfFNContSep            11
# define                rtfFNContNotice         12
# define                rtfInfo                 13
# define                rtfStyleSheet           14
# define                rtfFontTbl              15
# define                rtfColorTbl             16
# define                rtfField                17
# define                rtfFieldInst            18
# define                rtfFieldResult          19
# define                rtfIndex                20
# define                rtfIndexBold            21
# define                rtfIndexItalic          22
# define                rtfIndexText            23
# define                rtfIndexRange           24
# define                rtfTOC                  25
# define                rtfBookmarkStart        26
# define                rtfBookmarkEnd          27
# define                rtfITitle               28
# define                rtfISubject             29
# define                rtfIAuthor              30
# define                rtfIOperator            31
# define                rtfIKeywords            32
# define                rtfIComment             33
# define                rtfIVersion             34
# define                rtfIDoccomm             35
# define                rtfMaxDestination       36      /* 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        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        rtfFieldAttr    14
# define                rtfFieldDirty           0
# define                rtfFieldEdited          1
# define                rtfFieldLocked          2
# define                rtfFieldPrivate         3

# define        rtfTOCAttr      15
# define                rtfTOCType              0
# define                rtfTOCLevel             1

# define        rtfPosAttr      16
# 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 */
};


/*
       Public RTF reader routines
*/

extern void     RTFInit ();
extern void     RTFSetStream ();
extern void     RTFSetClassCallback ();
extern void     (*RTFGetClassCallback ()) ();
extern void     RTFSetDestinationCallback ();
extern void     (*RTFGetDestinationCallback ()) ();
extern void     RTFRead ();
extern int      RTFGetToken (); /* writer should rarely need this */
extern void     RTFSetToken ();
extern void     RTFSetReadHook ();
extern void     (*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 ();