1*3e12c5d1SDavid du Colombier #define INS 32768 /* input buffer */ 2*3e12c5d1SDavid du Colombier #define OBS 4096 /* outbut buffer */ 3*3e12c5d1SDavid du Colombier #define NARG 32 /* Max number arguments to a macro */ 4*3e12c5d1SDavid du Colombier #define NINCLUDE 32 /* Max number of include directories (-I) */ 5*3e12c5d1SDavid du Colombier #define NIF 32 /* depth of nesting of #if */ 6*3e12c5d1SDavid du Colombier #ifndef EOF 7*3e12c5d1SDavid du Colombier #define EOF (-1) 8*3e12c5d1SDavid du Colombier #endif 9*3e12c5d1SDavid du Colombier #ifndef NULL 10*3e12c5d1SDavid du Colombier #define NULL 0 11*3e12c5d1SDavid du Colombier #endif 12*3e12c5d1SDavid du Colombier 13*3e12c5d1SDavid du Colombier enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP, 14*3e12c5d1SDavid du Colombier EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS, 15*3e12c5d1SDavid du Colombier ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS, 16*3e12c5d1SDavid du Colombier TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST, 17*3e12c5d1SDavid du Colombier COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET, 18*3e12c5d1SDavid du Colombier ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH, 19*3e12c5d1SDavid du Colombier ASRSH, ASOR, ASAND, ELLIPS, 20*3e12c5d1SDavid du Colombier DSHARP1, NAME1, DEFINED, UMINUS }; 21*3e12c5d1SDavid du Colombier 22*3e12c5d1SDavid du Colombier enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE, 23*3e12c5d1SDavid du Colombier KUNDEF, KLINE, KERROR, KPRAGMA, KDEFINED, 24*3e12c5d1SDavid du Colombier KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL }; 25*3e12c5d1SDavid du Colombier 26*3e12c5d1SDavid du Colombier #define ISDEFINED 01 /* has #defined value */ 27*3e12c5d1SDavid du Colombier #define ISKW 02 /* is PP keyword */ 28*3e12c5d1SDavid du Colombier #define ISUNCHANGE 04 /* can't be #defined in PP */ 29*3e12c5d1SDavid du Colombier #define ISMAC 010 /* builtin macro, e.g. __LINE__ */ 30*3e12c5d1SDavid du Colombier 31*3e12c5d1SDavid du Colombier #define EOB 0xFE /* sentinel for end of input buffer */ 32*3e12c5d1SDavid du Colombier #define XPWS 1 /* token flag: white space to assure token sep. */ 33*3e12c5d1SDavid du Colombier 34*3e12c5d1SDavid du Colombier typedef struct token { 35*3e12c5d1SDavid du Colombier unsigned char type; 36*3e12c5d1SDavid du Colombier unsigned char flag; 37*3e12c5d1SDavid du Colombier unsigned short hideset; 38*3e12c5d1SDavid du Colombier unsigned short wslen; 39*3e12c5d1SDavid du Colombier unsigned short len; 40*3e12c5d1SDavid du Colombier uchar *t; 41*3e12c5d1SDavid du Colombier } Token; 42*3e12c5d1SDavid du Colombier 43*3e12c5d1SDavid du Colombier typedef struct tokenrow { 44*3e12c5d1SDavid du Colombier Token *tp; /* current one to scan */ 45*3e12c5d1SDavid du Colombier Token *bp; /* base (allocated value) */ 46*3e12c5d1SDavid du Colombier Token *lp; /* last+1 token used */ 47*3e12c5d1SDavid du Colombier int max; /* number allocated */ 48*3e12c5d1SDavid du Colombier } Tokenrow; 49*3e12c5d1SDavid du Colombier 50*3e12c5d1SDavid du Colombier typedef struct source { 51*3e12c5d1SDavid du Colombier char *filename; /* name of file of the source */ 52*3e12c5d1SDavid du Colombier int line; /* current line number */ 53*3e12c5d1SDavid du Colombier int lineinc; /* adjustment for \\n lines */ 54*3e12c5d1SDavid du Colombier uchar *inb; /* input buffer */ 55*3e12c5d1SDavid du Colombier uchar *inp; /* input pointer */ 56*3e12c5d1SDavid du Colombier uchar *inl; /* end of input */ 57*3e12c5d1SDavid du Colombier int fd; /* input source */ 58*3e12c5d1SDavid du Colombier int ifdepth; /* conditional nesting in include */ 59*3e12c5d1SDavid du Colombier struct source *next; /* stack for #include */ 60*3e12c5d1SDavid du Colombier } Source; 61*3e12c5d1SDavid du Colombier 62*3e12c5d1SDavid du Colombier typedef struct nlist { 63*3e12c5d1SDavid du Colombier struct nlist *next; 64*3e12c5d1SDavid du Colombier uchar *name; 65*3e12c5d1SDavid du Colombier int len; 66*3e12c5d1SDavid du Colombier Tokenrow *vp; /* value as macro */ 67*3e12c5d1SDavid du Colombier Tokenrow *ap; /* list of argument names, if any */ 68*3e12c5d1SDavid du Colombier char val; /* value as preprocessor name */ 69*3e12c5d1SDavid du Colombier char flag; /* is defined, is pp name */ 70*3e12c5d1SDavid du Colombier } Nlist; 71*3e12c5d1SDavid du Colombier 72*3e12c5d1SDavid du Colombier typedef struct includelist { 73*3e12c5d1SDavid du Colombier char deleted; 74*3e12c5d1SDavid du Colombier char always; 75*3e12c5d1SDavid du Colombier char *file; 76*3e12c5d1SDavid du Colombier } Includelist; 77*3e12c5d1SDavid du Colombier 78*3e12c5d1SDavid du Colombier #define new(t) (t *)domalloc(sizeof(t)) 79*3e12c5d1SDavid du Colombier #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037))) 80*3e12c5d1SDavid du Colombier #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037)) 81*3e12c5d1SDavid du Colombier extern unsigned long namebit[077+1]; 82*3e12c5d1SDavid du Colombier 83*3e12c5d1SDavid du Colombier enum errtype { WARNING, ERROR, FATAL }; 84*3e12c5d1SDavid du Colombier 85*3e12c5d1SDavid du Colombier void expandlex(void); 86*3e12c5d1SDavid du Colombier void fixlex(void); 87*3e12c5d1SDavid du Colombier void setup(int, char **); 88*3e12c5d1SDavid du Colombier int gettokens(Tokenrow *, int); 89*3e12c5d1SDavid du Colombier int comparetokens(Tokenrow *, Tokenrow *); 90*3e12c5d1SDavid du Colombier Source *setsource(char *, int, char *); 91*3e12c5d1SDavid du Colombier void unsetsource(void); 92*3e12c5d1SDavid du Colombier void puttokens(Tokenrow *); 93*3e12c5d1SDavid du Colombier void process(Tokenrow *); 94*3e12c5d1SDavid du Colombier void *domalloc(int); 95*3e12c5d1SDavid du Colombier void dofree(void *); 96*3e12c5d1SDavid du Colombier void error(enum errtype, char *, ...); 97*3e12c5d1SDavid du Colombier void flushout(void); 98*3e12c5d1SDavid du Colombier int fillbuf(Source *); 99*3e12c5d1SDavid du Colombier int trigraph(Source *); 100*3e12c5d1SDavid du Colombier int foldline(Source *); 101*3e12c5d1SDavid du Colombier Nlist *lookup(Token *, int); 102*3e12c5d1SDavid du Colombier void control(Tokenrow *); 103*3e12c5d1SDavid du Colombier void dodefine(Tokenrow *); 104*3e12c5d1SDavid du Colombier void doadefine(Tokenrow *, int); 105*3e12c5d1SDavid du Colombier void doinclude(Tokenrow *); 106*3e12c5d1SDavid du Colombier void doif(Tokenrow *, enum kwtype); 107*3e12c5d1SDavid du Colombier void expand(Tokenrow *, Nlist *); 108*3e12c5d1SDavid du Colombier void builtin(Tokenrow *, int); 109*3e12c5d1SDavid du Colombier int gatherargs(Tokenrow *, Tokenrow **, int *); 110*3e12c5d1SDavid du Colombier void substargs(Nlist *, Tokenrow *, Tokenrow **); 111*3e12c5d1SDavid du Colombier void expandrow(Tokenrow *, char *); 112*3e12c5d1SDavid du Colombier void maketokenrow(int, Tokenrow *); 113*3e12c5d1SDavid du Colombier Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 114*3e12c5d1SDavid du Colombier Token *growtokenrow(Tokenrow *); 115*3e12c5d1SDavid du Colombier Tokenrow *normtokenrow(Tokenrow *); 116*3e12c5d1SDavid du Colombier void adjustrow(Tokenrow *, int); 117*3e12c5d1SDavid du Colombier void movetokenrow(Tokenrow *, Tokenrow *); 118*3e12c5d1SDavid du Colombier void insertrow(Tokenrow *, int, Tokenrow *); 119*3e12c5d1SDavid du Colombier void peektokens(Tokenrow *, char *); 120*3e12c5d1SDavid du Colombier void doconcat(Tokenrow *); 121*3e12c5d1SDavid du Colombier Tokenrow *stringify(Tokenrow *); 122*3e12c5d1SDavid du Colombier int lookuparg(Nlist *, Token *); 123*3e12c5d1SDavid du Colombier long eval(Tokenrow *, int); 124*3e12c5d1SDavid du Colombier void genline(void); 125*3e12c5d1SDavid du Colombier void setempty(Tokenrow *); 126*3e12c5d1SDavid du Colombier void makespace(Tokenrow *); 127*3e12c5d1SDavid du Colombier char *outnum(char *, int); 128*3e12c5d1SDavid du Colombier int digit(int); 129*3e12c5d1SDavid du Colombier uchar *newstring(uchar *, int, int); 130*3e12c5d1SDavid du Colombier int checkhideset(int, Nlist *); 131*3e12c5d1SDavid du Colombier void prhideset(int); 132*3e12c5d1SDavid du Colombier int newhideset(int, Nlist *); 133*3e12c5d1SDavid du Colombier int unionhideset(int, int); 134*3e12c5d1SDavid du Colombier void iniths(void); 135*3e12c5d1SDavid du Colombier #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 136*3e12c5d1SDavid du Colombier 137*3e12c5d1SDavid du Colombier extern char *outp; 138*3e12c5d1SDavid du Colombier extern Token nltoken; 139*3e12c5d1SDavid du Colombier extern Source *cursource; 140*3e12c5d1SDavid du Colombier extern char *curtime; 141*3e12c5d1SDavid du Colombier extern int incdepth; 142*3e12c5d1SDavid du Colombier extern int ifdepth; 143*3e12c5d1SDavid du Colombier extern int ifsatisfied[NIF]; 144*3e12c5d1SDavid du Colombier extern int skipping; 145*3e12c5d1SDavid du Colombier extern int verbose; 146*3e12c5d1SDavid du Colombier extern int Cplusplus; 147*3e12c5d1SDavid du Colombier extern Includelist includelist[NINCLUDE]; 148