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 #ifndef __alpha 14 typedef unsigned char uchar; 15 #endif 16 17 enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP, 18 EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS, 19 ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS, 20 TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST, 21 COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET, 22 ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH, 23 ASRSH, ASOR, ASAND, ELLIPS, 24 DSHARP1, NAME1, DEFINED, UMINUS }; 25 26 enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE, 27 KUNDEF, KLINE, KERROR, KPRAGMA, KDEFINED, 28 KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL }; 29 30 #define ISDEFINED 01 /* has #defined value */ 31 #define ISKW 02 /* is PP keyword */ 32 #define ISUNCHANGE 04 /* can't be #defined in PP */ 33 #define ISMAC 010 /* builtin macro, e.g. __LINE__ */ 34 35 #define EOB 0xFE /* sentinel for end of input buffer */ 36 #define EOFC 0xFD /* sentinel for end of input file */ 37 #define XPWS 1 /* token flag: white space to assure token sep. */ 38 39 typedef struct token { 40 unsigned char type; 41 unsigned char flag; 42 unsigned short hideset; 43 unsigned int wslen; 44 unsigned int len; 45 uchar *t; 46 } Token; 47 48 typedef struct tokenrow { 49 Token *tp; /* current one to scan */ 50 Token *bp; /* base (allocated value) */ 51 Token *lp; /* last+1 token used */ 52 int max; /* number allocated */ 53 } Tokenrow; 54 55 typedef struct source { 56 char *filename; /* name of file of the source */ 57 int line; /* current line number */ 58 int lineinc; /* adjustment for \\n lines */ 59 uchar *inb; /* input buffer */ 60 uchar *inp; /* input pointer */ 61 uchar *inl; /* end of input */ 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 int gettokens(Tokenrow *, int); 94 int comparetokens(Tokenrow *, Tokenrow *); 95 Source *setsource(char *, int, char *); 96 void unsetsource(void); 97 void puttokens(Tokenrow *); 98 void process(Tokenrow *); 99 void *domalloc(int); 100 void dofree(void *); 101 void error(enum errtype, char *, ...); 102 void flushout(void); 103 int fillbuf(Source *); 104 int trigraph(Source *); 105 int foldline(Source *); 106 Nlist *lookup(Token *, int); 107 void control(Tokenrow *); 108 void dodefine(Tokenrow *); 109 void doadefine(Tokenrow *, int); 110 void doinclude(Tokenrow *); 111 void appendDirToIncludeList( char *dir ); 112 void doif(Tokenrow *, enum kwtype); 113 void expand(Tokenrow *, Nlist *); 114 void builtin(Tokenrow *, int); 115 int gatherargs(Tokenrow *, Tokenrow **, int *); 116 void substargs(Nlist *, Tokenrow *, Tokenrow **); 117 void expandrow(Tokenrow *, char *); 118 void maketokenrow(int, Tokenrow *); 119 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *); 120 Token *growtokenrow(Tokenrow *); 121 Tokenrow *normtokenrow(Tokenrow *); 122 void adjustrow(Tokenrow *, int); 123 void movetokenrow(Tokenrow *, Tokenrow *); 124 void insertrow(Tokenrow *, int, Tokenrow *); 125 void peektokens(Tokenrow *, char *); 126 void doconcat(Tokenrow *); 127 Tokenrow *stringify(Tokenrow *); 128 int lookuparg(Nlist *, Token *); 129 long eval(Tokenrow *, int); 130 void genline(void); 131 void setempty(Tokenrow *); 132 void makespace(Tokenrow *); 133 char *outnum(char *, int); 134 int digit(int); 135 uchar *newstring(uchar *, int, int); 136 int checkhideset(int, Nlist *); 137 void prhideset(int); 138 int newhideset(int, Nlist *); 139 int unionhideset(int, int); 140 void iniths(void); 141 void setobjname(char *); 142 #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp) 143 144 char *basepath( char *fname ); 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 skipping; 155 extern int verbose; 156 extern int Cplusplus; 157 extern Nlist *kwdefined; 158 extern Includelist includelist[NINCLUDE]; 159 extern char wd[]; 160 161 #ifndef _WIN32 162 #include <unistd.h> 163 #else 164 #include <io.h> 165 #endif 166 #include <fcntl.h> 167