|
Packit |
9741aa |
/* ETYPE.H: Definitions for element type and group processing.
|
|
Packit |
9741aa |
*/
|
|
Packit |
9741aa |
#define MCHARS 0x80 /* Model: contains #CHARS. */
|
|
Packit |
9741aa |
#define MGI 0x40 /* Model: contains GI names. */
|
|
Packit |
9741aa |
#define MPHRASE 0x20 /* Model: first token is #CHARS. */
|
|
Packit |
9741aa |
#define MKEYWORD 0x1F /* Model: defined with single keyword. */
|
|
Packit |
9741aa |
#define MNONE 0x10 /* Model: contains no GIs or #CHARS. */
|
|
Packit |
9741aa |
#define MANY 0x08 /* Model: contains any GIs or #CHARS. */
|
|
Packit |
9741aa |
#define MRCDATA 0x04 /* Model: contains RCDATA. */
|
|
Packit |
9741aa |
#define MCDATA 0x02 /* Model: contains CDATA. */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define TOREP (TOPT+TREP) /* 11000000 Optional and repeatable. */
|
|
Packit |
9741aa |
#define TOPT 0x80 /* Token: 1=optional; 0=required. */
|
|
Packit |
9741aa |
#define TREP 0x40 /* Token: 1=repeatable; 0=not. */
|
|
Packit |
9741aa |
#define TXOREP (TXOPT+TXREP) /* * explicitly specified */
|
|
Packit |
9741aa |
#define TXOPT 0x20 /* ? explicitly specified */
|
|
Packit |
9741aa |
#define TXREP 0x10 /* + explicitly specified */
|
|
Packit |
9741aa |
#define TTMASK 0x0F /* 00001111 Mask for testing token type. */
|
|
Packit |
9741aa |
#define TTETD 4 /* 00000100 Token is an ETD. */
|
|
Packit |
9741aa |
#define TTAND 3 /* 00000011 Token is an AND group. */
|
|
Packit |
9741aa |
#define TTSEQ 2 /* 00000010 Token is a sequence group. */
|
|
Packit |
9741aa |
#define TTOR 1 /* 00000001 Token is an OR group. */
|
|
Packit |
9741aa |
#define TTCHARS 0 /* 00000000 Token is #CHARS. */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
struct thdr { /* Token header or model header. */
|
|
Packit |
9741aa |
UNCH ttype; /* Token type attributes or model content. */
|
|
Packit |
9741aa |
union {
|
|
Packit |
9741aa |
int tnum; /* Group token: tokens in group.
|
|
Packit |
9741aa |
Model header: content tokens at any level. */
|
|
Packit |
9741aa |
struct etd *thetd; /* GI token: ptr to etd. */
|
|
Packit |
9741aa |
} tu;
|
|
Packit |
9741aa |
};
|
|
Packit |
9741aa |
#define THSZ (sizeof(struct thdr))
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define ETDHASH 211 /* Size of element hash table. Must be prime. */
|
|
Packit |
9741aa |
#define SMO 0x40 /* ETDMIN: Start-tag O minimization. */
|
|
Packit |
9741aa |
#define EMO 0x04 /* ETDMIN: End-tag O minimization. */
|
|
Packit |
9741aa |
#define EMM 0x02 /* ETDMIN: End-tag minimization explicitly
|
|
Packit |
9741aa |
specified to be minus */
|
|
Packit |
9741aa |
#define ETDDCL 0x80 /* ETDMIN: Element was declared. */
|
|
Packit |
9741aa |
#define ETDUSED 0x20 /* ETDMIN: Element used in another declaration. */
|
|
Packit |
9741aa |
#define ETDOCC 0x10 /* ETDMIN: Element occurred in document. */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
struct etd { /* Element type definition. */
|
|
Packit |
9741aa |
struct etd *etdnext; /* Next element type definition in hash chain. */
|
|
Packit |
9741aa |
UNCH *etdgi; /* GI preceded by its length, followed by EOS. */
|
|
Packit |
9741aa |
UNCH etdmin; /* Flag bits: minimization. */
|
|
Packit |
9741aa |
UNCH mark; /* Mark bit: for ambiguity checking */
|
|
Packit |
9741aa |
struct thdr *etdmod; /* Content model. */
|
|
Packit |
9741aa |
struct etd **etdmex; /* Minus exceptions. */
|
|
Packit |
9741aa |
struct etd **etdpex; /* Plus exceptions. */
|
|
Packit |
9741aa |
struct ad *adl; /* Attribute descriptor list. */
|
|
Packit |
9741aa |
struct entity **etdsrm; /* Short reference map. */
|
|
Packit |
9741aa |
};
|
|
Packit |
9741aa |
#define ETDSZ (sizeof(struct etd))
|
|
Packit |
9741aa |
typedef struct etd *PETD;
|
|
Packit |
9741aa |
extern struct etd dumetd[];
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
/* Number of bits in a long must be >= 1<
|
|
Packit |
9741aa |
#define LONGPOW 5
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define LONGBITS (1<
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
struct mpos { /* Position of current element in model. */
|
|
Packit |
9741aa |
UNCH g; /* Index of this group in the model. */
|
|
Packit |
9741aa |
UNCH t; /* Index of the current token in this group. */
|
|
Packit |
9741aa |
unsigned long *h; /* Hit bits of this group's tokens. */
|
|
Packit |
9741aa |
};
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define HITCLEAR(h) MEMZERO((UNIV)(h), grplongs*sizeof(unsigned long))
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define TAGCONER 0x01 /* 00000001 (contersw) Tag was out of context. */
|
|
Packit |
9741aa |
#define TAGNET 0x02 /* 00000010 (etisw) Tag has NET enabled. */
|
|
Packit |
9741aa |
#define TAGPEX 0x04 /* 00000100 (pexsw) Tag was plus exception. */
|
|
Packit |
9741aa |
#define TAGREF 0x08 /* 00001000 (conrefsw) Tag had CONREF or EMPTY.*/
|
|
Packit |
9741aa |
struct tag { /* Tag control block. */
|
|
Packit |
9741aa |
UNCH status; /* Status of context check. */
|
|
Packit |
9741aa |
UNCH tflags; /* Flags: TAGCONER TAGNET TAGPEX TAGREF */
|
|
Packit |
9741aa |
struct etd *tetd; /* Element type definition for tag. */
|
|
Packit |
9741aa |
struct entity **tsrm; /* Current short reference map. */
|
|
Packit |
9741aa |
struct mpos *tpos; /* Position of next tag in this model. */
|
|
Packit |
9741aa |
};
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#define RCEND 1 /* No more tokens: end element and retry GI. */
|
|
Packit |
9741aa |
#define RCREQ 2 /* Required GI must precede proposed GI. */
|
|
Packit |
9741aa |
#define RCMISS 3 /* GI invalid: not element end; no required GI. */
|
|
Packit |
9741aa |
#define RCHIT 4 /* GI is the one expected next. */
|
|
Packit |
9741aa |
#define RCMEX 5 /* GI invalid: minus exception. */
|
|
Packit |
9741aa |
#define RCHITMEX 6 /* RCMEX with invalid attempted minus exclusion.*/
|
|
Packit |
9741aa |
#define RCPEX 7 /* GI is valid solely because of plus exclusion.*/
|
|
Packit |
9741aa |
#define RCNREQ 8 /* Token is not required; can retry invalid GI. */
|