13e12c5d1SDavid du Colombier #define INS 32768 /* input buffer */ 23e12c5d1SDavid du Colombier #define OBS 4096 /* outbut buffer */ 3*39e9a3f1SDavid du Colombier #define NARG 128 /* Max number arguments to a macro */ 47dd7cddfSDavid du Colombier #define NINCLUDE 64 /* Max number of include directories (-I) */ 53e12c5d1SDavid du Colombier #define NIF 32 /* depth of nesting of #if */ 63e12c5d1SDavid du Colombier #ifndef EOF 73e12c5d1SDavid du Colombier #define EOF (-1) 83e12c5d1SDavid du Colombier #endif 93e12c5d1SDavid du Colombier #ifndef NULL 103e12c5d1SDavid du Colombier #define NULL 0 113e12c5d1SDavid du Colombier #endif 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP, 143e12c5d1SDavid du Colombier EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS, 153e12c5d1SDavid du Colombier ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS, 163e12c5d1SDavid du Colombier TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST, 173e12c5d1SDavid du Colombier COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET, 183e12c5d1SDavid du Colombier ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH, 193e12c5d1SDavid du Colombier ASRSH, ASOR, ASAND, ELLIPS, 203e12c5d1SDavid du Colombier DSHARP1, NAME1, DEFINED, UMINUS }; 213e12c5d1SDavid du Colombier 223e12c5d1SDavid du Colombier enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE, 23ad1af469SDavid du Colombier KUNDEF, KLINE, KERROR, KWARNING, KPRAGMA, KDEFINED, 243e12c5d1SDavid du Colombier KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL }; 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier #define ISDEFINED 01 /* has #defined value */ 273e12c5d1SDavid du Colombier #define ISKW 02 /* is PP keyword */ 283e12c5d1SDavid du Colombier #define ISUNCHANGE 04 /* can't be #defined in PP */ 293e12c5d1SDavid du Colombier #define ISMAC 010 /* builtin macro, e.g. __LINE__ */ 303b56890dSDavid du Colombier #define ISVARMAC 020 /* variadic macro */ 313e12c5d1SDavid du Colombier 323e12c5d1SDavid du Colombier #define EOB 0xFE /* sentinel for end of input buffer */ 33bd389b36SDavid du Colombier #define EOFC 0xFD /* sentinel for end of input file */ 343e12c5d1SDavid du Colombier #define XPWS 1 /* token flag: white space to assure token sep. */ 353e12c5d1SDavid du Colombier 3605dd1647SDavid du Colombier enum { Notinmacro, Inmacro }; 3705dd1647SDavid du Colombier 383e12c5d1SDavid du Colombier typedef struct token { 393e12c5d1SDavid du Colombier unsigned char type; 403e12c5d1SDavid du Colombier unsigned char flag; 413e12c5d1SDavid du Colombier unsigned short hideset; 42219b2ee8SDavid du Colombier unsigned int wslen; 43219b2ee8SDavid du Colombier unsigned int len; 443e12c5d1SDavid du Colombier uchar *t; 453e12c5d1SDavid du Colombier } Token; 463e12c5d1SDavid du Colombier 473e12c5d1SDavid du Colombier typedef struct tokenrow { 483e12c5d1SDavid du Colombier Token *tp; /* current one to scan */ 493e12c5d1SDavid du Colombier Token *bp; /* base (allocated value) */ 503e12c5d1SDavid du Colombier Token *lp; /* last+1 token used */ 513e12c5d1SDavid du Colombier int max; /* number allocated */ 523e12c5d1SDavid du Colombier } Tokenrow; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier typedef struct source { 553e12c5d1SDavid du Colombier char *filename; /* name of file of the source */ 563e12c5d1SDavid du Colombier int line; /* current line number */ 573e12c5d1SDavid du Colombier int lineinc; /* adjustment for \\n lines */ 583e12c5d1SDavid du Colombier uchar *inb; /* input buffer */ 593e12c5d1SDavid du Colombier uchar *inp; /* input pointer */ 603e12c5d1SDavid du Colombier uchar *inl; /* end of input */ 61a8453668SDavid du Colombier int ins; /* input buffer size */ 623e12c5d1SDavid du Colombier int fd; /* input source */ 633e12c5d1SDavid du Colombier int ifdepth; /* conditional nesting in include */ 643e12c5d1SDavid du Colombier struct source *next; /* stack for #include */ 653e12c5d1SDavid du Colombier } Source; 663e12c5d1SDavid du Colombier 673e12c5d1SDavid du Colombier typedef struct nlist { 683e12c5d1SDavid du Colombier struct nlist *next; 693e12c5d1SDavid du Colombier uchar *name; 703e12c5d1SDavid du Colombier int len; 713e12c5d1SDavid du Colombier Tokenrow *vp; /* value as macro */ 723e12c5d1SDavid du Colombier Tokenrow *ap; /* list of argument names, if any */ 733e12c5d1SDavid du Colombier char val; /* value as preprocessor name */ 743e12c5d1SDavid du Colombier char flag; /* is defined, is pp name */ 753e12c5d1SDavid du Colombier } Nlist; 763e12c5d1SDavid du Colombier 773e12c5d1SDavid du Colombier typedef struct includelist { 783e12c5d1SDavid du Colombier char deleted; 793e12c5d1SDavid du Colombier char always; 803e12c5d1SDavid du Colombier char *file; 813e12c5d1SDavid du Colombier } Includelist; 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier #define new(t) (t *)domalloc(sizeof(t)) 843e12c5d1SDavid du Colombier #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037))) 853e12c5d1SDavid du Colombier #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037)) 863e12c5d1SDavid du Colombier extern unsigned long namebit[077+1]; 873e12c5d1SDavid du Colombier 883e12c5d1SDavid du Colombier enum errtype { WARNING, ERROR, FATAL }; 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier void expandlex(void); 913e12c5d1SDavid du Colombier void fixlex(void); 923e12c5d1SDavid du Colombier void setup(int, char **); 939a747e4fSDavid du Colombier #define gettokens cpp_gettokens 943e12c5d1SDavid du Colombier int gettokens(Tokenrow *, int); 953e12c5d1SDavid du Colombier int comparetokens(Tokenrow *, Tokenrow *); 963e12c5d1SDavid du Colombier Source *setsource(char *, int, char *); 973e12c5d1SDavid du Colombier void unsetsource(void); 983e12c5d1SDavid du Colombier void puttokens(Tokenrow *); 993e12c5d1SDavid du Colombier void process(Tokenrow *); 100a8453668SDavid du Colombier void *dorealloc(void *, int); 1013e12c5d1SDavid du Colombier void *domalloc(int); 1023e12c5d1SDavid du Colombier void dofree(void *); 1033e12c5d1SDavid du Colombier void error(enum errtype, char *, ...); 1043e12c5d1SDavid du Colombier void flushout(void); 1053e12c5d1SDavid du Colombier int fillbuf(Source *); 1063e12c5d1SDavid du Colombier int trigraph(Source *); 1073e12c5d1SDavid du Colombier int foldline(Source *); 1083e12c5d1SDavid du Colombier Nlist *lookup(Token *, int); 1093e12c5d1SDavid du Colombier void control(Tokenrow *); 1103e12c5d1SDavid du Colombier void dodefine(Tokenrow *); 1113e12c5d1SDavid du Colombier void doadefine(Tokenrow *, int); 1123e12c5d1SDavid du Colombier void doinclude(Tokenrow *); 1133e12c5d1SDavid du Colombier void doif(Tokenrow *, enum kwtype); 11405dd1647SDavid du Colombier void expand(Tokenrow *, Nlist *, int); 1153e12c5d1SDavid du Colombier void builtin(Tokenrow *, int); 1163b56890dSDavid du Colombier int gatherargs(Tokenrow *, Tokenrow **, int, int *); 1173e12c5d1SDavid du Colombier void substargs(Nlist *, Tokenrow *, Tokenrow **); 11805dd1647SDavid du Colombier void expandrow(Tokenrow *, char *, int); 1193e12c5d1SDavid du Colombier void maketokenrow(int, Tokenrow *); 1203e12c5d1SDavid du Colombier Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 1213e12c5d1SDavid du Colombier Token *growtokenrow(Tokenrow *); 1223e12c5d1SDavid du Colombier Tokenrow *normtokenrow(Tokenrow *); 1233e12c5d1SDavid du Colombier void adjustrow(Tokenrow *, int); 1243e12c5d1SDavid du Colombier void movetokenrow(Tokenrow *, Tokenrow *); 1253e12c5d1SDavid du Colombier void insertrow(Tokenrow *, int, Tokenrow *); 1263e12c5d1SDavid du Colombier void peektokens(Tokenrow *, char *); 1273e12c5d1SDavid du Colombier void doconcat(Tokenrow *); 1283e12c5d1SDavid du Colombier Tokenrow *stringify(Tokenrow *); 1293e12c5d1SDavid du Colombier int lookuparg(Nlist *, Token *); 1303e12c5d1SDavid du Colombier long eval(Tokenrow *, int); 1313e12c5d1SDavid du Colombier void genline(void); 1323e12c5d1SDavid du Colombier void setempty(Tokenrow *); 1333e12c5d1SDavid du Colombier void makespace(Tokenrow *); 1343e12c5d1SDavid du Colombier char *outnum(char *, int); 1353e12c5d1SDavid du Colombier int digit(int); 1363e12c5d1SDavid du Colombier uchar *newstring(uchar *, int, int); 1373e12c5d1SDavid du Colombier int checkhideset(int, Nlist *); 1383e12c5d1SDavid du Colombier void prhideset(int); 1393e12c5d1SDavid du Colombier int newhideset(int, Nlist *); 1403e12c5d1SDavid du Colombier int unionhideset(int, int); 1413e12c5d1SDavid du Colombier void iniths(void); 142bd389b36SDavid du Colombier void setobjname(char *); 143219b2ee8SDavid du Colombier void clearwstab(void); 1443e12c5d1SDavid du Colombier #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 1453e12c5d1SDavid du Colombier 1463e12c5d1SDavid du Colombier extern char *outp; 1473e12c5d1SDavid du Colombier extern Token nltoken; 1483e12c5d1SDavid du Colombier extern Source *cursource; 1493e12c5d1SDavid du Colombier extern char *curtime; 1503e12c5d1SDavid du Colombier extern int incdepth; 1513e12c5d1SDavid du Colombier extern int ifdepth; 1523e12c5d1SDavid du Colombier extern int ifsatisfied[NIF]; 153bd389b36SDavid du Colombier extern int Mflag; 1547dd7cddfSDavid du Colombier extern int nolineinfo; 1553e12c5d1SDavid du Colombier extern int skipping; 1563e12c5d1SDavid du Colombier extern int verbose; 1573e12c5d1SDavid du Colombier extern int Cplusplus; 158bd389b36SDavid du Colombier extern Nlist *kwdefined; 1593e12c5d1SDavid du Colombier extern Includelist includelist[NINCLUDE]; 160219b2ee8SDavid du Colombier extern char wd[]; 161