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