/* ETYPE.H: Definitions for element type and group processing.
*/
#define MCHARS    0x80        /* Model: contains #CHARS. */
#define MGI       0x40        /* Model: contains GI names. */
#define MPHRASE   0x20        /* Model: first token is #CHARS. */
#define MKEYWORD  0x1F        /* Model: defined with single keyword. */
#define MNONE     0x10        /* Model: contains no GIs or #CHARS. */
#define MANY      0x08        /* Model: contains any GIs or #CHARS. */
#define MRCDATA   0x04        /* Model: contains RCDATA. */
#define MCDATA    0x02        /* Model: contains CDATA. */

#define TOREP (TOPT+TREP)     /* 11000000 Optional and repeatable. */
#define TOPT      0x80        /* Token: 1=optional; 0=required. */
#define TREP      0x40        /* Token: 1=repeatable; 0=not. */
#define TXOREP (TXOPT+TXREP)  /* * explicitly specified */
#define TXOPT     0x20	      /* ? explicitly specified */
#define TXREP     0x10	      /* + explicitly specified */
#define TTMASK    0x0F        /* 00001111 Mask for testing token type. */
#define TTETD        4        /* 00000100 Token is an ETD. */
#define TTAND        3        /* 00000011 Token is an AND group. */
#define TTSEQ        2        /* 00000010 Token is a sequence group. */
#define TTOR         1        /* 00000001 Token is an OR group. */
#define TTCHARS      0        /* 00000000 Token is #CHARS. */

struct thdr {                 /* Token header or model header. */
     UNCH ttype;              /* Token type attributes or model content. */
     union {
          int tnum;           /* Group token: tokens in group. 
				 Model header: content tokens at any level. */
          struct etd *thetd;  /* GI token: ptr to etd. */
     } tu;
};
#define THSZ (sizeof(struct thdr))

#define ETDHASH   211	      /* Size of element hash table. Must be prime. */
#define SMO       0x40        /* ETDMIN: Start-tag O minimization. */
#define EMO       0x04        /* ETDMIN: End-tag O minimization. */
#define EMM       0x02	      /* ETDMIN: End-tag minimization explicitly
				 specified to be minus */
#define ETDDCL    0x80        /* ETDMIN: Element was declared. */
#define ETDUSED   0x20        /* ETDMIN: Element used in another declaration. */
#define ETDOCC    0x10        /* ETDMIN: Element occurred in document. */

struct etd {                  /* Element type definition. */
     struct etd *etdnext;     /* Next element type definition in hash chain. */
     UNCH *etdgi;	      /* GI preceded by its length, followed by EOS. */
     UNCH etdmin;             /* Flag bits: minimization. */
     UNCH mark;		      /* Mark bit: for ambiguity checking */
     struct thdr *etdmod;     /* Content model. */
     struct etd **etdmex;     /* Minus exceptions. */
     struct etd **etdpex;     /* Plus exceptions. */
     struct ad *adl;          /* Attribute descriptor list. */
     struct entity **etdsrm;  /* Short reference map. */
};
#define ETDSZ (sizeof(struct etd))
typedef struct etd *PETD;
extern struct etd dumetd[];

/* Number of bits in a long must be >= 1<<LONGPOW */
#define LONGPOW 5

#define LONGBITS (1<<LONGPOW)

struct mpos {                 /* Position of current element in model. */
     UNCH g;                  /* Index of this group in the model. */
     UNCH t;                  /* Index of the current token in this group. */
     unsigned long *h;	      /* Hit bits of this group's tokens. */
};

#define HITCLEAR(h) MEMZERO((UNIV)(h), grplongs*sizeof(unsigned long))

#define TAGCONER  0x01        /* 00000001 (contersw) Tag was out of context. */
#define TAGNET    0x02        /* 00000010 (etisw)    Tag has NET enabled. */
#define TAGPEX    0x04        /* 00000100 (pexsw)    Tag was plus exception. */
#define TAGREF    0x08        /* 00001000 (conrefsw) Tag had CONREF or EMPTY.*/
struct tag {                  /* Tag control block. */
     UNCH   status;           /* Status of context check. */
     UNCH   tflags;           /* Flags: TAGCONER TAGNET TAGPEX TAGREF */
     struct etd *tetd;        /* Element type definition for tag. */
     struct entity **tsrm;    /* Current short reference map. */
     struct mpos *tpos;       /* Position of next tag in this model. */
};

#define RCEND    1            /* No more tokens: end element and retry GI. */
#define RCREQ    2            /* Required GI must precede proposed GI. */
#define RCMISS   3            /* GI invalid: not element end; no required GI. */
#define RCHIT    4            /* GI is the one expected next. */
#define RCMEX    5            /* GI invalid: minus exception. */
#define RCHITMEX 6            /* RCMEX with invalid attempted minus exclusion.*/
#define RCPEX    7            /* GI is valid solely because of plus exclusion.*/
#define RCNREQ   8            /* Token is not required; can retry invalid GI. */
