1 #define INS 32768 /* input buffer */ 2 #define OBS 4096 /* outbut buffer */ 3 #define NARG 128 /* Max number arguments to a macro */ 4 #define NINCLUDE 64 /* 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, KWARNING, 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 #define ISVARMAC 020 /* variadic macro */ 31 32 #define EOB 0xFE /* sentinel for end of input buffer */ 33 #define EOFC 0xFD /* sentinel for end of input file */ 34 #define XPWS 1 /* token flag: white space to assure token sep. */ 35 36 enum { Notinmacro, Inmacro }; 37 38 typedef struct token { 39 unsigned char type; 40 unsigned char flag; 41 unsigned short hideset; 42 unsigned int wslen; 43 unsigned int len; 44 uchar *t; 45 } Token; 46 47 typedef struct tokenrow { 48 Token *tp; /* current one to scan */ 49 Token *bp; /* base (allocated value) */ 50 Token *lp; /* last+1 token used */ 51 int max; /* number allocated */ 52 } Tokenrow; 53 54 typedef struct source { 55 char *filename; /* name of file of the source */ 56 int line; /* current line number */ 57 int lineinc; /* adjustment for \\n lines */ 58 uchar *inb; /* input buffer */ 59 uchar *inp; /* input pointer */ 60 uchar *inl; /* end of input */ 61 int ins; /* input buffer size */ 62 int fd; /* input source */ 63 int ifdepth; /* conditional nesting in include */ 64 struct source *next; /* stack for #include */ 65 } Source; 66 67 typedef struct nlist { 68 struct nlist *next; 69 uchar *name; 70 int len; 71 Tokenrow *vp; /* value as macro */ 72 Tokenrow *ap; /* list of argument names, if any */ 73 char val; /* value as preprocessor name */ 74 char flag; /* is defined, is pp name */ 75 } Nlist; 76 77 typedef struct includelist { 78 char deleted; 79 char always; 80 char *file; 81 } Includelist; 82 83 #define new(t) (t *)domalloc(sizeof(t)) 84 #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037))) 85 #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037)) 86 extern unsigned long namebit[077+1]; 87 88 enum errtype { WARNING, ERROR, FATAL }; 89 90 void expandlex(void); 91 void fixlex(void); 92 void setup(int, char **); 93 #define gettokens cpp_gettokens 94 int gettokens(Tokenrow *, int); 95 int comparetokens(Tokenrow *, Tokenrow *); 96 Source *setsource(char *, int, char *); 97 void unsetsource(void); 98 void puttokens(Tokenrow *); 99 void process(Tokenrow *); 100 void *dorealloc(void *, int); 101 void *domalloc(int); 102 void dofree(void *); 103 void error(enum errtype, char *, ...); 104 void flushout(void); 105 int fillbuf(Source *); 106 int trigraph(Source *); 107 int foldline(Source *); 108 Nlist *lookup(Token *, int); 109 void control(Tokenrow *); 110 void dodefine(Tokenrow *); 111 void doadefine(Tokenrow *, int); 112 void doinclude(Tokenrow *); 113 void doif(Tokenrow *, enum kwtype); 114 void expand(Tokenrow *, Nlist *, int); 115 void builtin(Tokenrow *, int); 116 int gatherargs(Tokenrow *, Tokenrow **, int, int *); 117 void substargs(Nlist *, Tokenrow *, Tokenrow **); 118 void expandrow(Tokenrow *, char *, int); 119 void maketokenrow(int, Tokenrow *); 120 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 121 Token *growtokenrow(Tokenrow *); 122 Tokenrow *normtokenrow(Tokenrow *); 123 void adjustrow(Tokenrow *, int); 124 void movetokenrow(Tokenrow *, Tokenrow *); 125 void insertrow(Tokenrow *, int, Tokenrow *); 126 void peektokens(Tokenrow *, char *); 127 void doconcat(Tokenrow *); 128 Tokenrow *stringify(Tokenrow *); 129 int lookuparg(Nlist *, Token *); 130 long eval(Tokenrow *, int); 131 void genline(void); 132 void setempty(Tokenrow *); 133 void makespace(Tokenrow *); 134 char *outnum(char *, int); 135 int digit(int); 136 uchar *newstring(uchar *, int, int); 137 int checkhideset(int, Nlist *); 138 void prhideset(int); 139 int newhideset(int, Nlist *); 140 int unionhideset(int, int); 141 void iniths(void); 142 void setobjname(char *); 143 void clearwstab(void); 144 #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 145 146 extern char *outp; 147 extern Token nltoken; 148 extern Source *cursource; 149 extern char *curtime; 150 extern int incdepth; 151 extern int ifdepth; 152 extern int ifsatisfied[NIF]; 153 extern int Mflag; 154 extern int nolineinfo; 155 extern int skipping; 156 extern int verbose; 157 extern int Cplusplus; 158 extern Nlist *kwdefined; 159 extern Includelist includelist[NINCLUDE]; 160 extern char wd[]; 161