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