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 */
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 };
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 };
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 */
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. */
36 enum { Notinmacro, Inmacro };
38 typedef struct token {
41 unsigned short hideset;
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 */
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 */
67 typedef struct nlist {
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 */
77 typedef struct includelist {
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];
88 enum errtype { WARNING, ERROR, FATAL };
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);
103 void error(enum errtype, char *, ...);
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);
132 void setempty(Tokenrow *);
133 void makespace(Tokenrow *);
134 char *outnum(char *, int);
136 uchar *newstring(uchar *, int, int);
137 int checkhideset(int, Nlist *);
139 int newhideset(int, Nlist *);
140 int unionhideset(int, int);
142 void setobjname(char *);
143 void clearwstab(void);
144 #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp)
147 extern Token nltoken;
148 extern Source *cursource;
149 extern char *curtime;
152 extern int ifsatisfied[NIF];
154 extern int nolineinfo;
157 extern int Cplusplus;
158 extern Nlist *kwdefined;
159 extern Includelist includelist[NINCLUDE];