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 int gettokens(Tokenrow *, int); 90 int comparetokens(Tokenrow *, Tokenrow *); 91 Source *setsource(char *, int, char *); 92 void unsetsource(void); 93 void puttokens(Tokenrow *); 94 void process(Tokenrow *); 95 void *domalloc(int); 96 void dofree(void *); 97 void error(enum errtype, char *, ...); 98 void flushout(void); 99 int fillbuf(Source *); 100 int trigraph(Source *); 101 int foldline(Source *); 102 Nlist *lookup(Token *, int); 103 void control(Tokenrow *); 104 void dodefine(Tokenrow *); 105 void doadefine(Tokenrow *, int); 106 void doinclude(Tokenrow *); 107 void doif(Tokenrow *, enum kwtype); 108 void expand(Tokenrow *, Nlist *); 109 void builtin(Tokenrow *, int); 110 int gatherargs(Tokenrow *, Tokenrow **, int *); 111 void substargs(Nlist *, Tokenrow *, Tokenrow **); 112 void expandrow(Tokenrow *, char *); 113 void maketokenrow(int, Tokenrow *); 114 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 115 Token *growtokenrow(Tokenrow *); 116 Tokenrow *normtokenrow(Tokenrow *); 117 void adjustrow(Tokenrow *, int); 118 void movetokenrow(Tokenrow *, Tokenrow *); 119 void insertrow(Tokenrow *, int, Tokenrow *); 120 void peektokens(Tokenrow *, char *); 121 void doconcat(Tokenrow *); 122 Tokenrow *stringify(Tokenrow *); 123 int lookuparg(Nlist *, Token *); 124 long eval(Tokenrow *, int); 125 void genline(void); 126 void setempty(Tokenrow *); 127 void makespace(Tokenrow *); 128 char *outnum(char *, int); 129 int digit(int); 130 uchar *newstring(uchar *, int, int); 131 int checkhideset(int, Nlist *); 132 void prhideset(int); 133 int newhideset(int, Nlist *); 134 int unionhideset(int, int); 135 void iniths(void); 136 void setobjname(char *); 137 void clearwstab(void); 138 #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 139 140 extern char *outp; 141 extern Token nltoken; 142 extern Source *cursource; 143 extern char *curtime; 144 extern int incdepth; 145 extern int ifdepth; 146 extern int ifsatisfied[NIF]; 147 extern int Mflag; 148 extern int nolineinfo; 149 extern int skipping; 150 extern int verbose; 151 extern int Cplusplus; 152 extern Nlist *kwdefined; 153 extern Includelist includelist[NINCLUDE]; 154 extern char wd[]; 155