#ifndef WH_MCC_H_87ee5026_ #define WH_MCC_H_87ee5026_ #include #include "config.h" #include "ebuf.h" #define MAXP3UNGET 4 // never want to unget more than 4 chars #define MAXP4PUSH 4 // never need to push more than 4 pp-tokens #define MAXVAL 8 // max # octets for integer value #define MAXFDIGS 64 // max # digits in floating point typedef enum { PPT_EOF = 1, PPT_NEWLINE, PPT_WHITESPACE, PPT_HEADERNAME, PPT_IDENT, PPT_NUMBER, PPT_CHARCONST, PPT_STRING, PPT_PUNCT, PPT_OTHER, // other single character PPT_MARKER, // internal only - see 6.10 PPT_ENDMACRO, // internal only - not C99-specified PPT_SYNTH, // internal only - synthesized by ## PPT_MACROARG, // internal only - macro argument PPT_LINE, // internal only - rest of line } PPTOKTYPE; typedef enum { TT_ERROR = 1, TT_EOF, TT_KEY, // keyword TT_IDENT, // identifier TT_CONST, // constant TT_STRING, // string-literal TT_PUNCT, // punctuator } TOKTYPE; typedef enum { PUNCT_LBRACK = 1, // [ PUNCT_RBRACK, // ] PUNCT_LPAREN, // ( PUNCT_RPAREN, // ) PUNCT_LBRACE, // { PUNCT_RBRACE, // } PUNCT_DOT, // . PUNCT_ARROW, // -> PUNCT_PLUSPLUS, // ++ PUNCT_MINUSMINUS, // -- PUNCT_AND, // & PUNCT_STAR, // * PUNCT_PLUS, // + PUNCT_MINUS, // - PUNCT_TILDE, // ~ PUNCT_BANG, // ! PUNCT_SLASH, // / PUNCT_PERCENT, // % PUNCT_LSH, // << PUNCT_RSH, // >> PUNCT_LT, // < PUNCT_GT, // > PUNCT_LEQ, // <= PUNCT_GEQ, // >= PUNCT_EQ, // == PUNCT_NEQ, // != PUNCT_HAT, // ^ PUNCT_OR, // | PUNCT_ANDAND, // && PUNCT_OROR, // || PUNCT_QUESTION, // ? PUNCT_COLON, // : PUNCT_SEMI, // ; PUNCT_ELLIPSIS, // ... PUNCT_ASSIGN, // = PUNCT_MULASGN, // *= PUNCT_DIVASGN, // /= PUNCT_MODASGN, // %= PUNCT_ADDASGN, // += PUNCT_SUBASGN, // -= PUNCT_LSHASGN, // <<= PUNCT_RSHASGN, // >>= PUNCT_ANDASGN, // &= PUNCT_XORASGN, // ^= PUNCT_ORASGN, // |= PUNCT_COMMA, // , PUNCT_SHARP, // # PUNCT_SSHARP, // ## } PUNCTTYPE; typedef enum { KEY__NOKEY = 1, // not a keyword KEY_AUTO, KEY_BREAK, KEY_CASE, KEY_CHAR, KEY_CONST, KEY_CONTINUE, KEY_DEFAULT, KEY_DO, KEY_DOUBLE, KEY_ELSE, KEY_ENUM, KEY_EXTERN, KEY_FLOAT, KEY_FOR, KEY_GOTO, KEY_IF, KEY_INLINE, KEY_INT, KEY_LONG, KEY_REGISTER, KEY_RESTRICT, KEY_RETURN, KEY_SHORT, KEY_SIGNED, KEY_SIZEOF, KEY_STATIC, KEY_STRUCT, KEY_SWITCH, KEY_TYPEDEF, KEY_UNION, KEY_UNSIGNED, KEY_VOID, KEY_VOLATILE, KEY_WHILE, // also _Bool, _Complex, _Imaginary } KEYWORD; typedef enum { P2S_NORMAL = 1, P2S_BACKSLASH, P2S_CONT, P2S_PUSHED, } P2STATE; typedef enum { IFS_FALSE = 1, IFS_TRUE, IFS_OVER, IFS_ELSE_F, IFS_ELSE_T, IFS_NEST, } IFSTATE; typedef enum { CST_INT = 1, CST_UINT, CST_LONG, CST_ULONG, CST_LLONG, CST_ULLONG, CST_FLOAT, CST_DOUBLE, CST_LDOUBLE, } CSTTYPE; typedef long long int PPVAL; typedef struct srcfile SRCFILE; typedef struct pptoken PPTOKEN; typedef struct token TOKEN; typedef struct str STR; typedef struct istack ISTACK; typedef struct ifstack IFSTACK; typedef struct pptlist PPTLIST; typedef struct macro MACRO; typedef struct macroexpander MACROEXPANDER; typedef struct stringizer STRINGIZER; typedef struct pptconc PPTCONC; typedef struct concatter CONCATTER; typedef struct expreval EXPREVAL; typedef struct eflag_state EFLAG_STATE; typedef struct cl CL; typedef struct p2p3 P2P3; typedef struct verbdest VERBDEST; typedef struct strlist STRLIST; typedef struct strtconc STRTCONC; typedef struct vfpriv VFPRIV; #ifdef SFLOGGING typedef struct sfref SFREF; struct sfref { SRCFILE *sf; SFREF *flink; SFREF *blink; char *text; } ; #else typedef SRCFILE *SFREF; #endif struct strtconc { STRLIST *head; STRLIST **tail; } ; struct strlist { STRLIST *link; const char *s; } ; struct verbdest { VERBDEST *link; int plen; char *place; FILE *f; FILE *g; int atnl; unsigned int mask; } ; struct cl { int c; int l; } ; struct eflag_state { int line; SFREF file; int atnl; int atws; PPTOKTYPE lasttt; FILE *to; } ; struct pptconc { PPTLIST *head; PPTLIST **tail; } ; struct concatter { PPTCONC list; PPTCONC last[2]; } ; struct stringizer { void (*put)(unsigned char, void *); void *putarg; int started; } ; struct str { char *data; int len; int needsfree; } ; struct macro { MACRO *link; STR name; unsigned int flags; #define MF_HASARGS 0x00000001 #define MF_VARARGS 0x00000002 #define MF_DISABLED 0x00000004 int nargs; PPTOKEN **args; PPTLIST *replacement; } ; struct macroexpander { PPTCONC done; MACRO *curmac; PPTOKEN *name; PPTCONC arglist; int argnest; PPTLIST *pending; } ; struct ifstack { IFSTACK *link; SFREF start_sf; int start_line; IFSTATE state; } ; struct pptlist { PPTLIST *link; PPTOKEN *token; } ; struct istack { ISTACK *link; SFREF sf; } ; struct srcfile { SFREF link; char *name; FILE *f; int lno; #ifdef SFLOGGING SFREF *reflist; #endif int nrefs; } ; struct pptoken { PPTOKTYPE type; STR str; SFREF file; int startline; union { PUNCTTYPE punct; // PPT_PUNCT unsigned char other; // PPT_OTHER MACRO *macro; // PPT_ENDMACRO struct { // PPT_MACROARG int argno; unsigned int flags; #define MAF_NOEXPAND 0x00000001 } macroarg; } detail; } ; struct token { TOKTYPE type; SFREF file; int startline; union { const char *err; // TT_ERROR KEYWORD key; // TT_KEY STR ident; // TT_IDENT struct { // TT_CONST CSTTYPE type; unsigned char val[MAXVAL]; } cst; STR string; // TT_STRING PUNCTTYPE punct; // TT_PUNCT } u; } ; struct expreval { PPTLIST *list; void (*fail)(void); } ; struct p2p3 { P2STATE s2; CL backslash; CL push2; int n3unget; CL unget3[MAXP3UNGET]; EBUF buf3; PPTOKEN *push3; } ; struct vfpriv { VFPRIV *flink; VFPRIV *blink; unsigned int mask; EBUF eb; int line; } ; extern void panic(void) __attribute__((__noreturn__)); #endif