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