1*cdf0e10cSrcweir /* $Id: cpp.h,v 1.4 2006-06-20 05:07:28 hr Exp $ */ 2*cdf0e10cSrcweir 3*cdf0e10cSrcweir #define INS 32768 /* input buffer */ 4*cdf0e10cSrcweir #define OBS 8092 /* outbut buffer */ 5*cdf0e10cSrcweir #define NARG 32 /* Max number arguments to a macro */ 6*cdf0e10cSrcweir #define NINCLUDE 48 /* Max number of include directories (-I) */ 7*cdf0e10cSrcweir #define NIF 64 /* depth of nesting of #if */ 8*cdf0e10cSrcweir #define NINC 32 /* depth of nesting of #include */ 9*cdf0e10cSrcweir 10*cdf0e10cSrcweir #ifndef EOF 11*cdf0e10cSrcweir #define EOF (-1) 12*cdf0e10cSrcweir #endif 13*cdf0e10cSrcweir 14*cdf0e10cSrcweir #ifndef NULL 15*cdf0e10cSrcweir #define NULL 0 16*cdf0e10cSrcweir #endif 17*cdf0e10cSrcweir 18*cdf0e10cSrcweir typedef unsigned char uchar; 19*cdf0e10cSrcweir 20*cdf0e10cSrcweir enum toktype 21*cdf0e10cSrcweir { 22*cdf0e10cSrcweir END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP, 23*cdf0e10cSrcweir EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS, 24*cdf0e10cSrcweir ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS, 25*cdf0e10cSrcweir TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST, 26*cdf0e10cSrcweir COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET, 27*cdf0e10cSrcweir ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH, 28*cdf0e10cSrcweir ASRSH, ASOR, ASAND, ELLIPS, 29*cdf0e10cSrcweir DSHARP1, NAME1, NAME2, DEFINED, UMINUS, ARCHITECTURE, IDENT, 30*cdf0e10cSrcweir COMMENT 31*cdf0e10cSrcweir }; 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir enum kwtype 34*cdf0e10cSrcweir { 35*cdf0e10cSrcweir KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KINCLUDENEXT, 36*cdf0e10cSrcweir KIMPORT, KDEFINE, KUNDEF, KLINE, KERROR, KPRAGMA, KIDENT, KDEFINED, 37*cdf0e10cSrcweir KMACHINE, KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL 38*cdf0e10cSrcweir }; 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #define ISDEFINED 0x01 /* has #defined value */ 41*cdf0e10cSrcweir #define ISKW 0x02 /* is PP keyword */ 42*cdf0e10cSrcweir #define ISUNCHANGE 0x04 /* can't be #defined in PP */ 43*cdf0e10cSrcweir #define ISMAC 0x08 /* builtin macro, e.g. __LINE__ */ 44*cdf0e10cSrcweir #define ISARCHITECTURE 0x10 /* architecture */ 45*cdf0e10cSrcweir #define ISACTIVE 0x80 /* is macro currently expanded */ 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir #define EOB 0xFE /* sentinel for end of input buffer */ 48*cdf0e10cSrcweir #define EOFC 0xFD /* sentinel for end of input file */ 49*cdf0e10cSrcweir #define XPWS 1 /* token flag: white space to assure token sep. */ 50*cdf0e10cSrcweir #define XTWS 2 51*cdf0e10cSrcweir 52*cdf0e10cSrcweir typedef struct token 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir unsigned char type; 55*cdf0e10cSrcweir unsigned char flag; 56*cdf0e10cSrcweir unsigned int wslen; 57*cdf0e10cSrcweir unsigned int len; 58*cdf0e10cSrcweir uchar *t; 59*cdf0e10cSrcweir unsigned int identifier; /* used from macro processor to identify where a macro becomes valid again. */ 60*cdf0e10cSrcweir } Token; 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir typedef struct tokenrow 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir Token *tp; /* current one to scan */ 65*cdf0e10cSrcweir Token *bp; /* base (allocated value) */ 66*cdf0e10cSrcweir Token *lp; /* last+1 token used */ 67*cdf0e10cSrcweir int max; /* number allocated */ 68*cdf0e10cSrcweir } Tokenrow; 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir typedef struct source 71*cdf0e10cSrcweir { 72*cdf0e10cSrcweir char *filename; /* name of file of the source */ 73*cdf0e10cSrcweir int line; /* current line number */ 74*cdf0e10cSrcweir int lineinc; /* adjustment for \\n lines */ 75*cdf0e10cSrcweir uchar *inb; /* input buffer */ 76*cdf0e10cSrcweir uchar *inp; /* input pointer */ 77*cdf0e10cSrcweir uchar *inl; /* end of input */ 78*cdf0e10cSrcweir int fd; /* input source */ 79*cdf0e10cSrcweir int ifdepth; /* conditional nesting in include */ 80*cdf0e10cSrcweir int pathdepth; 81*cdf0e10cSrcweir int wrap; 82*cdf0e10cSrcweir struct source *next; /* stack for #include */ 83*cdf0e10cSrcweir } Source; 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir typedef struct nlist 86*cdf0e10cSrcweir { 87*cdf0e10cSrcweir struct nlist *next; 88*cdf0e10cSrcweir uchar *name; 89*cdf0e10cSrcweir int len; 90*cdf0e10cSrcweir Tokenrow *vp; /* value as macro */ 91*cdf0e10cSrcweir Tokenrow *ap; /* list of argument names, if any */ 92*cdf0e10cSrcweir char val; /* value as preprocessor name */ 93*cdf0e10cSrcweir char flag; /* is defined, is pp name */ 94*cdf0e10cSrcweir uchar *loc; /* location of definition */ 95*cdf0e10cSrcweir } Nlist; 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir typedef struct includelist 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir char deleted; 100*cdf0e10cSrcweir char always; 101*cdf0e10cSrcweir char *file; 102*cdf0e10cSrcweir } Includelist; 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir typedef struct wraplist 105*cdf0e10cSrcweir { 106*cdf0e10cSrcweir char *file; 107*cdf0e10cSrcweir } Wraplist; 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir #define new(t) (t *)domalloc(sizeof(t)) 110*cdf0e10cSrcweir #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037))) 111*cdf0e10cSrcweir #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037)) 112*cdf0e10cSrcweir extern unsigned long namebit[077 + 1]; 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir enum errtype 115*cdf0e10cSrcweir { 116*cdf0e10cSrcweir INFO, WARNING, ERROR, FATAL 117*cdf0e10cSrcweir }; 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir typedef struct macroValidator 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir Nlist * pMacro; 123*cdf0e10cSrcweir unsigned int nTokenWhereMacroBecomesValid; 124*cdf0e10cSrcweir struct macroValidator * 125*cdf0e10cSrcweir pNext; 126*cdf0e10cSrcweir } MacroValidator; 127*cdf0e10cSrcweir typedef struct mvl 128*cdf0e10cSrcweir { 129*cdf0e10cSrcweir MacroValidator * pFirst; 130*cdf0e10cSrcweir unsigned int nextFreeIdentifier; 131*cdf0e10cSrcweir } MacroValidatorList; 132*cdf0e10cSrcweir 133*cdf0e10cSrcweir void mvl_init( 134*cdf0e10cSrcweir MacroValidatorList * 135*cdf0e10cSrcweir out_pValidators); 136*cdf0e10cSrcweir void mvl_destruct( 137*cdf0e10cSrcweir MacroValidatorList * 138*cdf0e10cSrcweir out_pValidators); 139*cdf0e10cSrcweir /* Adds MacroValidator to the list. 140*cdf0e10cSrcweir */ 141*cdf0e10cSrcweir void mvl_add( 142*cdf0e10cSrcweir MacroValidatorList * 143*cdf0e10cSrcweir inout_pValidators, 144*cdf0e10cSrcweir Nlist * in_pMacro, 145*cdf0e10cSrcweir Token * in_pTokenWhereMacroBecomesValid); 146*cdf0e10cSrcweir /* Updates all token pointers within the list, when the tokens have 147*cdf0e10cSrcweir moved, by 148*cdf0e10cSrcweir pTokenWhereMacroBecomesValid += in_nNrofTokens; 149*cdf0e10cSrcweir . 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir void mvl_move( 152*cdf0e10cSrcweir MacroValidatorList * 153*cdf0e10cSrcweir inout_pValidators, 154*cdf0e10cSrcweir int in_nSpace); // in pointer units. 155*cdf0e10cSrcweir */ 156*cdf0e10cSrcweir /* Checks if one of the validators within the list points to 157*cdf0e10cSrcweir the token in_pTokenToCheck. If so, the macro is set valid and 158*cdf0e10cSrcweir the validator is removed. 159*cdf0e10cSrcweir */ 160*cdf0e10cSrcweir void mvl_check( 161*cdf0e10cSrcweir MacroValidatorList * 162*cdf0e10cSrcweir inout_pValidators, 163*cdf0e10cSrcweir Token * inout_pTokenToCheck); 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir void tokenrow_zeroTokenIdentifiers(Tokenrow* trp); 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir void expandlex(void); 168*cdf0e10cSrcweir void fixlex(void); 169*cdf0e10cSrcweir void setup(int, char **); 170*cdf0e10cSrcweir int gettokens(Tokenrow *, int); 171*cdf0e10cSrcweir int comparetokens(Tokenrow *, Tokenrow *); 172*cdf0e10cSrcweir Source *setsource(char *, int, int, char *, int); 173*cdf0e10cSrcweir void unsetsource(void); 174*cdf0e10cSrcweir void puttokens(Tokenrow *); 175*cdf0e10cSrcweir void process(Tokenrow *); 176*cdf0e10cSrcweir void *domalloc(int); 177*cdf0e10cSrcweir void dofree(void *); 178*cdf0e10cSrcweir void error(enum errtype, char *,...); 179*cdf0e10cSrcweir void flushout(void); 180*cdf0e10cSrcweir int fillbuf(Source *); 181*cdf0e10cSrcweir int trigraph(Source *); 182*cdf0e10cSrcweir int foldline(Source *); 183*cdf0e10cSrcweir Nlist *lookup(Token *, int); 184*cdf0e10cSrcweir void control(Tokenrow *); 185*cdf0e10cSrcweir void dodefine(Tokenrow *); 186*cdf0e10cSrcweir void doadefine(Tokenrow *, int); 187*cdf0e10cSrcweir void doinclude(Tokenrow *, int, int); 188*cdf0e10cSrcweir void doif(Tokenrow *, enum kwtype); 189*cdf0e10cSrcweir void expand(Tokenrow *, Nlist *, MacroValidatorList *); 190*cdf0e10cSrcweir void builtin(Tokenrow *, int); 191*cdf0e10cSrcweir int gatherargs(Tokenrow *, Tokenrow **, int *); 192*cdf0e10cSrcweir void substargs(Nlist *, Tokenrow *, Tokenrow **); 193*cdf0e10cSrcweir void expandrow(Tokenrow *, char *); 194*cdf0e10cSrcweir void maketokenrow(int, Tokenrow *); 195*cdf0e10cSrcweir Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 196*cdf0e10cSrcweir Token *growtokenrow(Tokenrow *); 197*cdf0e10cSrcweir Tokenrow *normtokenrow(Tokenrow *); 198*cdf0e10cSrcweir void adjustrow(Tokenrow *, int); 199*cdf0e10cSrcweir void movetokenrow(Tokenrow *, Tokenrow *); 200*cdf0e10cSrcweir void insertrow(Tokenrow *, int, Tokenrow *); 201*cdf0e10cSrcweir void peektokens(Tokenrow *, char *); 202*cdf0e10cSrcweir void doconcat(Tokenrow *); 203*cdf0e10cSrcweir Tokenrow *stringify(Tokenrow *); 204*cdf0e10cSrcweir int lookuparg(Nlist *, Token *); 205*cdf0e10cSrcweir long eval(Tokenrow *, int); 206*cdf0e10cSrcweir void genline(void); 207*cdf0e10cSrcweir void genimport(char *, int, char *, int); 208*cdf0e10cSrcweir void genwrap(int); 209*cdf0e10cSrcweir void setempty(Tokenrow *); 210*cdf0e10cSrcweir void makespace(Tokenrow *, Token *); 211*cdf0e10cSrcweir char *outnum(char *, int); 212*cdf0e10cSrcweir int digit(int); 213*cdf0e10cSrcweir uchar *newstring(uchar *, int, int); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 216*cdf0e10cSrcweir 217*cdf0e10cSrcweir extern char *outptr; 218*cdf0e10cSrcweir extern Token nltoken; 219*cdf0e10cSrcweir extern Source *cursource; 220*cdf0e10cSrcweir extern char *curtime; 221*cdf0e10cSrcweir extern int incdepth; 222*cdf0e10cSrcweir extern int ifdepth; 223*cdf0e10cSrcweir extern int ifsatisfied[NIF]; 224*cdf0e10cSrcweir extern int Mflag; 225*cdf0e10cSrcweir extern int Iflag; 226*cdf0e10cSrcweir extern int Pflag; 227*cdf0e10cSrcweir extern int Aflag; 228*cdf0e10cSrcweir extern int Lflag; 229*cdf0e10cSrcweir extern int Xflag; 230*cdf0e10cSrcweir extern int Vflag; 231*cdf0e10cSrcweir extern int Cflag; 232*cdf0e10cSrcweir extern int Dflag; 233*cdf0e10cSrcweir extern int Cplusplus; 234*cdf0e10cSrcweir extern int skipping; 235*cdf0e10cSrcweir extern Nlist *kwdefined; 236*cdf0e10cSrcweir extern Includelist includelist[NINCLUDE]; 237*cdf0e10cSrcweir extern Wraplist wraplist[NINCLUDE]; 238*cdf0e10cSrcweir extern char wd[]; 239*cdf0e10cSrcweir 240