1*906afcb8SAndy Fiddaman /***********************************************************************
2*906afcb8SAndy Fiddaman * *
3*906afcb8SAndy Fiddaman * This software is part of the ast package *
4*906afcb8SAndy Fiddaman * Copyright (c) 1986-2011 AT&T Intellectual Property *
5*906afcb8SAndy Fiddaman * and is licensed under the *
6*906afcb8SAndy Fiddaman * Eclipse Public License, Version 1.0 *
7*906afcb8SAndy Fiddaman * by AT&T Intellectual Property *
8*906afcb8SAndy Fiddaman * *
9*906afcb8SAndy Fiddaman * A copy of the License is available at *
10*906afcb8SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html *
11*906afcb8SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12*906afcb8SAndy Fiddaman * *
13*906afcb8SAndy Fiddaman * Information and Software Systems Research *
14*906afcb8SAndy Fiddaman * AT&T Research *
15*906afcb8SAndy Fiddaman * Florham Park NJ *
16*906afcb8SAndy Fiddaman * *
17*906afcb8SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> *
18*906afcb8SAndy Fiddaman * *
19*906afcb8SAndy Fiddaman ***********************************************************************/
20*906afcb8SAndy Fiddaman #pragma prototyped
21*906afcb8SAndy Fiddaman /*
22*906afcb8SAndy Fiddaman * Glenn Fowler
23*906afcb8SAndy Fiddaman * AT&T Research
24*906afcb8SAndy Fiddaman *
25*906afcb8SAndy Fiddaman * preprocessor library control interface
26*906afcb8SAndy Fiddaman */
27*906afcb8SAndy Fiddaman
28*906afcb8SAndy Fiddaman #include "pplib.h"
29*906afcb8SAndy Fiddaman #include "pptab.h"
30*906afcb8SAndy Fiddaman
31*906afcb8SAndy Fiddaman #include <ls.h>
32*906afcb8SAndy Fiddaman
33*906afcb8SAndy Fiddaman #define REFONE (pp.truncate?(Hash_table_t*)0:pp.symtab)
34*906afcb8SAndy Fiddaman #define REFALL (pp.truncate?pp.dirtab:pp.symtab)
35*906afcb8SAndy Fiddaman
36*906afcb8SAndy Fiddaman #define ppiskey(t,v,p) (p=t,v>=p->value&&value<=(p+elementsof(t)-2)->value)
37*906afcb8SAndy Fiddaman
38*906afcb8SAndy Fiddaman /*
39*906afcb8SAndy Fiddaman * set option value
40*906afcb8SAndy Fiddaman * initialization files have lowest precedence
41*906afcb8SAndy Fiddaman */
42*906afcb8SAndy Fiddaman
43*906afcb8SAndy Fiddaman int
ppset(register long * p,register long op,int val)44*906afcb8SAndy Fiddaman ppset(register long* p, register long op, int val)
45*906afcb8SAndy Fiddaman {
46*906afcb8SAndy Fiddaman long* r;
47*906afcb8SAndy Fiddaman
48*906afcb8SAndy Fiddaman r = p == &pp.state ? &pp.ro_state : p == &pp.mode ? &pp.ro_mode : &pp.ro_option;
49*906afcb8SAndy Fiddaman if ((pp.mode & INIT) && pp.in->type == IN_FILE && (*r & op))
50*906afcb8SAndy Fiddaman {
51*906afcb8SAndy Fiddaman debug((-7, "set %s %s skipped -- readonly", p == &pp.state ? "state" : p == &pp.mode ? "mode" : "option", p == &pp.state ? ppstatestr(*r) : p == &pp.mode ? ppmodestr(*r) : ppoptionstr(*r)));
52*906afcb8SAndy Fiddaman return 0;
53*906afcb8SAndy Fiddaman }
54*906afcb8SAndy Fiddaman if (!pp.initialized && (!(pp.mode & INIT) || !(pp.mode & BUILTIN)) && (p != &pp.mode || !(op & BUILTIN)) && (p != &pp.option || !(op & PREDEFINED)))
55*906afcb8SAndy Fiddaman {
56*906afcb8SAndy Fiddaman *r |= op;
57*906afcb8SAndy Fiddaman debug((-7, "set %s %s readonly", p == &pp.state ? "state" : p == &pp.mode ? "mode" : "option", p == &pp.state ? ppstatestr(*r) : p == &pp.mode ? ppmodestr(*r) : ppoptionstr(*r)));
58*906afcb8SAndy Fiddaman }
59*906afcb8SAndy Fiddaman if (val)
60*906afcb8SAndy Fiddaman *p |= op;
61*906afcb8SAndy Fiddaman else
62*906afcb8SAndy Fiddaman *p &= ~op;
63*906afcb8SAndy Fiddaman debug((-7, "set %s %s", p == &pp.state ? "state" : p == &pp.mode ? "mode" : "option", p == &pp.state ? ppstatestr(*r) : p == &pp.mode ? ppmodestr(*r) : ppoptionstr(*r)));
64*906afcb8SAndy Fiddaman return 1;
65*906afcb8SAndy Fiddaman }
66*906afcb8SAndy Fiddaman
67*906afcb8SAndy Fiddaman /*
68*906afcb8SAndy Fiddaman * initialize hash table with keywords from key
69*906afcb8SAndy Fiddaman */
70*906afcb8SAndy Fiddaman
71*906afcb8SAndy Fiddaman static void
inithash(register Hash_table_t * tab,register struct ppkeyword * key)72*906afcb8SAndy Fiddaman inithash(register Hash_table_t* tab, register struct ppkeyword* key)
73*906afcb8SAndy Fiddaman {
74*906afcb8SAndy Fiddaman register char* s;
75*906afcb8SAndy Fiddaman
76*906afcb8SAndy Fiddaman for (; s = key->name; key++)
77*906afcb8SAndy Fiddaman {
78*906afcb8SAndy Fiddaman if (!ppisid(*s))
79*906afcb8SAndy Fiddaman s++;
80*906afcb8SAndy Fiddaman hashput(tab, s, key->value);
81*906afcb8SAndy Fiddaman }
82*906afcb8SAndy Fiddaman }
83*906afcb8SAndy Fiddaman
84*906afcb8SAndy Fiddaman /*
85*906afcb8SAndy Fiddaman * return ppkeyword table name given value
86*906afcb8SAndy Fiddaman */
87*906afcb8SAndy Fiddaman
88*906afcb8SAndy Fiddaman char*
ppkeyname(register int value,int dir)89*906afcb8SAndy Fiddaman ppkeyname(register int value, int dir)
90*906afcb8SAndy Fiddaman {
91*906afcb8SAndy Fiddaman register char* s;
92*906afcb8SAndy Fiddaman register struct ppkeyword* p;
93*906afcb8SAndy Fiddaman
94*906afcb8SAndy Fiddaman if (dir && ppiskey(directives, value, p) || !dir && (ppiskey(options, value, p) || ppiskey(predicates, value, p) || ppiskey(variables, value, p)))
95*906afcb8SAndy Fiddaman {
96*906afcb8SAndy Fiddaman s = (p + (value - p->value))->name;
97*906afcb8SAndy Fiddaman return s + !ppisid(*s);
98*906afcb8SAndy Fiddaman }
99*906afcb8SAndy Fiddaman #if DEBUG
100*906afcb8SAndy Fiddaman error(PANIC, "no keyword table name for value=%d", value);
101*906afcb8SAndy Fiddaman #endif
102*906afcb8SAndy Fiddaman return "UNKNOWN";
103*906afcb8SAndy Fiddaman }
104*906afcb8SAndy Fiddaman
105*906afcb8SAndy Fiddaman /*
106*906afcb8SAndy Fiddaman * add to the include maps
107*906afcb8SAndy Fiddaman */
108*906afcb8SAndy Fiddaman
109*906afcb8SAndy Fiddaman void
ppmapinclude(char * file,register char * s)110*906afcb8SAndy Fiddaman ppmapinclude(char* file, register char* s)
111*906afcb8SAndy Fiddaman {
112*906afcb8SAndy Fiddaman register int c;
113*906afcb8SAndy Fiddaman register struct ppdirs* dp;
114*906afcb8SAndy Fiddaman int fd;
115*906afcb8SAndy Fiddaman int flags;
116*906afcb8SAndy Fiddaman int index;
117*906afcb8SAndy Fiddaman int token;
118*906afcb8SAndy Fiddaman char* t;
119*906afcb8SAndy Fiddaman char* old_file;
120*906afcb8SAndy Fiddaman long old_state;
121*906afcb8SAndy Fiddaman struct ppfile* fp;
122*906afcb8SAndy Fiddaman struct ppfile* mp;
123*906afcb8SAndy Fiddaman
124*906afcb8SAndy Fiddaman old_file = error_info.file;
125*906afcb8SAndy Fiddaman old_state = pp.state;
126*906afcb8SAndy Fiddaman if (s)
127*906afcb8SAndy Fiddaman PUSH_BUFFER("mapinclude", s, 1);
128*906afcb8SAndy Fiddaman else if (file)
129*906afcb8SAndy Fiddaman {
130*906afcb8SAndy Fiddaman if (*file == '-')
131*906afcb8SAndy Fiddaman {
132*906afcb8SAndy Fiddaman if (!error_info.file)
133*906afcb8SAndy Fiddaman {
134*906afcb8SAndy Fiddaman error(1, "%s: input file name required for %s ignore", file, dirname(INCLUDE));
135*906afcb8SAndy Fiddaman return;
136*906afcb8SAndy Fiddaman }
137*906afcb8SAndy Fiddaman s = t = strcopy(pp.tmpbuf, error_info.file);
138*906afcb8SAndy Fiddaman c = *++file;
139*906afcb8SAndy Fiddaman for (;;)
140*906afcb8SAndy Fiddaman {
141*906afcb8SAndy Fiddaman if (s <= pp.tmpbuf || *s == '/')
142*906afcb8SAndy Fiddaman {
143*906afcb8SAndy Fiddaman s = t;
144*906afcb8SAndy Fiddaman break;
145*906afcb8SAndy Fiddaman }
146*906afcb8SAndy Fiddaman else if (*s == c)
147*906afcb8SAndy Fiddaman break;
148*906afcb8SAndy Fiddaman s--;
149*906afcb8SAndy Fiddaman }
150*906afcb8SAndy Fiddaman strcpy(s, file);
151*906afcb8SAndy Fiddaman file = pp.tmpbuf;
152*906afcb8SAndy Fiddaman }
153*906afcb8SAndy Fiddaman if ((fd = ppsearch(file, INC_LOCAL, SEARCH_INCLUDE)) < 0)
154*906afcb8SAndy Fiddaman return;
155*906afcb8SAndy Fiddaman PUSH_FILE(file, fd);
156*906afcb8SAndy Fiddaman }
157*906afcb8SAndy Fiddaman else
158*906afcb8SAndy Fiddaman return;
159*906afcb8SAndy Fiddaman #if CATSTRINGS
160*906afcb8SAndy Fiddaman pp.state |= (COMPILE|FILEPOP|HEADER|JOINING|STRIP|NOSPACE|PASSEOF);
161*906afcb8SAndy Fiddaman #else
162*906afcb8SAndy Fiddaman pp.state |= (COMPILE|FILEPOP|HEADER|STRIP|NOSPACE|PASSEOF);
163*906afcb8SAndy Fiddaman #endif
164*906afcb8SAndy Fiddaman pp.level++;
165*906afcb8SAndy Fiddaman flags = INC_MAPALL;
166*906afcb8SAndy Fiddaman fp = mp = 0;
167*906afcb8SAndy Fiddaman for (;;)
168*906afcb8SAndy Fiddaman {
169*906afcb8SAndy Fiddaman switch (token = pplex())
170*906afcb8SAndy Fiddaman {
171*906afcb8SAndy Fiddaman case 0:
172*906afcb8SAndy Fiddaman case T_STRING:
173*906afcb8SAndy Fiddaman case T_HEADER:
174*906afcb8SAndy Fiddaman if (fp)
175*906afcb8SAndy Fiddaman {
176*906afcb8SAndy Fiddaman fp->guard = INC_IGNORE;
177*906afcb8SAndy Fiddaman for (dp = pp.firstdir->next; dp; dp = dp->next)
178*906afcb8SAndy Fiddaman if (dp->name && (c = strlen(dp->name)) && !strncmp(dp->name, fp->name, c) && fp->name[c] == '/')
179*906afcb8SAndy Fiddaman {
180*906afcb8SAndy Fiddaman ppsetfile(fp->name + c + 1)->guard = INC_IGNORE;
181*906afcb8SAndy Fiddaman break;
182*906afcb8SAndy Fiddaman }
183*906afcb8SAndy Fiddaman }
184*906afcb8SAndy Fiddaman if (!token)
185*906afcb8SAndy Fiddaman break;
186*906afcb8SAndy Fiddaman pathcanon(pp.token, 0, 0);
187*906afcb8SAndy Fiddaman fp = ppsetfile(pp.token);
188*906afcb8SAndy Fiddaman if (mp)
189*906afcb8SAndy Fiddaman {
190*906afcb8SAndy Fiddaman mp->flags |= flags;
191*906afcb8SAndy Fiddaman if (streq(fp->name, "."))
192*906afcb8SAndy Fiddaman mp->flags |= INC_MAPNOLOCAL;
193*906afcb8SAndy Fiddaman else
194*906afcb8SAndy Fiddaman mp->bound[index] = fp;
195*906afcb8SAndy Fiddaman
196*906afcb8SAndy Fiddaman fp = mp = 0;
197*906afcb8SAndy Fiddaman }
198*906afcb8SAndy Fiddaman else
199*906afcb8SAndy Fiddaman index = token == T_HEADER ? INC_STANDARD : INC_LOCAL;
200*906afcb8SAndy Fiddaman continue;
201*906afcb8SAndy Fiddaman case '=':
202*906afcb8SAndy Fiddaman if (!(mp = fp))
203*906afcb8SAndy Fiddaman error(3, "%s: \"name\" = \"binding\" expected");
204*906afcb8SAndy Fiddaman fp = 0;
205*906afcb8SAndy Fiddaman continue;
206*906afcb8SAndy Fiddaman case '\n':
207*906afcb8SAndy Fiddaman continue;
208*906afcb8SAndy Fiddaman case T_ID:
209*906afcb8SAndy Fiddaman if (streq(pp.token, "all"))
210*906afcb8SAndy Fiddaman {
211*906afcb8SAndy Fiddaman flags = INC_MAPALL;
212*906afcb8SAndy Fiddaman continue;
213*906afcb8SAndy Fiddaman }
214*906afcb8SAndy Fiddaman else if (streq(pp.token, "hosted"))
215*906afcb8SAndy Fiddaman {
216*906afcb8SAndy Fiddaman flags = INC_MAPHOSTED;
217*906afcb8SAndy Fiddaman continue;
218*906afcb8SAndy Fiddaman }
219*906afcb8SAndy Fiddaman else if (streq(pp.token, "nohosted"))
220*906afcb8SAndy Fiddaman {
221*906afcb8SAndy Fiddaman flags = INC_MAPNOHOSTED;
222*906afcb8SAndy Fiddaman continue;
223*906afcb8SAndy Fiddaman }
224*906afcb8SAndy Fiddaman /*FALLTHROUGH*/
225*906afcb8SAndy Fiddaman default:
226*906afcb8SAndy Fiddaman error(3, "%s unexpected in %s map list", pptokstr(pp.token, 0), dirname(INCLUDE));
227*906afcb8SAndy Fiddaman break;
228*906afcb8SAndy Fiddaman }
229*906afcb8SAndy Fiddaman break;
230*906afcb8SAndy Fiddaman }
231*906afcb8SAndy Fiddaman pp.level--;
232*906afcb8SAndy Fiddaman error_info.file = old_file;
233*906afcb8SAndy Fiddaman pp.state = old_state;
234*906afcb8SAndy Fiddaman }
235*906afcb8SAndy Fiddaman
236*906afcb8SAndy Fiddaman /*
237*906afcb8SAndy Fiddaman * return non-0 if file is identical to fd
238*906afcb8SAndy Fiddaman */
239*906afcb8SAndy Fiddaman
240*906afcb8SAndy Fiddaman static int
identical(char * file,int fd)241*906afcb8SAndy Fiddaman identical(char* file, int fd)
242*906afcb8SAndy Fiddaman {
243*906afcb8SAndy Fiddaman struct stat a;
244*906afcb8SAndy Fiddaman struct stat b;
245*906afcb8SAndy Fiddaman
246*906afcb8SAndy Fiddaman return !stat(file, &a) && !fstat(fd, &b) && a.st_dev == b.st_dev && a.st_ino == b.st_ino;
247*906afcb8SAndy Fiddaman }
248*906afcb8SAndy Fiddaman
249*906afcb8SAndy Fiddaman /*
250*906afcb8SAndy Fiddaman * compare up to pp.truncate chars
251*906afcb8SAndy Fiddaman *
252*906afcb8SAndy Fiddaman * NOTE: __STD* and symbols containing ' ' are not truncated
253*906afcb8SAndy Fiddaman */
254*906afcb8SAndy Fiddaman
255*906afcb8SAndy Fiddaman static int
trunccomp(register char * a,register char * b)256*906afcb8SAndy Fiddaman trunccomp(register char* a, register char* b)
257*906afcb8SAndy Fiddaman {
258*906afcb8SAndy Fiddaman return !strchr(b, ' ') && !strneq(b, "__STD", 5) ? strncmp(a, b, pp.truncate) : strcmp(a, b);
259*906afcb8SAndy Fiddaman }
260*906afcb8SAndy Fiddaman
261*906afcb8SAndy Fiddaman /*
262*906afcb8SAndy Fiddaman * hash up to pp.truncate chars
263*906afcb8SAndy Fiddaman *
264*906afcb8SAndy Fiddaman * NOTE: __STD* and symbols containing ' ' are not truncated
265*906afcb8SAndy Fiddaman */
266*906afcb8SAndy Fiddaman
267*906afcb8SAndy Fiddaman static unsigned int
trunchash(char * a)268*906afcb8SAndy Fiddaman trunchash(char* a)
269*906afcb8SAndy Fiddaman {
270*906afcb8SAndy Fiddaman int n;
271*906afcb8SAndy Fiddaman
272*906afcb8SAndy Fiddaman return memhash(a, (n = strlen(a)) > pp.truncate && !strchr(a, ' ') && !strneq(a, "__STD", 5) ? pp.truncate : n);
273*906afcb8SAndy Fiddaman }
274*906afcb8SAndy Fiddaman
275*906afcb8SAndy Fiddaman #if DEBUG & TRACE_debug
276*906afcb8SAndy Fiddaman /*
277*906afcb8SAndy Fiddaman * append context to debug trace
278*906afcb8SAndy Fiddaman */
279*906afcb8SAndy Fiddaman
280*906afcb8SAndy Fiddaman static int
context(Sfio_t * sp,int level,int flags)281*906afcb8SAndy Fiddaman context(Sfio_t* sp, int level, int flags)
282*906afcb8SAndy Fiddaman {
283*906afcb8SAndy Fiddaman static int state;
284*906afcb8SAndy Fiddaman
285*906afcb8SAndy Fiddaman NoP(level);
286*906afcb8SAndy Fiddaman NoP(flags);
287*906afcb8SAndy Fiddaman if (error_info.trace <= -10 && pp.state != state)
288*906afcb8SAndy Fiddaman {
289*906afcb8SAndy Fiddaman state = pp.state;
290*906afcb8SAndy Fiddaman sfprintf(sp, " %s", ppstatestr(pp.state));
291*906afcb8SAndy Fiddaman }
292*906afcb8SAndy Fiddaman return 1;
293*906afcb8SAndy Fiddaman }
294*906afcb8SAndy Fiddaman #endif
295*906afcb8SAndy Fiddaman
296*906afcb8SAndy Fiddaman /*
297*906afcb8SAndy Fiddaman * reset include guard
298*906afcb8SAndy Fiddaman */
299*906afcb8SAndy Fiddaman
300*906afcb8SAndy Fiddaman static int
unguard(const char * name,char * v,void * handle)301*906afcb8SAndy Fiddaman unguard(const char* name, char* v, void* handle)
302*906afcb8SAndy Fiddaman {
303*906afcb8SAndy Fiddaman register struct ppfile* fp = (struct ppfile*)v;
304*906afcb8SAndy Fiddaman
305*906afcb8SAndy Fiddaman fp->guard = 0;
306*906afcb8SAndy Fiddaman return 0;
307*906afcb8SAndy Fiddaman }
308*906afcb8SAndy Fiddaman
309*906afcb8SAndy Fiddaman /*
310*906afcb8SAndy Fiddaman * reset macro definition
311*906afcb8SAndy Fiddaman */
312*906afcb8SAndy Fiddaman
313*906afcb8SAndy Fiddaman static void
undefine(void * p)314*906afcb8SAndy Fiddaman undefine(void* p)
315*906afcb8SAndy Fiddaman {
316*906afcb8SAndy Fiddaman struct ppmacro* mac = ((struct ppsymbol*)p)->macro;
317*906afcb8SAndy Fiddaman
318*906afcb8SAndy Fiddaman if (mac)
319*906afcb8SAndy Fiddaman {
320*906afcb8SAndy Fiddaman if (mac->formals)
321*906afcb8SAndy Fiddaman free(mac->formals);
322*906afcb8SAndy Fiddaman free(mac->value);
323*906afcb8SAndy Fiddaman free(mac);
324*906afcb8SAndy Fiddaman }
325*906afcb8SAndy Fiddaman }
326*906afcb8SAndy Fiddaman
327*906afcb8SAndy Fiddaman /*
328*906afcb8SAndy Fiddaman * return non-zero if its ok to ppop(op)
329*906afcb8SAndy Fiddaman */
330*906afcb8SAndy Fiddaman
331*906afcb8SAndy Fiddaman static int
ppok(int op)332*906afcb8SAndy Fiddaman ppok(int op)
333*906afcb8SAndy Fiddaman {
334*906afcb8SAndy Fiddaman long n;
335*906afcb8SAndy Fiddaman long* r;
336*906afcb8SAndy Fiddaman
337*906afcb8SAndy Fiddaman r = &pp.ro_op[op >> 5];
338*906afcb8SAndy Fiddaman n = 1L << op;
339*906afcb8SAndy Fiddaman if ((pp.mode & INIT) && pp.in->type == IN_FILE && (*r & n))
340*906afcb8SAndy Fiddaman {
341*906afcb8SAndy Fiddaman debug((-7, "set op %d index %d skipped -- readonly", op, op >> 5));
342*906afcb8SAndy Fiddaman return 0;
343*906afcb8SAndy Fiddaman }
344*906afcb8SAndy Fiddaman else if (!pp.initialized && (!(pp.mode & INIT) || !(pp.mode & BUILTIN)))
345*906afcb8SAndy Fiddaman {
346*906afcb8SAndy Fiddaman *r |= n;
347*906afcb8SAndy Fiddaman debug((-7, "set op %d index %d readonly", op, op >> 5));
348*906afcb8SAndy Fiddaman }
349*906afcb8SAndy Fiddaman else
350*906afcb8SAndy Fiddaman debug((-7, "set op %d index %d", op, op >> 5));
351*906afcb8SAndy Fiddaman return 1;
352*906afcb8SAndy Fiddaman }
353*906afcb8SAndy Fiddaman
354*906afcb8SAndy Fiddaman /*
355*906afcb8SAndy Fiddaman * pp operations
356*906afcb8SAndy Fiddaman *
357*906afcb8SAndy Fiddaman * NOTE: PP_INIT must be done before the first pplex() call
358*906afcb8SAndy Fiddaman * PP_DONE must be done after the last pplex() call
359*906afcb8SAndy Fiddaman * PP_INIT-PP_DONE must be done for each new PP_INPUT
360*906afcb8SAndy Fiddaman */
361*906afcb8SAndy Fiddaman
362*906afcb8SAndy Fiddaman void
ppop(int op,...)363*906afcb8SAndy Fiddaman ppop(int op, ...)
364*906afcb8SAndy Fiddaman {
365*906afcb8SAndy Fiddaman va_list ap;
366*906afcb8SAndy Fiddaman register char* p;
367*906afcb8SAndy Fiddaman register struct ppkeyword* kp;
368*906afcb8SAndy Fiddaman register char* s;
369*906afcb8SAndy Fiddaman int c;
370*906afcb8SAndy Fiddaman long n;
371*906afcb8SAndy Fiddaman long* r __unused;
372*906afcb8SAndy Fiddaman char* t;
373*906afcb8SAndy Fiddaman struct ppdirs* dp;
374*906afcb8SAndy Fiddaman struct ppdirs* hp;
375*906afcb8SAndy Fiddaman struct ppsymkey* key;
376*906afcb8SAndy Fiddaman struct oplist* xp;
377*906afcb8SAndy Fiddaman Sfio_t* sp;
378*906afcb8SAndy Fiddaman struct stat st;
379*906afcb8SAndy Fiddaman PPCOMMENT ppcomment;
380*906afcb8SAndy Fiddaman PPLINESYNC pplinesync;
381*906afcb8SAndy Fiddaman
382*906afcb8SAndy Fiddaman static int initialized;
383*906afcb8SAndy Fiddaman
384*906afcb8SAndy Fiddaman va_start(ap, op);
385*906afcb8SAndy Fiddaman switch (op)
386*906afcb8SAndy Fiddaman {
387*906afcb8SAndy Fiddaman case PP_ASSERT:
388*906afcb8SAndy Fiddaman case PP_DEFINE:
389*906afcb8SAndy Fiddaman case PP_DIRECTIVE:
390*906afcb8SAndy Fiddaman case PP_OPTION:
391*906afcb8SAndy Fiddaman case PP_READ:
392*906afcb8SAndy Fiddaman case PP_UNDEF:
393*906afcb8SAndy Fiddaman if (pp.initialized)
394*906afcb8SAndy Fiddaman goto before;
395*906afcb8SAndy Fiddaman if ((p = va_arg(ap, char*)) && *p)
396*906afcb8SAndy Fiddaman {
397*906afcb8SAndy Fiddaman if (pp.lastop)
398*906afcb8SAndy Fiddaman pp.lastop = (pp.lastop->next = newof(0, struct oplist, 1, 0));
399*906afcb8SAndy Fiddaman else
400*906afcb8SAndy Fiddaman pp.firstop = pp.lastop = newof(0, struct oplist, 1, 0);
401*906afcb8SAndy Fiddaman pp.lastop->op = op;
402*906afcb8SAndy Fiddaman pp.lastop->value = p;
403*906afcb8SAndy Fiddaman }
404*906afcb8SAndy Fiddaman break;
405*906afcb8SAndy Fiddaman case PP_BUILTIN:
406*906afcb8SAndy Fiddaman pp.builtin = va_arg(ap, PPBUILTIN);
407*906afcb8SAndy Fiddaman break;
408*906afcb8SAndy Fiddaman case PP_CDIR:
409*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
410*906afcb8SAndy Fiddaman c = va_arg(ap, int);
411*906afcb8SAndy Fiddaman pp.cdir.path = 0;
412*906afcb8SAndy Fiddaman if (!p)
413*906afcb8SAndy Fiddaman pp.c = c;
414*906afcb8SAndy Fiddaman else if (streq(p, "-"))
415*906afcb8SAndy Fiddaman {
416*906afcb8SAndy Fiddaman pp.c = c;
417*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
418*906afcb8SAndy Fiddaman dp->c = c;
419*906afcb8SAndy Fiddaman }
420*906afcb8SAndy Fiddaman else if (!pp.c)
421*906afcb8SAndy Fiddaman {
422*906afcb8SAndy Fiddaman if (!*p || stat((pathcanon(p, 0, 0), p), &st))
423*906afcb8SAndy Fiddaman pp.c = c;
424*906afcb8SAndy Fiddaman else
425*906afcb8SAndy Fiddaman {
426*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
427*906afcb8SAndy Fiddaman {
428*906afcb8SAndy Fiddaman if (!pp.c && (dp->c || dp->name && SAMEID(&dp->id, &st)))
429*906afcb8SAndy Fiddaman pp.c = 1;
430*906afcb8SAndy Fiddaman dp->c = pp.c == 1;
431*906afcb8SAndy Fiddaman }
432*906afcb8SAndy Fiddaman if (!pp.c)
433*906afcb8SAndy Fiddaman {
434*906afcb8SAndy Fiddaman pp.cdir.path = p;
435*906afcb8SAndy Fiddaman SAVEID(&pp.cdir.id, &st);
436*906afcb8SAndy Fiddaman }
437*906afcb8SAndy Fiddaman }
438*906afcb8SAndy Fiddaman }
439*906afcb8SAndy Fiddaman break;
440*906afcb8SAndy Fiddaman case PP_CHOP:
441*906afcb8SAndy Fiddaman if (p = va_arg(ap, char*))
442*906afcb8SAndy Fiddaman {
443*906afcb8SAndy Fiddaman c = strlen(p);
444*906afcb8SAndy Fiddaman xp = newof(0, struct oplist, 1, c + 1);
445*906afcb8SAndy Fiddaman xp->value = ((char*)xp) + sizeof(struct oplist);
446*906afcb8SAndy Fiddaman s = xp->value;
447*906afcb8SAndy Fiddaman c = *p++;
448*906afcb8SAndy Fiddaman while (*p && *p != c)
449*906afcb8SAndy Fiddaman *s++ = *p++;
450*906afcb8SAndy Fiddaman *s++ = '/';
451*906afcb8SAndy Fiddaman xp->op = s - xp->value;
452*906afcb8SAndy Fiddaman *s++ = 0;
453*906afcb8SAndy Fiddaman if (*p && *++p && *p != c)
454*906afcb8SAndy Fiddaman {
455*906afcb8SAndy Fiddaman while (*p && *p != c)
456*906afcb8SAndy Fiddaman *s++ = *p++;
457*906afcb8SAndy Fiddaman *s++ = '/';
458*906afcb8SAndy Fiddaman }
459*906afcb8SAndy Fiddaman *s = 0;
460*906afcb8SAndy Fiddaman xp->next = pp.chop;
461*906afcb8SAndy Fiddaman pp.chop = xp;
462*906afcb8SAndy Fiddaman }
463*906afcb8SAndy Fiddaman break;
464*906afcb8SAndy Fiddaman case PP_COMMENT:
465*906afcb8SAndy Fiddaman if (pp.comment = va_arg(ap, PPCOMMENT))
466*906afcb8SAndy Fiddaman pp.flags |= PP_comment;
467*906afcb8SAndy Fiddaman else
468*906afcb8SAndy Fiddaman pp.flags &= ~PP_comment;
469*906afcb8SAndy Fiddaman break;
470*906afcb8SAndy Fiddaman case PP_COMPATIBILITY:
471*906afcb8SAndy Fiddaman if (ppset(&pp.state, COMPATIBILITY, va_arg(ap, int)))
472*906afcb8SAndy Fiddaman {
473*906afcb8SAndy Fiddaman #if COMPATIBLE
474*906afcb8SAndy Fiddaman if (pp.initialized)
475*906afcb8SAndy Fiddaman ppfsm(FSM_COMPATIBILITY, NiL);
476*906afcb8SAndy Fiddaman #else
477*906afcb8SAndy Fiddaman if (pp.state & COMPATIBILITY)
478*906afcb8SAndy Fiddaman error(3, "preprocessor not compiled with compatibility dialect enabled [COMPATIBLE]");
479*906afcb8SAndy Fiddaman #endif
480*906afcb8SAndy Fiddaman if (pp.state & COMPATIBILITY)
481*906afcb8SAndy Fiddaman pp.flags |= PP_compatibility;
482*906afcb8SAndy Fiddaman else
483*906afcb8SAndy Fiddaman pp.flags &= ~PP_compatibility;
484*906afcb8SAndy Fiddaman }
485*906afcb8SAndy Fiddaman break;
486*906afcb8SAndy Fiddaman case PP_COMPILE:
487*906afcb8SAndy Fiddaman if (pp.initialized)
488*906afcb8SAndy Fiddaman goto before;
489*906afcb8SAndy Fiddaman pp.state |= COMPILE;
490*906afcb8SAndy Fiddaman if (!pp.symtab)
491*906afcb8SAndy Fiddaman pp.symtab = hashalloc(NiL, HASH_name, "symbols", 0);
492*906afcb8SAndy Fiddaman if (kp = va_arg(ap, struct ppkeyword*))
493*906afcb8SAndy Fiddaman for (; s = kp->name; kp++)
494*906afcb8SAndy Fiddaman {
495*906afcb8SAndy Fiddaman n = SYM_LEX;
496*906afcb8SAndy Fiddaman switch (*s)
497*906afcb8SAndy Fiddaman {
498*906afcb8SAndy Fiddaman case '-':
499*906afcb8SAndy Fiddaman s++;
500*906afcb8SAndy Fiddaman break;
501*906afcb8SAndy Fiddaman case '+':
502*906afcb8SAndy Fiddaman s++;
503*906afcb8SAndy Fiddaman if (!(pp.option & PLUSPLUS))
504*906afcb8SAndy Fiddaman break;
505*906afcb8SAndy Fiddaman /*FALLTHROUGH*/
506*906afcb8SAndy Fiddaman default:
507*906afcb8SAndy Fiddaman n |= SYM_KEYWORD;
508*906afcb8SAndy Fiddaman break;
509*906afcb8SAndy Fiddaman }
510*906afcb8SAndy Fiddaman if (key = ppkeyset(pp.symtab, s))
511*906afcb8SAndy Fiddaman {
512*906afcb8SAndy Fiddaman key->sym.flags = n;
513*906afcb8SAndy Fiddaman key->lex = kp->value;
514*906afcb8SAndy Fiddaman }
515*906afcb8SAndy Fiddaman }
516*906afcb8SAndy Fiddaman break;
517*906afcb8SAndy Fiddaman case PP_DEBUG:
518*906afcb8SAndy Fiddaman error_info.trace = va_arg(ap, int);
519*906afcb8SAndy Fiddaman break;
520*906afcb8SAndy Fiddaman case PP_DEFAULT:
521*906afcb8SAndy Fiddaman if (p = va_arg(ap, char*))
522*906afcb8SAndy Fiddaman p = strdup(p);
523*906afcb8SAndy Fiddaman if (pp.ppdefault)
524*906afcb8SAndy Fiddaman free(pp.ppdefault);
525*906afcb8SAndy Fiddaman pp.ppdefault = p;
526*906afcb8SAndy Fiddaman break;
527*906afcb8SAndy Fiddaman case PP_DONE:
528*906afcb8SAndy Fiddaman #if CHECKPOINT
529*906afcb8SAndy Fiddaman if (pp.mode & DUMP)
530*906afcb8SAndy Fiddaman ppdump();
531*906afcb8SAndy Fiddaman #endif
532*906afcb8SAndy Fiddaman if (pp.mode & FILEDEPS)
533*906afcb8SAndy Fiddaman {
534*906afcb8SAndy Fiddaman sfputc(pp.filedeps.sp, '\n');
535*906afcb8SAndy Fiddaman if (pp.filedeps.sp == sfstdout)
536*906afcb8SAndy Fiddaman sfsync(pp.filedeps.sp);
537*906afcb8SAndy Fiddaman else
538*906afcb8SAndy Fiddaman sfclose(pp.filedeps.sp);
539*906afcb8SAndy Fiddaman }
540*906afcb8SAndy Fiddaman if (pp.state & STANDALONE)
541*906afcb8SAndy Fiddaman {
542*906afcb8SAndy Fiddaman if ((pp.state & (NOTEXT|HIDDEN)) == HIDDEN && pplastout() != '\n')
543*906afcb8SAndy Fiddaman ppputchar('\n');
544*906afcb8SAndy Fiddaman ppflushout();
545*906afcb8SAndy Fiddaman }
546*906afcb8SAndy Fiddaman error_info.file = 0;
547*906afcb8SAndy Fiddaman break;
548*906afcb8SAndy Fiddaman case PP_DUMP:
549*906afcb8SAndy Fiddaman ppset(&pp.mode, DUMP, va_arg(ap, int));
550*906afcb8SAndy Fiddaman #if !CHECKPOINT
551*906afcb8SAndy Fiddaman if (pp.mode & DUMP)
552*906afcb8SAndy Fiddaman error(3, "preprocessor not compiled with checkpoint enabled [CHECKPOINT]");
553*906afcb8SAndy Fiddaman #endif
554*906afcb8SAndy Fiddaman break;
555*906afcb8SAndy Fiddaman case PP_FILEDEPS:
556*906afcb8SAndy Fiddaman if (n = va_arg(ap, int))
557*906afcb8SAndy Fiddaman pp.filedeps.flags |= n;
558*906afcb8SAndy Fiddaman else
559*906afcb8SAndy Fiddaman pp.filedeps.flags = 0;
560*906afcb8SAndy Fiddaman break;
561*906afcb8SAndy Fiddaman case PP_FILENAME:
562*906afcb8SAndy Fiddaman error_info.file = va_arg(ap, char*);
563*906afcb8SAndy Fiddaman break;
564*906afcb8SAndy Fiddaman case PP_HOSTDIR:
565*906afcb8SAndy Fiddaman if (!(pp.mode & INIT))
566*906afcb8SAndy Fiddaman pp.ro_mode |= HOSTED;
567*906afcb8SAndy Fiddaman else if (pp.ro_mode & HOSTED)
568*906afcb8SAndy Fiddaman break;
569*906afcb8SAndy Fiddaman pp.ro_mode |= INIT;
570*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
571*906afcb8SAndy Fiddaman c = va_arg(ap, int);
572*906afcb8SAndy Fiddaman pp.hostdir.path = 0;
573*906afcb8SAndy Fiddaman if (!p)
574*906afcb8SAndy Fiddaman pp.hosted = c;
575*906afcb8SAndy Fiddaman else if (streq(p, "-"))
576*906afcb8SAndy Fiddaman {
577*906afcb8SAndy Fiddaman if (pp.initialized)
578*906afcb8SAndy Fiddaman ppset(&pp.mode, HOSTED, c);
579*906afcb8SAndy Fiddaman else
580*906afcb8SAndy Fiddaman {
581*906afcb8SAndy Fiddaman pp.hosted = c ? 1 : 2;
582*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
583*906afcb8SAndy Fiddaman if (pp.hosted == 1)
584*906afcb8SAndy Fiddaman dp->type |= TYPE_HOSTED;
585*906afcb8SAndy Fiddaman else
586*906afcb8SAndy Fiddaman dp->type &= ~TYPE_HOSTED;
587*906afcb8SAndy Fiddaman }
588*906afcb8SAndy Fiddaman }
589*906afcb8SAndy Fiddaman else if (!pp.hosted)
590*906afcb8SAndy Fiddaman {
591*906afcb8SAndy Fiddaman if (!*p || stat((pathcanon(p, 0, 0), p), &st))
592*906afcb8SAndy Fiddaman pp.hosted = 1;
593*906afcb8SAndy Fiddaman else
594*906afcb8SAndy Fiddaman {
595*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
596*906afcb8SAndy Fiddaman {
597*906afcb8SAndy Fiddaman if (!pp.hosted && ((dp->type & TYPE_HOSTED) || dp->name && SAMEID(&dp->id, &st)))
598*906afcb8SAndy Fiddaman pp.hosted = 1;
599*906afcb8SAndy Fiddaman if (pp.hosted == 1)
600*906afcb8SAndy Fiddaman dp->type |= TYPE_HOSTED;
601*906afcb8SAndy Fiddaman else
602*906afcb8SAndy Fiddaman dp->type &= ~TYPE_HOSTED;
603*906afcb8SAndy Fiddaman }
604*906afcb8SAndy Fiddaman if (!pp.hosted)
605*906afcb8SAndy Fiddaman {
606*906afcb8SAndy Fiddaman pp.hostdir.path = p;
607*906afcb8SAndy Fiddaman SAVEID(&pp.hostdir.id, &st);
608*906afcb8SAndy Fiddaman }
609*906afcb8SAndy Fiddaman }
610*906afcb8SAndy Fiddaman }
611*906afcb8SAndy Fiddaman break;
612*906afcb8SAndy Fiddaman case PP_ID:
613*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
614*906afcb8SAndy Fiddaman c = va_arg(ap, int);
615*906afcb8SAndy Fiddaman if (p)
616*906afcb8SAndy Fiddaman ppfsm(c ? FSM_IDADD : FSM_IDDEL, p);
617*906afcb8SAndy Fiddaman break;
618*906afcb8SAndy Fiddaman case PP_IGNORE:
619*906afcb8SAndy Fiddaman if (p = va_arg(ap, char*))
620*906afcb8SAndy Fiddaman {
621*906afcb8SAndy Fiddaman pathcanon(p, 0, 0);
622*906afcb8SAndy Fiddaman ppsetfile(p)->guard = INC_IGNORE;
623*906afcb8SAndy Fiddaman message((-3, "%s: ignore", p));
624*906afcb8SAndy Fiddaman }
625*906afcb8SAndy Fiddaman break;
626*906afcb8SAndy Fiddaman case PP_IGNORELIST:
627*906afcb8SAndy Fiddaman if (pp.initialized)
628*906afcb8SAndy Fiddaman goto before;
629*906afcb8SAndy Fiddaman pp.ignore = va_arg(ap, char*);
630*906afcb8SAndy Fiddaman break;
631*906afcb8SAndy Fiddaman case PP_INCLUDE:
632*906afcb8SAndy Fiddaman if ((p = va_arg(ap, char*)) && *p)
633*906afcb8SAndy Fiddaman {
634*906afcb8SAndy Fiddaman pathcanon(p, 0, 0);
635*906afcb8SAndy Fiddaman if (stat(p, &st))
636*906afcb8SAndy Fiddaman break;
637*906afcb8SAndy Fiddaman for (dp = pp.stddirs; dp = dp->next;)
638*906afcb8SAndy Fiddaman if (dp->name && SAMEID(&dp->id, &st))
639*906afcb8SAndy Fiddaman break;
640*906afcb8SAndy Fiddaman if (pp.cdir.path && SAMEID(&pp.cdir.id, &st))
641*906afcb8SAndy Fiddaman {
642*906afcb8SAndy Fiddaman pp.cdir.path = 0;
643*906afcb8SAndy Fiddaman pp.c = 1;
644*906afcb8SAndy Fiddaman }
645*906afcb8SAndy Fiddaman if (pp.hostdir.path && SAMEID(&pp.hostdir.id, &st))
646*906afcb8SAndy Fiddaman {
647*906afcb8SAndy Fiddaman pp.hostdir.path = 0;
648*906afcb8SAndy Fiddaman pp.hosted = 1;
649*906afcb8SAndy Fiddaman }
650*906afcb8SAndy Fiddaman if ((pp.mode & INIT) && !(pp.ro_mode & INIT))
651*906afcb8SAndy Fiddaman pp.hosted = 1;
652*906afcb8SAndy Fiddaman c = dp && dp->c || pp.c == 1;
653*906afcb8SAndy Fiddaman n = dp && (dp->type & TYPE_HOSTED) || pp.hosted == 1;
654*906afcb8SAndy Fiddaman if (!dp || dp == pp.lastdir->next)
655*906afcb8SAndy Fiddaman {
656*906afcb8SAndy Fiddaman if (dp)
657*906afcb8SAndy Fiddaman {
658*906afcb8SAndy Fiddaman c = dp->c;
659*906afcb8SAndy Fiddaman n = dp->type & TYPE_HOSTED;
660*906afcb8SAndy Fiddaman }
661*906afcb8SAndy Fiddaman dp = newof(0, struct ppdirs, 1, 0);
662*906afcb8SAndy Fiddaman dp->name = p;
663*906afcb8SAndy Fiddaman SAVEID(&dp->id, &st);
664*906afcb8SAndy Fiddaman dp->type |= TYPE_INCLUDE;
665*906afcb8SAndy Fiddaman dp->index = INC_LOCAL + pp.ignoresrc != 0;
666*906afcb8SAndy Fiddaman dp->next = pp.lastdir->next;
667*906afcb8SAndy Fiddaman pp.lastdir = pp.lastdir->next = dp;
668*906afcb8SAndy Fiddaman }
669*906afcb8SAndy Fiddaman dp->c = c;
670*906afcb8SAndy Fiddaman if (n)
671*906afcb8SAndy Fiddaman dp->type |= TYPE_HOSTED;
672*906afcb8SAndy Fiddaman else
673*906afcb8SAndy Fiddaman dp->type &= ~TYPE_HOSTED;
674*906afcb8SAndy Fiddaman }
675*906afcb8SAndy Fiddaman break;
676*906afcb8SAndy Fiddaman case PP_INCREF:
677*906afcb8SAndy Fiddaman pp.incref = va_arg(ap, PPINCREF);
678*906afcb8SAndy Fiddaman break;
679*906afcb8SAndy Fiddaman case PP_RESET:
680*906afcb8SAndy Fiddaman pp.reset.on = 1;
681*906afcb8SAndy Fiddaman break;
682*906afcb8SAndy Fiddaman case PP_INIT:
683*906afcb8SAndy Fiddaman if (pp.initialized)
684*906afcb8SAndy Fiddaman {
685*906afcb8SAndy Fiddaman error_info.errors = 0;
686*906afcb8SAndy Fiddaman error_info.warnings = 0;
687*906afcb8SAndy Fiddaman }
688*906afcb8SAndy Fiddaman else
689*906afcb8SAndy Fiddaman {
690*906afcb8SAndy Fiddaman /*
691*906afcb8SAndy Fiddaman * context initialization
692*906afcb8SAndy Fiddaman */
693*906afcb8SAndy Fiddaman
694*906afcb8SAndy Fiddaman if (!initialized)
695*906afcb8SAndy Fiddaman {
696*906afcb8SAndy Fiddaman /*
697*906afcb8SAndy Fiddaman * out of malloc is fatal
698*906afcb8SAndy Fiddaman */
699*906afcb8SAndy Fiddaman
700*906afcb8SAndy Fiddaman memfatal();
701*906afcb8SAndy Fiddaman
702*906afcb8SAndy Fiddaman /*
703*906afcb8SAndy Fiddaman * initialize the error message interface
704*906afcb8SAndy Fiddaman */
705*906afcb8SAndy Fiddaman
706*906afcb8SAndy Fiddaman error_info.version = (char*)pp.version;
707*906afcb8SAndy Fiddaman #if DEBUG & TRACE_debug
708*906afcb8SAndy Fiddaman error_info.auxilliary = context;
709*906afcb8SAndy Fiddaman pptrace(0);
710*906afcb8SAndy Fiddaman #endif
711*906afcb8SAndy Fiddaman
712*906afcb8SAndy Fiddaman /*
713*906afcb8SAndy Fiddaman * initialize pplex tables
714*906afcb8SAndy Fiddaman */
715*906afcb8SAndy Fiddaman
716*906afcb8SAndy Fiddaman ppfsm(FSM_INIT, NiL);
717*906afcb8SAndy Fiddaman
718*906afcb8SAndy Fiddaman /*
719*906afcb8SAndy Fiddaman * fixed macro stack size -- room for improvement
720*906afcb8SAndy Fiddaman */
721*906afcb8SAndy Fiddaman
722*906afcb8SAndy Fiddaman pp.macp = newof(0, struct ppmacstk, DEFMACSTACK, 0);
723*906afcb8SAndy Fiddaman pp.macp->next = pp.macp + 1;
724*906afcb8SAndy Fiddaman pp.maxmac = (char*)pp.macp + DEFMACSTACK;
725*906afcb8SAndy Fiddaman initialized = 1;
726*906afcb8SAndy Fiddaman
727*906afcb8SAndy Fiddaman /*
728*906afcb8SAndy Fiddaman * initial include/if control stack
729*906afcb8SAndy Fiddaman */
730*906afcb8SAndy Fiddaman
731*906afcb8SAndy Fiddaman pp.control = newof(0, long, pp.constack, 0);
732*906afcb8SAndy Fiddaman pp.maxcon = pp.control + pp.constack - 1;
733*906afcb8SAndy Fiddaman }
734*906afcb8SAndy Fiddaman
735*906afcb8SAndy Fiddaman /*
736*906afcb8SAndy Fiddaman * validate modes
737*906afcb8SAndy Fiddaman */
738*906afcb8SAndy Fiddaman
739*906afcb8SAndy Fiddaman switch (pp.arg_mode)
740*906afcb8SAndy Fiddaman {
741*906afcb8SAndy Fiddaman case 'a':
742*906afcb8SAndy Fiddaman case 'C':
743*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 0);
744*906afcb8SAndy Fiddaman ppop(PP_TRANSITION, 1);
745*906afcb8SAndy Fiddaman break;
746*906afcb8SAndy Fiddaman case 'A':
747*906afcb8SAndy Fiddaman case 'c':
748*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 0);
749*906afcb8SAndy Fiddaman ppop(PP_STRICT, 1);
750*906afcb8SAndy Fiddaman break;
751*906afcb8SAndy Fiddaman case 'f':
752*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 1);
753*906afcb8SAndy Fiddaman ppop(PP_PLUSPLUS, 1);
754*906afcb8SAndy Fiddaman ppop(PP_TRANSITION, 1);
755*906afcb8SAndy Fiddaman break;
756*906afcb8SAndy Fiddaman case 'F':
757*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 0);
758*906afcb8SAndy Fiddaman ppop(PP_PLUSPLUS, 1);
759*906afcb8SAndy Fiddaman break;
760*906afcb8SAndy Fiddaman case 'k':
761*906afcb8SAndy Fiddaman case 's':
762*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 1);
763*906afcb8SAndy Fiddaman ppop(PP_STRICT, 1);
764*906afcb8SAndy Fiddaman break;
765*906afcb8SAndy Fiddaman case 'o':
766*906afcb8SAndy Fiddaman case 'O':
767*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 1);
768*906afcb8SAndy Fiddaman ppop(PP_TRANSITION, 0);
769*906afcb8SAndy Fiddaman break;
770*906afcb8SAndy Fiddaman case 't':
771*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 1);
772*906afcb8SAndy Fiddaman ppop(PP_TRANSITION, 1);
773*906afcb8SAndy Fiddaman break;
774*906afcb8SAndy Fiddaman }
775*906afcb8SAndy Fiddaman if (!(pp.state & WARN) && !(pp.arg_style & STYLE_gnu))
776*906afcb8SAndy Fiddaman ppop(PP_PEDANTIC, 1);
777*906afcb8SAndy Fiddaman if (pp.state & PASSTHROUGH)
778*906afcb8SAndy Fiddaman {
779*906afcb8SAndy Fiddaman if (pp.state & COMPILE)
780*906afcb8SAndy Fiddaman {
781*906afcb8SAndy Fiddaman pp.state &= ~PASSTHROUGH;
782*906afcb8SAndy Fiddaman error(1, "passthrough ignored for compile");
783*906afcb8SAndy Fiddaman }
784*906afcb8SAndy Fiddaman else
785*906afcb8SAndy Fiddaman {
786*906afcb8SAndy Fiddaman ppop(PP_COMPATIBILITY, 1);
787*906afcb8SAndy Fiddaman ppop(PP_HOSTDIR, "-", 1);
788*906afcb8SAndy Fiddaman ppop(PP_SPACEOUT, 1);
789*906afcb8SAndy Fiddaman ppset(&pp.state, DISABLE, va_arg(ap, int));
790*906afcb8SAndy Fiddaman }
791*906afcb8SAndy Fiddaman }
792*906afcb8SAndy Fiddaman
793*906afcb8SAndy Fiddaman /*
794*906afcb8SAndy Fiddaman * create the hash tables
795*906afcb8SAndy Fiddaman */
796*906afcb8SAndy Fiddaman
797*906afcb8SAndy Fiddaman if (!pp.symtab)
798*906afcb8SAndy Fiddaman pp.symtab = hashalloc(NiL, HASH_name, "symbols", 0);
799*906afcb8SAndy Fiddaman if (!pp.dirtab)
800*906afcb8SAndy Fiddaman {
801*906afcb8SAndy Fiddaman pp.dirtab = hashalloc(REFONE, HASH_name, "directives", 0);
802*906afcb8SAndy Fiddaman inithash(pp.dirtab, directives);
803*906afcb8SAndy Fiddaman }
804*906afcb8SAndy Fiddaman if (!pp.filtab)
805*906afcb8SAndy Fiddaman pp.filtab = hashalloc(REFALL, HASH_name, "files", 0);
806*906afcb8SAndy Fiddaman if (!pp.prdtab)
807*906afcb8SAndy Fiddaman pp.prdtab = hashalloc(REFALL, HASH_name, "predicates", 0);
808*906afcb8SAndy Fiddaman if (!pp.strtab)
809*906afcb8SAndy Fiddaman {
810*906afcb8SAndy Fiddaman pp.strtab = hashalloc(REFALL, HASH_name, "strings", 0);
811*906afcb8SAndy Fiddaman inithash(pp.strtab, options);
812*906afcb8SAndy Fiddaman inithash(pp.strtab, predicates);
813*906afcb8SAndy Fiddaman inithash(pp.strtab, variables);
814*906afcb8SAndy Fiddaman }
815*906afcb8SAndy Fiddaman pp.optflags[X_PROTOTYPED] = OPT_GLOBAL;
816*906afcb8SAndy Fiddaman pp.optflags[X_SYSTEM_HEADER] = OPT_GLOBAL|OPT_PASS;
817*906afcb8SAndy Fiddaman
818*906afcb8SAndy Fiddaman /*
819*906afcb8SAndy Fiddaman * mark macros that are builtin predicates
820*906afcb8SAndy Fiddaman */
821*906afcb8SAndy Fiddaman
822*906afcb8SAndy Fiddaman for (kp = predicates; s = kp->name; kp++)
823*906afcb8SAndy Fiddaman {
824*906afcb8SAndy Fiddaman if (!ppisid(*s))
825*906afcb8SAndy Fiddaman s++;
826*906afcb8SAndy Fiddaman ppassert(DEFINE, s, 0);
827*906afcb8SAndy Fiddaman }
828*906afcb8SAndy Fiddaman
829*906afcb8SAndy Fiddaman /*
830*906afcb8SAndy Fiddaman * the remaining entry names must be allocated
831*906afcb8SAndy Fiddaman */
832*906afcb8SAndy Fiddaman
833*906afcb8SAndy Fiddaman hashset(pp.dirtab, HASH_ALLOCATE);
834*906afcb8SAndy Fiddaman hashset(pp.filtab, HASH_ALLOCATE);
835*906afcb8SAndy Fiddaman hashset(pp.prdtab, HASH_ALLOCATE);
836*906afcb8SAndy Fiddaman hashset(pp.strtab, HASH_ALLOCATE);
837*906afcb8SAndy Fiddaman hashset(pp.symtab, HASH_ALLOCATE);
838*906afcb8SAndy Fiddaman if (pp.test & TEST_nonoise)
839*906afcb8SAndy Fiddaman {
840*906afcb8SAndy Fiddaman c = error_info.trace;
841*906afcb8SAndy Fiddaman error_info.trace = 0;
842*906afcb8SAndy Fiddaman }
843*906afcb8SAndy Fiddaman #if DEBUG
844*906afcb8SAndy Fiddaman if (!(pp.test & TEST_noinit))
845*906afcb8SAndy Fiddaman {
846*906afcb8SAndy Fiddaman #endif
847*906afcb8SAndy Fiddaman
848*906afcb8SAndy Fiddaman /*
849*906afcb8SAndy Fiddaman * compose, push and read the builtin initialization script
850*906afcb8SAndy Fiddaman */
851*906afcb8SAndy Fiddaman
852*906afcb8SAndy Fiddaman if (!(sp = sfstropen()))
853*906afcb8SAndy Fiddaman error(3, "temporary buffer allocation error");
854*906afcb8SAndy Fiddaman sfprintf(sp,
855*906afcb8SAndy Fiddaman "\
856*906afcb8SAndy Fiddaman #%s %s:%s \"/#<assert> /\" \"/assert /%s #/\"\n\
857*906afcb8SAndy Fiddaman #%s %s:%s \"/#<unassert> /\" \"/unassert /%s #/\"\n\
858*906afcb8SAndy Fiddaman ",
859*906afcb8SAndy Fiddaman dirname(PRAGMA),
860*906afcb8SAndy Fiddaman pp.pass,
861*906afcb8SAndy Fiddaman keyname(X_MAP),
862*906afcb8SAndy Fiddaman dirname(DEFINE),
863*906afcb8SAndy Fiddaman dirname(PRAGMA),
864*906afcb8SAndy Fiddaman pp.pass,
865*906afcb8SAndy Fiddaman keyname(X_MAP),
866*906afcb8SAndy Fiddaman dirname(UNDEF));
867*906afcb8SAndy Fiddaman if (pp.ppdefault && *pp.ppdefault)
868*906afcb8SAndy Fiddaman {
869*906afcb8SAndy Fiddaman if (pp.probe)
870*906afcb8SAndy Fiddaman {
871*906afcb8SAndy Fiddaman c = pp.lastdir->next->type;
872*906afcb8SAndy Fiddaman pp.lastdir->next->type = 0;
873*906afcb8SAndy Fiddaman }
874*906afcb8SAndy Fiddaman if (ppsearch(pp.ppdefault, T_STRING, SEARCH_EXISTS) < 0)
875*906afcb8SAndy Fiddaman {
876*906afcb8SAndy Fiddaman free(pp.ppdefault);
877*906afcb8SAndy Fiddaman if (!(pp.ppdefault = pathprobe("C", pp.pass, pp.probe ? pp.probe : PPPROBE, 0, pp.path, MAXTOKEN + 1, NiL, 0)))
878*906afcb8SAndy Fiddaman error(1, "cannot determine default definitions for %s", pp.probe ? pp.probe : PPPROBE);
879*906afcb8SAndy Fiddaman }
880*906afcb8SAndy Fiddaman if (pp.probe)
881*906afcb8SAndy Fiddaman pp.lastdir->next->type = c;
882*906afcb8SAndy Fiddaman }
883*906afcb8SAndy Fiddaman while (pp.firstop)
884*906afcb8SAndy Fiddaman {
885*906afcb8SAndy Fiddaman switch (pp.firstop->op)
886*906afcb8SAndy Fiddaman {
887*906afcb8SAndy Fiddaman case PP_ASSERT:
888*906afcb8SAndy Fiddaman sfprintf(sp, "#%s #%s\n", dirname(DEFINE), pp.firstop->value);
889*906afcb8SAndy Fiddaman break;
890*906afcb8SAndy Fiddaman case PP_DEFINE:
891*906afcb8SAndy Fiddaman if (*pp.firstop->value == '#')
892*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s\n", dirname(DEFINE), pp.firstop->value);
893*906afcb8SAndy Fiddaman else
894*906afcb8SAndy Fiddaman {
895*906afcb8SAndy Fiddaman if (s = strchr(pp.firstop->value, '='))
896*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %-.*s %s\n", dirname(DEFINE), s - pp.firstop->value, pp.firstop->value, s + 1);
897*906afcb8SAndy Fiddaman else
898*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s 1\n", dirname(DEFINE), pp.firstop->value);
899*906afcb8SAndy Fiddaman }
900*906afcb8SAndy Fiddaman break;
901*906afcb8SAndy Fiddaman case PP_DIRECTIVE:
902*906afcb8SAndy Fiddaman sfprintf(sp, "#%s\n", pp.firstop->value);
903*906afcb8SAndy Fiddaman break;
904*906afcb8SAndy Fiddaman case PP_OPTION:
905*906afcb8SAndy Fiddaman if (s = strchr(pp.firstop->value, '='))
906*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s:%-.*s %s\n", dirname(PRAGMA), pp.pass, s - pp.firstop->value, pp.firstop->value, s + 1);
907*906afcb8SAndy Fiddaman else
908*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s:%s\n", dirname(PRAGMA), pp.pass, pp.firstop->value);
909*906afcb8SAndy Fiddaman break;
910*906afcb8SAndy Fiddaman case PP_READ:
911*906afcb8SAndy Fiddaman sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), pp.firstop->value);
912*906afcb8SAndy Fiddaman break;
913*906afcb8SAndy Fiddaman case PP_UNDEF:
914*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s\n", dirname(UNDEF), pp.firstop->value);
915*906afcb8SAndy Fiddaman break;
916*906afcb8SAndy Fiddaman }
917*906afcb8SAndy Fiddaman pp.lastop = pp.firstop;
918*906afcb8SAndy Fiddaman pp.firstop = pp.firstop->next;
919*906afcb8SAndy Fiddaman free(pp.lastop);
920*906afcb8SAndy Fiddaman }
921*906afcb8SAndy Fiddaman sfprintf(sp,
922*906afcb8SAndy Fiddaman "\
923*906afcb8SAndy Fiddaman #%s %s:%s\n\
924*906afcb8SAndy Fiddaman #%s %s:%s\n\
925*906afcb8SAndy Fiddaman #%s !#%s(%s)\n\
926*906afcb8SAndy Fiddaman #%s !#%s(%s) || #%s(%s)\n\
927*906afcb8SAndy Fiddaman "
928*906afcb8SAndy Fiddaman , dirname(PRAGMA)
929*906afcb8SAndy Fiddaman , pp.pass
930*906afcb8SAndy Fiddaman , keyname(X_BUILTIN)
931*906afcb8SAndy Fiddaman , dirname(PRAGMA)
932*906afcb8SAndy Fiddaman , pp.pass
933*906afcb8SAndy Fiddaman , keyname(X_PREDEFINED)
934*906afcb8SAndy Fiddaman , dirname(IF)
935*906afcb8SAndy Fiddaman , keyname(X_OPTION)
936*906afcb8SAndy Fiddaman , keyname(X_PLUSPLUS)
937*906afcb8SAndy Fiddaman , dirname(IF)
938*906afcb8SAndy Fiddaman , keyname(X_OPTION)
939*906afcb8SAndy Fiddaman , keyname(X_COMPATIBILITY)
940*906afcb8SAndy Fiddaman , keyname(X_OPTION)
941*906afcb8SAndy Fiddaman , keyname(X_TRANSITION)
942*906afcb8SAndy Fiddaman );
943*906afcb8SAndy Fiddaman sfprintf(sp,
944*906afcb8SAndy Fiddaman "\
945*906afcb8SAndy Fiddaman #%s #%s(%s)\n\
946*906afcb8SAndy Fiddaman #%s %s:%s\n\
947*906afcb8SAndy Fiddaman #%s %s:%s\n\
948*906afcb8SAndy Fiddaman #%s __STRICT__ 1\n\
949*906afcb8SAndy Fiddaman #%s\n\
950*906afcb8SAndy Fiddaman #%s\n\
951*906afcb8SAndy Fiddaman "
952*906afcb8SAndy Fiddaman , dirname(IF)
953*906afcb8SAndy Fiddaman , keyname(X_OPTION)
954*906afcb8SAndy Fiddaman , keyname(X_STRICT)
955*906afcb8SAndy Fiddaman , dirname(PRAGMA)
956*906afcb8SAndy Fiddaman , pp.pass
957*906afcb8SAndy Fiddaman , keyname(X_ALLMULTIPLE)
958*906afcb8SAndy Fiddaman , dirname(PRAGMA)
959*906afcb8SAndy Fiddaman , pp.pass
960*906afcb8SAndy Fiddaman , keyname(X_READONLY)
961*906afcb8SAndy Fiddaman , dirname(DEFINE)
962*906afcb8SAndy Fiddaman , dirname(ENDIF)
963*906afcb8SAndy Fiddaman , dirname(ENDIF)
964*906afcb8SAndy Fiddaman );
965*906afcb8SAndy Fiddaman for (kp = readonlys; s = kp->name; kp++)
966*906afcb8SAndy Fiddaman {
967*906afcb8SAndy Fiddaman if (!ppisid(*s))
968*906afcb8SAndy Fiddaman s++;
969*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s\n", dirname(UNDEF), s);
970*906afcb8SAndy Fiddaman }
971*906afcb8SAndy Fiddaman sfprintf(sp,
972*906afcb8SAndy Fiddaman "\
973*906afcb8SAndy Fiddaman #%s\n\
974*906afcb8SAndy Fiddaman #%s __STDPP__ 1\n\
975*906afcb8SAndy Fiddaman #%s %s:no%s\n\
976*906afcb8SAndy Fiddaman "
977*906afcb8SAndy Fiddaman , dirname(ENDIF)
978*906afcb8SAndy Fiddaman , dirname(DEFINE)
979*906afcb8SAndy Fiddaman , dirname(PRAGMA)
980*906afcb8SAndy Fiddaman , pp.pass
981*906afcb8SAndy Fiddaman , keyname(X_PREDEFINED)
982*906afcb8SAndy Fiddaman );
983*906afcb8SAndy Fiddaman if (!pp.truncate)
984*906afcb8SAndy Fiddaman sfprintf(sp,
985*906afcb8SAndy Fiddaman "\
986*906afcb8SAndy Fiddaman #%s __STDPP__directive #(%s)\n\
987*906afcb8SAndy Fiddaman "
988*906afcb8SAndy Fiddaman , dirname(DEFINE)
989*906afcb8SAndy Fiddaman , keyname(V_DIRECTIVE)
990*906afcb8SAndy Fiddaman );
991*906afcb8SAndy Fiddaman for (kp = variables; s = kp->name; kp++)
992*906afcb8SAndy Fiddaman if (ppisid(*s) || *s++ == '+')
993*906afcb8SAndy Fiddaman {
994*906afcb8SAndy Fiddaman t = *s == '_' ? "" : "__";
995*906afcb8SAndy Fiddaman sfprintf(sp, "#%s %s%s%s #(%s)\n" , dirname(DEFINE), t, s, t, s);
996*906afcb8SAndy Fiddaman }
997*906afcb8SAndy Fiddaman sfprintf(sp,
998*906afcb8SAndy Fiddaman "\
999*906afcb8SAndy Fiddaman #%s %s:no%s\n\
1000*906afcb8SAndy Fiddaman #%s %s:no%s\n\
1001*906afcb8SAndy Fiddaman "
1002*906afcb8SAndy Fiddaman , dirname(PRAGMA)
1003*906afcb8SAndy Fiddaman , pp.pass
1004*906afcb8SAndy Fiddaman , keyname(X_READONLY)
1005*906afcb8SAndy Fiddaman , dirname(PRAGMA)
1006*906afcb8SAndy Fiddaman , pp.pass
1007*906afcb8SAndy Fiddaman , keyname(X_BUILTIN)
1008*906afcb8SAndy Fiddaman );
1009*906afcb8SAndy Fiddaman if (pp.ppdefault && *pp.ppdefault)
1010*906afcb8SAndy Fiddaman sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), pp.ppdefault);
1011*906afcb8SAndy Fiddaman sfprintf(sp,
1012*906afcb8SAndy Fiddaman "\
1013*906afcb8SAndy Fiddaman #%s !defined(__STDC__) && (!#option(compatibility) || #option(transition))\n\
1014*906afcb8SAndy Fiddaman #%s __STDC__ #(STDC)\n\
1015*906afcb8SAndy Fiddaman #%s\n\
1016*906afcb8SAndy Fiddaman "
1017*906afcb8SAndy Fiddaman , dirname(IF)
1018*906afcb8SAndy Fiddaman , dirname(DEFINE)
1019*906afcb8SAndy Fiddaman , dirname(ENDIF)
1020*906afcb8SAndy Fiddaman );
1021*906afcb8SAndy Fiddaman t = sfstruse(sp);
1022*906afcb8SAndy Fiddaman debug((-9, "\n/* begin initialization */\n%s/* end initialization */", t));
1023*906afcb8SAndy Fiddaman ppcomment = pp.comment;
1024*906afcb8SAndy Fiddaman pp.comment = 0;
1025*906afcb8SAndy Fiddaman pplinesync = pp.linesync;
1026*906afcb8SAndy Fiddaman pp.linesync = 0;
1027*906afcb8SAndy Fiddaman PUSH_INIT(pp.pass, t);
1028*906afcb8SAndy Fiddaman pp.mode |= INIT;
1029*906afcb8SAndy Fiddaman while (pplex());
1030*906afcb8SAndy Fiddaman pp.mode &= ~INIT;
1031*906afcb8SAndy Fiddaman pp.comment = ppcomment;
1032*906afcb8SAndy Fiddaman pp.linesync = pplinesync;
1033*906afcb8SAndy Fiddaman pp.prefix = 0;
1034*906afcb8SAndy Fiddaman sfstrclose(sp);
1035*906afcb8SAndy Fiddaman if (error_info.trace)
1036*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
1037*906afcb8SAndy Fiddaman message((-1, "include directory %s%s%s%s", dp->name, (dp->type & TYPE_VENDOR) ? " [VENDOR]" : "", (dp->type & TYPE_HOSTED) ? " [HOSTED]" : "", dp->c ? " [C]" : ""));
1038*906afcb8SAndy Fiddaman #if DEBUG
1039*906afcb8SAndy Fiddaman }
1040*906afcb8SAndy Fiddaman if (pp.test & TEST_nonoise)
1041*906afcb8SAndy Fiddaman error_info.trace = c;
1042*906afcb8SAndy Fiddaman #endif
1043*906afcb8SAndy Fiddaman {
1044*906afcb8SAndy Fiddaman /*
1045*906afcb8SAndy Fiddaman * this is sleazy but at least it's
1046*906afcb8SAndy Fiddaman * hidden in the library
1047*906afcb8SAndy Fiddaman */
1048*906afcb8SAndy Fiddaman #include <preroot.h>
1049*906afcb8SAndy Fiddaman #if FS_PREROOT
1050*906afcb8SAndy Fiddaman struct pplist* preroot;
1051*906afcb8SAndy Fiddaman
1052*906afcb8SAndy Fiddaman if ((preroot = (struct pplist*)hashget(pp.prdtab, "preroot")))
1053*906afcb8SAndy Fiddaman setpreroot(NiL, preroot->value);
1054*906afcb8SAndy Fiddaman #endif
1055*906afcb8SAndy Fiddaman }
1056*906afcb8SAndy Fiddaman if (pp.ignoresrc)
1057*906afcb8SAndy Fiddaman {
1058*906afcb8SAndy Fiddaman if (pp.ignoresrc > 1 && pp.stddirs != pp.firstdir)
1059*906afcb8SAndy Fiddaman error(1, "directories up to and including %s are for \"...\" include files only", pp.stddirs->name);
1060*906afcb8SAndy Fiddaman pp.lcldirs = pp.lcldirs->next;
1061*906afcb8SAndy Fiddaman }
1062*906afcb8SAndy Fiddaman if (pp.ignore)
1063*906afcb8SAndy Fiddaman {
1064*906afcb8SAndy Fiddaman if (*pp.ignore)
1065*906afcb8SAndy Fiddaman ppmapinclude(pp.ignore, NiL);
1066*906afcb8SAndy Fiddaman else
1067*906afcb8SAndy Fiddaman pp.ignore = 0;
1068*906afcb8SAndy Fiddaman }
1069*906afcb8SAndy Fiddaman if (pp.standalone)
1070*906afcb8SAndy Fiddaman pp.state |= STANDALONE;
1071*906afcb8SAndy Fiddaman #if COMPATIBLE
1072*906afcb8SAndy Fiddaman ppfsm(FSM_COMPATIBILITY, NiL);
1073*906afcb8SAndy Fiddaman #endif
1074*906afcb8SAndy Fiddaman ppfsm(FSM_PLUSPLUS, NiL);
1075*906afcb8SAndy Fiddaman pp.initialized = 1;
1076*906afcb8SAndy Fiddaman if (pp.reset.on)
1077*906afcb8SAndy Fiddaman {
1078*906afcb8SAndy Fiddaman pp.reset.symtab = pp.symtab;
1079*906afcb8SAndy Fiddaman pp.symtab = 0;
1080*906afcb8SAndy Fiddaman pp.reset.ro_state = pp.ro_state;
1081*906afcb8SAndy Fiddaman pp.reset.ro_mode = pp.ro_mode;
1082*906afcb8SAndy Fiddaman pp.reset.ro_option = pp.ro_option;
1083*906afcb8SAndy Fiddaman }
1084*906afcb8SAndy Fiddaman }
1085*906afcb8SAndy Fiddaman if (pp.reset.on)
1086*906afcb8SAndy Fiddaman {
1087*906afcb8SAndy Fiddaman if (pp.symtab)
1088*906afcb8SAndy Fiddaman {
1089*906afcb8SAndy Fiddaman hashwalk(pp.filtab, 0, unguard, NiL);
1090*906afcb8SAndy Fiddaman hashfree(pp.symtab);
1091*906afcb8SAndy Fiddaman }
1092*906afcb8SAndy Fiddaman pp.symtab = hashalloc(NiL, HASH_name, "symbols", HASH_free, undefine, HASH_set, HASH_ALLOCATE|HASH_BUCKET, 0);
1093*906afcb8SAndy Fiddaman hashview(pp.symtab, pp.reset.symtab);
1094*906afcb8SAndy Fiddaman pp.ro_state = pp.reset.ro_state;
1095*906afcb8SAndy Fiddaman pp.ro_mode = pp.reset.ro_mode;
1096*906afcb8SAndy Fiddaman pp.ro_option = pp.reset.ro_option;
1097*906afcb8SAndy Fiddaman }
1098*906afcb8SAndy Fiddaman #if CHECKPOINT
1099*906afcb8SAndy Fiddaman if (pp.mode & DUMP)
1100*906afcb8SAndy Fiddaman {
1101*906afcb8SAndy Fiddaman if (!pp.pragma)
1102*906afcb8SAndy Fiddaman error(3, "#%s must be enabled for checkpoints", dirname(PRAGMA));
1103*906afcb8SAndy Fiddaman (*pp.pragma)(dirname(PRAGMA), pp.pass, keyname(X_CHECKPOINT), pp.checkpoint, 1);
1104*906afcb8SAndy Fiddaman }
1105*906afcb8SAndy Fiddaman #endif
1106*906afcb8SAndy Fiddaman if (n = pp.filedeps.flags)
1107*906afcb8SAndy Fiddaman {
1108*906afcb8SAndy Fiddaman if (!(n & PP_deps_file))
1109*906afcb8SAndy Fiddaman {
1110*906afcb8SAndy Fiddaman pp.state |= NOTEXT;
1111*906afcb8SAndy Fiddaman pp.option |= KEEPNOTEXT;
1112*906afcb8SAndy Fiddaman pp.linesync = 0;
1113*906afcb8SAndy Fiddaman }
1114*906afcb8SAndy Fiddaman if (n & PP_deps_generated)
1115*906afcb8SAndy Fiddaman pp.mode |= GENDEPS;
1116*906afcb8SAndy Fiddaman if (n & PP_deps_local)
1117*906afcb8SAndy Fiddaman pp.mode &= ~HEADERDEPS;
1118*906afcb8SAndy Fiddaman else if (!(pp.mode & FILEDEPS))
1119*906afcb8SAndy Fiddaman pp.mode |= HEADERDEPS;
1120*906afcb8SAndy Fiddaman pp.mode |= FILEDEPS;
1121*906afcb8SAndy Fiddaman }
1122*906afcb8SAndy Fiddaman
1123*906afcb8SAndy Fiddaman /*
1124*906afcb8SAndy Fiddaman * push the main input file -- special case for hosted mark
1125*906afcb8SAndy Fiddaman */
1126*906afcb8SAndy Fiddaman
1127*906afcb8SAndy Fiddaman if (pp.firstdir->type & TYPE_HOSTED)
1128*906afcb8SAndy Fiddaman pp.mode |= MARKHOSTED;
1129*906afcb8SAndy Fiddaman else
1130*906afcb8SAndy Fiddaman pp.mode &= ~MARKHOSTED;
1131*906afcb8SAndy Fiddaman #if CHECKPOINT
1132*906afcb8SAndy Fiddaman if (!(pp.mode & DUMP))
1133*906afcb8SAndy Fiddaman #endif
1134*906afcb8SAndy Fiddaman {
1135*906afcb8SAndy Fiddaman if (!(p = error_info.file))
1136*906afcb8SAndy Fiddaman p = "";
1137*906afcb8SAndy Fiddaman else
1138*906afcb8SAndy Fiddaman {
1139*906afcb8SAndy Fiddaman error_info.file = 0;
1140*906afcb8SAndy Fiddaman if (*p)
1141*906afcb8SAndy Fiddaman {
1142*906afcb8SAndy Fiddaman pathcanon(p, 0, 0);
1143*906afcb8SAndy Fiddaman p = ppsetfile(p)->name;
1144*906afcb8SAndy Fiddaman }
1145*906afcb8SAndy Fiddaman }
1146*906afcb8SAndy Fiddaman PUSH_FILE(p, 0);
1147*906afcb8SAndy Fiddaman }
1148*906afcb8SAndy Fiddaman if (pp.mode & FILEDEPS)
1149*906afcb8SAndy Fiddaman {
1150*906afcb8SAndy Fiddaman if (s = strrchr(error_info.file, '/'))
1151*906afcb8SAndy Fiddaman s++;
1152*906afcb8SAndy Fiddaman else
1153*906afcb8SAndy Fiddaman s = error_info.file;
1154*906afcb8SAndy Fiddaman if (!*s)
1155*906afcb8SAndy Fiddaman s = "-";
1156*906afcb8SAndy Fiddaman s = strcpy(pp.tmpbuf, s);
1157*906afcb8SAndy Fiddaman if ((t = p = strrchr(s, '.')) && (*++p == 'c' || *p == 'C'))
1158*906afcb8SAndy Fiddaman {
1159*906afcb8SAndy Fiddaman if (c = *++p)
1160*906afcb8SAndy Fiddaman while (*++p == c);
1161*906afcb8SAndy Fiddaman if (*p)
1162*906afcb8SAndy Fiddaman t = 0;
1163*906afcb8SAndy Fiddaman else
1164*906afcb8SAndy Fiddaman t++;
1165*906afcb8SAndy Fiddaman }
1166*906afcb8SAndy Fiddaman if (!t)
1167*906afcb8SAndy Fiddaman {
1168*906afcb8SAndy Fiddaman t = s + strlen(s);
1169*906afcb8SAndy Fiddaman *t++ = '.';
1170*906afcb8SAndy Fiddaman }
1171*906afcb8SAndy Fiddaman *(t + 1) = 0;
1172*906afcb8SAndy Fiddaman if (pp.state & NOTEXT)
1173*906afcb8SAndy Fiddaman pp.filedeps.sp = sfstdout;
1174*906afcb8SAndy Fiddaman else
1175*906afcb8SAndy Fiddaman {
1176*906afcb8SAndy Fiddaman *t = 'd';
1177*906afcb8SAndy Fiddaman if (!(pp.filedeps.sp = sfopen(NiL, s, "w")))
1178*906afcb8SAndy Fiddaman error(ERROR_SYSTEM|3, "%s: cannot create", s);
1179*906afcb8SAndy Fiddaman }
1180*906afcb8SAndy Fiddaman *t = 'o';
1181*906afcb8SAndy Fiddaman pp.column = sfprintf(pp.filedeps.sp, "%s :", s);
1182*906afcb8SAndy Fiddaman if (*error_info.file)
1183*906afcb8SAndy Fiddaman pp.column += sfprintf(pp.filedeps.sp, " %s", error_info.file);
1184*906afcb8SAndy Fiddaman }
1185*906afcb8SAndy Fiddaman if (xp = pp.firsttx)
1186*906afcb8SAndy Fiddaman {
1187*906afcb8SAndy Fiddaman if (!(sp = sfstropen()))
1188*906afcb8SAndy Fiddaman error(3, "temporary buffer allocation error");
1189*906afcb8SAndy Fiddaman while (xp)
1190*906afcb8SAndy Fiddaman {
1191*906afcb8SAndy Fiddaman sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), xp->value);
1192*906afcb8SAndy Fiddaman xp = xp->next;
1193*906afcb8SAndy Fiddaman }
1194*906afcb8SAndy Fiddaman t = sfstruse(sp);
1195*906afcb8SAndy Fiddaman PUSH_BUFFER("options", t, 1);
1196*906afcb8SAndy Fiddaman sfstrclose(sp);
1197*906afcb8SAndy Fiddaman }
1198*906afcb8SAndy Fiddaman break;
1199*906afcb8SAndy Fiddaman case PP_INPUT:
1200*906afcb8SAndy Fiddaman #if CHECKPOINT && POOL
1201*906afcb8SAndy Fiddaman if (!(pp.mode & DUMP) || pp.pool.input)
1202*906afcb8SAndy Fiddaman #else
1203*906afcb8SAndy Fiddaman #if CHECKPOINT
1204*906afcb8SAndy Fiddaman if (!(pp.mode & DUMP))
1205*906afcb8SAndy Fiddaman #else
1206*906afcb8SAndy Fiddaman #if POOL
1207*906afcb8SAndy Fiddaman if (pp.pool.input)
1208*906afcb8SAndy Fiddaman #endif
1209*906afcb8SAndy Fiddaman #endif
1210*906afcb8SAndy Fiddaman #endif
1211*906afcb8SAndy Fiddaman {
1212*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
1213*906afcb8SAndy Fiddaman if (!error_info.file)
1214*906afcb8SAndy Fiddaman error_info.file = p;
1215*906afcb8SAndy Fiddaman close(0);
1216*906afcb8SAndy Fiddaman if (open(p, O_RDONLY) != 0)
1217*906afcb8SAndy Fiddaman error(ERROR_SYSTEM|3, "%s: cannot read", p);
1218*906afcb8SAndy Fiddaman if (strmatch(p, "*.(s|S|as|AS|asm|ASM)"))
1219*906afcb8SAndy Fiddaman {
1220*906afcb8SAndy Fiddaman ppset(&pp.mode, CATLITERAL, 0);
1221*906afcb8SAndy Fiddaman ppop(PP_SPACEOUT, 1);
1222*906afcb8SAndy Fiddaman }
1223*906afcb8SAndy Fiddaman break;
1224*906afcb8SAndy Fiddaman }
1225*906afcb8SAndy Fiddaman /*FALLTHROUGH*/
1226*906afcb8SAndy Fiddaman case PP_TEXT:
1227*906afcb8SAndy Fiddaman if (pp.initialized)
1228*906afcb8SAndy Fiddaman goto before;
1229*906afcb8SAndy Fiddaman if ((p = va_arg(ap, char*)) && *p)
1230*906afcb8SAndy Fiddaman {
1231*906afcb8SAndy Fiddaman if (pp.lasttx)
1232*906afcb8SAndy Fiddaman pp.lasttx = pp.lasttx->next = newof(0, struct oplist, 1, 0);
1233*906afcb8SAndy Fiddaman else
1234*906afcb8SAndy Fiddaman pp.firsttx = pp.lasttx = newof(0, struct oplist, 1, 0);
1235*906afcb8SAndy Fiddaman pp.lasttx->op = op;
1236*906afcb8SAndy Fiddaman pp.lasttx->value = p;
1237*906afcb8SAndy Fiddaman }
1238*906afcb8SAndy Fiddaman break;
1239*906afcb8SAndy Fiddaman case PP_KEYARGS:
1240*906afcb8SAndy Fiddaman if (pp.initialized)
1241*906afcb8SAndy Fiddaman goto before;
1242*906afcb8SAndy Fiddaman ppset(&pp.option, KEYARGS, va_arg(ap, int));
1243*906afcb8SAndy Fiddaman if (pp.option & KEYARGS)
1244*906afcb8SAndy Fiddaman #if MACKEYARGS
1245*906afcb8SAndy Fiddaman ppset(&pp.mode, CATLITERAL, 1);
1246*906afcb8SAndy Fiddaman #else
1247*906afcb8SAndy Fiddaman error(3, "preprocessor not compiled with macro keyword arguments enabled [MACKEYARGS]");
1248*906afcb8SAndy Fiddaman #endif
1249*906afcb8SAndy Fiddaman break;
1250*906afcb8SAndy Fiddaman case PP_LINE:
1251*906afcb8SAndy Fiddaman if (ppok(op))
1252*906afcb8SAndy Fiddaman pp.linesync = va_arg(ap, PPLINESYNC);
1253*906afcb8SAndy Fiddaman break;
1254*906afcb8SAndy Fiddaman case PP_LINEBASE:
1255*906afcb8SAndy Fiddaman if (ppok(op))
1256*906afcb8SAndy Fiddaman {
1257*906afcb8SAndy Fiddaman if (va_arg(ap, int))
1258*906afcb8SAndy Fiddaman pp.flags |= PP_linebase;
1259*906afcb8SAndy Fiddaman else
1260*906afcb8SAndy Fiddaman pp.flags &= ~PP_linebase;
1261*906afcb8SAndy Fiddaman }
1262*906afcb8SAndy Fiddaman break;
1263*906afcb8SAndy Fiddaman case PP_LINEFILE:
1264*906afcb8SAndy Fiddaman if (ppok(op))
1265*906afcb8SAndy Fiddaman {
1266*906afcb8SAndy Fiddaman if (va_arg(ap, int))
1267*906afcb8SAndy Fiddaman pp.flags |= PP_linefile;
1268*906afcb8SAndy Fiddaman else
1269*906afcb8SAndy Fiddaman pp.flags &= ~PP_linefile;
1270*906afcb8SAndy Fiddaman }
1271*906afcb8SAndy Fiddaman break;
1272*906afcb8SAndy Fiddaman case PP_LINEID:
1273*906afcb8SAndy Fiddaman if (ppok(op))
1274*906afcb8SAndy Fiddaman {
1275*906afcb8SAndy Fiddaman if (!(p = va_arg(ap, char*)))
1276*906afcb8SAndy Fiddaman pp.lineid = "";
1277*906afcb8SAndy Fiddaman else if (*p != '-')
1278*906afcb8SAndy Fiddaman pp.lineid = strdup(p);
1279*906afcb8SAndy Fiddaman else
1280*906afcb8SAndy Fiddaman pp.option |= IGNORELINE;
1281*906afcb8SAndy Fiddaman }
1282*906afcb8SAndy Fiddaman break;
1283*906afcb8SAndy Fiddaman case PP_LINETYPE:
1284*906afcb8SAndy Fiddaman if (ppok(op))
1285*906afcb8SAndy Fiddaman {
1286*906afcb8SAndy Fiddaman if ((n = va_arg(ap, int)) >= 1)
1287*906afcb8SAndy Fiddaman pp.flags |= PP_linetype;
1288*906afcb8SAndy Fiddaman else
1289*906afcb8SAndy Fiddaman pp.flags &= ~PP_linetype;
1290*906afcb8SAndy Fiddaman if (n >= 2)
1291*906afcb8SAndy Fiddaman pp.flags |= PP_linehosted;
1292*906afcb8SAndy Fiddaman else
1293*906afcb8SAndy Fiddaman pp.flags &= ~PP_linehosted;
1294*906afcb8SAndy Fiddaman }
1295*906afcb8SAndy Fiddaman break;
1296*906afcb8SAndy Fiddaman case PP_LOCAL:
1297*906afcb8SAndy Fiddaman if (pp.initialized)
1298*906afcb8SAndy Fiddaman goto before;
1299*906afcb8SAndy Fiddaman pp.ignoresrc++;
1300*906afcb8SAndy Fiddaman pp.stddirs = pp.lastdir;
1301*906afcb8SAndy Fiddaman if (!(pp.ro_option & PREFIX))
1302*906afcb8SAndy Fiddaman pp.option &= ~PREFIX;
1303*906afcb8SAndy Fiddaman break;
1304*906afcb8SAndy Fiddaman case PP_MACREF:
1305*906afcb8SAndy Fiddaman pp.macref = va_arg(ap, PPMACREF);
1306*906afcb8SAndy Fiddaman break;
1307*906afcb8SAndy Fiddaman case PP_MULTIPLE:
1308*906afcb8SAndy Fiddaman ppset(&pp.mode, ALLMULTIPLE, va_arg(ap, int));
1309*906afcb8SAndy Fiddaman break;
1310*906afcb8SAndy Fiddaman case PP_NOHASH:
1311*906afcb8SAndy Fiddaman ppset(&pp.option, NOHASH, va_arg(ap, int));
1312*906afcb8SAndy Fiddaman break;
1313*906afcb8SAndy Fiddaman case PP_NOISE:
1314*906afcb8SAndy Fiddaman op = va_arg(ap, int);
1315*906afcb8SAndy Fiddaman ppset(&pp.option, NOISE, op);
1316*906afcb8SAndy Fiddaman ppset(&pp.option, NOISEFILTER, op < 0);
1317*906afcb8SAndy Fiddaman break;
1318*906afcb8SAndy Fiddaman case PP_OPTARG:
1319*906afcb8SAndy Fiddaman pp.optarg = va_arg(ap, PPOPTARG);
1320*906afcb8SAndy Fiddaman break;
1321*906afcb8SAndy Fiddaman case PP_OUTPUT:
1322*906afcb8SAndy Fiddaman pp.outfile = va_arg(ap, char*);
1323*906afcb8SAndy Fiddaman if (identical(pp.outfile, 0))
1324*906afcb8SAndy Fiddaman error(3, "%s: identical to input", pp.outfile);
1325*906afcb8SAndy Fiddaman close(1);
1326*906afcb8SAndy Fiddaman if (open(pp.outfile, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) != 1)
1327*906afcb8SAndy Fiddaman error(ERROR_SYSTEM|3, "%s: cannot create", pp.outfile);
1328*906afcb8SAndy Fiddaman break;
1329*906afcb8SAndy Fiddaman case PP_PASSTHROUGH:
1330*906afcb8SAndy Fiddaman if (!(pp.state & COMPILE))
1331*906afcb8SAndy Fiddaman ppset(&pp.state, PASSTHROUGH, va_arg(ap, int));
1332*906afcb8SAndy Fiddaman break;
1333*906afcb8SAndy Fiddaman case PP_PEDANTIC:
1334*906afcb8SAndy Fiddaman ppset(&pp.mode, PEDANTIC, va_arg(ap, int));
1335*906afcb8SAndy Fiddaman break;
1336*906afcb8SAndy Fiddaman case PP_PLUSCOMMENT:
1337*906afcb8SAndy Fiddaman if (ppset(&pp.option, PLUSCOMMENT, va_arg(ap, int)) && pp.initialized)
1338*906afcb8SAndy Fiddaman ppfsm(FSM_PLUSPLUS, NiL);
1339*906afcb8SAndy Fiddaman break;
1340*906afcb8SAndy Fiddaman case PP_PLUSPLUS:
1341*906afcb8SAndy Fiddaman if (ppset(&pp.option, PLUSPLUS, va_arg(ap, int)) && ppset(&pp.option, PLUSCOMMENT, va_arg(ap, int)) && pp.initialized)
1342*906afcb8SAndy Fiddaman ppfsm(FSM_PLUSPLUS, NiL);
1343*906afcb8SAndy Fiddaman break;
1344*906afcb8SAndy Fiddaman case PP_POOL:
1345*906afcb8SAndy Fiddaman if (pp.initialized)
1346*906afcb8SAndy Fiddaman goto before;
1347*906afcb8SAndy Fiddaman if (va_arg(ap, int))
1348*906afcb8SAndy Fiddaman {
1349*906afcb8SAndy Fiddaman #if POOL
1350*906afcb8SAndy Fiddaman pp.pool.input = dup(0);
1351*906afcb8SAndy Fiddaman pp.pool.output = dup(1);
1352*906afcb8SAndy Fiddaman p = "/dev/null";
1353*906afcb8SAndy Fiddaman if (!identical(p, 0))
1354*906afcb8SAndy Fiddaman {
1355*906afcb8SAndy Fiddaman if (!identical(p, 1))
1356*906afcb8SAndy Fiddaman ppop(PP_OUTPUT, p);
1357*906afcb8SAndy Fiddaman ppop(PP_INPUT, p);
1358*906afcb8SAndy Fiddaman }
1359*906afcb8SAndy Fiddaman #else
1360*906afcb8SAndy Fiddaman error(3, "preprocessor not compiled with input pool enabled [POOL]");
1361*906afcb8SAndy Fiddaman #endif
1362*906afcb8SAndy Fiddaman }
1363*906afcb8SAndy Fiddaman break;
1364*906afcb8SAndy Fiddaman case PP_PRAGMA:
1365*906afcb8SAndy Fiddaman pp.pragma = va_arg(ap, PPPRAGMA);
1366*906afcb8SAndy Fiddaman break;
1367*906afcb8SAndy Fiddaman case PP_PRAGMAFLAGS:
1368*906afcb8SAndy Fiddaman if (p = va_arg(ap, char*))
1369*906afcb8SAndy Fiddaman {
1370*906afcb8SAndy Fiddaman n = OPT_GLOBAL;
1371*906afcb8SAndy Fiddaman if (*p == '-')
1372*906afcb8SAndy Fiddaman p++;
1373*906afcb8SAndy Fiddaman else
1374*906afcb8SAndy Fiddaman n |= OPT_PASS;
1375*906afcb8SAndy Fiddaman if ((c = (int)hashref(pp.strtab, p)) > 0 && c <= X_last_option)
1376*906afcb8SAndy Fiddaman pp.optflags[c] = n;
1377*906afcb8SAndy Fiddaman }
1378*906afcb8SAndy Fiddaman break;
1379*906afcb8SAndy Fiddaman case PP_PROBE:
1380*906afcb8SAndy Fiddaman pp.probe = va_arg(ap, char*);
1381*906afcb8SAndy Fiddaman break;
1382*906afcb8SAndy Fiddaman case PP_QUOTE:
1383*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
1384*906afcb8SAndy Fiddaman c = va_arg(ap, int);
1385*906afcb8SAndy Fiddaman if (p)
1386*906afcb8SAndy Fiddaman ppfsm(c ? FSM_QUOTADD : FSM_QUOTDEL, p);
1387*906afcb8SAndy Fiddaman break;
1388*906afcb8SAndy Fiddaman case PP_REGUARD:
1389*906afcb8SAndy Fiddaman ppset(&pp.option, REGUARD, va_arg(ap, int));
1390*906afcb8SAndy Fiddaman break;
1391*906afcb8SAndy Fiddaman case PP_RESERVED:
1392*906afcb8SAndy Fiddaman if ((pp.state & COMPILE) && (p = va_arg(ap, char*)))
1393*906afcb8SAndy Fiddaman {
1394*906afcb8SAndy Fiddaman if (!(sp = sfstropen()))
1395*906afcb8SAndy Fiddaman error(3, "temporary buffer allocation error");
1396*906afcb8SAndy Fiddaman sfputr(sp, p, -1);
1397*906afcb8SAndy Fiddaman p = sfstruse(sp);
1398*906afcb8SAndy Fiddaman if (s = strchr(p, '='))
1399*906afcb8SAndy Fiddaman *s++ = 0;
1400*906afcb8SAndy Fiddaman else
1401*906afcb8SAndy Fiddaman s = p;
1402*906afcb8SAndy Fiddaman while (*s == '_')
1403*906afcb8SAndy Fiddaman s++;
1404*906afcb8SAndy Fiddaman for (t = s + strlen(s); t > s && *(t - 1) == '_'; t--);
1405*906afcb8SAndy Fiddaman if (*t == '_')
1406*906afcb8SAndy Fiddaman *t = 0;
1407*906afcb8SAndy Fiddaman else
1408*906afcb8SAndy Fiddaman t = 0;
1409*906afcb8SAndy Fiddaman op = ((key = ppkeyref(pp.symtab, s)) && (key->sym.flags & SYM_LEX)) ? key->lex : T_NOISE;
1410*906afcb8SAndy Fiddaman if (pp.test & 0x0400)
1411*906afcb8SAndy Fiddaman error(1, "reserved#1 `%s' %d", s, op);
1412*906afcb8SAndy Fiddaman if (t)
1413*906afcb8SAndy Fiddaman *t = '_';
1414*906afcb8SAndy Fiddaman if (!(key = ppkeyget(pp.symtab, p)))
1415*906afcb8SAndy Fiddaman key = ppkeyset(pp.symtab, NiL);
1416*906afcb8SAndy Fiddaman else if (!(key->sym.flags & SYM_LEX))
1417*906afcb8SAndy Fiddaman {
1418*906afcb8SAndy Fiddaman struct ppsymbol tmp;
1419*906afcb8SAndy Fiddaman
1420*906afcb8SAndy Fiddaman tmp = key->sym;
1421*906afcb8SAndy Fiddaman hashlook(pp.symtab, p, HASH_DELETE, NiL);
1422*906afcb8SAndy Fiddaman key = ppkeyset(pp.symtab, NiL);
1423*906afcb8SAndy Fiddaman key->sym.flags = tmp.flags;
1424*906afcb8SAndy Fiddaman key->sym.macro = tmp.macro;
1425*906afcb8SAndy Fiddaman key->sym.value = tmp.value;
1426*906afcb8SAndy Fiddaman key->sym.hidden = tmp.hidden;
1427*906afcb8SAndy Fiddaman }
1428*906afcb8SAndy Fiddaman if (!(key->sym.flags & SYM_KEYWORD))
1429*906afcb8SAndy Fiddaman {
1430*906afcb8SAndy Fiddaman key->sym.flags |= SYM_KEYWORD|SYM_LEX;
1431*906afcb8SAndy Fiddaman key->lex = op;
1432*906afcb8SAndy Fiddaman if (pp.test & 0x0400)
1433*906afcb8SAndy Fiddaman error(1, "reserved#2 `%s' %d", p, op);
1434*906afcb8SAndy Fiddaman }
1435*906afcb8SAndy Fiddaman sfstrclose(sp);
1436*906afcb8SAndy Fiddaman }
1437*906afcb8SAndy Fiddaman break;
1438*906afcb8SAndy Fiddaman case PP_SPACEOUT:
1439*906afcb8SAndy Fiddaman ppset(&pp.state, SPACEOUT, va_arg(ap, int));
1440*906afcb8SAndy Fiddaman break;
1441*906afcb8SAndy Fiddaman case PP_STANDALONE:
1442*906afcb8SAndy Fiddaman if (pp.initialized)
1443*906afcb8SAndy Fiddaman goto before;
1444*906afcb8SAndy Fiddaman pp.standalone = 1;
1445*906afcb8SAndy Fiddaman break;
1446*906afcb8SAndy Fiddaman case PP_STANDARD:
1447*906afcb8SAndy Fiddaman if ((pp.lastdir->next->name = ((p = va_arg(ap, char*)) && *p) ? p : NiL) && !stat(p, &st))
1448*906afcb8SAndy Fiddaman SAVEID(&pp.lastdir->next->id, &st);
1449*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
1450*906afcb8SAndy Fiddaman if (dp->name)
1451*906afcb8SAndy Fiddaman for (hp = pp.firstdir; hp != dp; hp = hp->next)
1452*906afcb8SAndy Fiddaman if (hp->name && SAMEID(&hp->id, &dp->id))
1453*906afcb8SAndy Fiddaman {
1454*906afcb8SAndy Fiddaman hp->c = dp->c;
1455*906afcb8SAndy Fiddaman if (dp->type & TYPE_HOSTED)
1456*906afcb8SAndy Fiddaman hp->type |= TYPE_HOSTED;
1457*906afcb8SAndy Fiddaman else
1458*906afcb8SAndy Fiddaman hp->type &= ~TYPE_HOSTED;
1459*906afcb8SAndy Fiddaman }
1460*906afcb8SAndy Fiddaman break;
1461*906afcb8SAndy Fiddaman case PP_STRICT:
1462*906afcb8SAndy Fiddaman if (ppset(&pp.state, STRICT, va_arg(ap, int)))
1463*906afcb8SAndy Fiddaman {
1464*906afcb8SAndy Fiddaman if (ppset(&pp.state, TRANSITION, 0))
1465*906afcb8SAndy Fiddaman pp.flags &= ~PP_transition;
1466*906afcb8SAndy Fiddaman if (pp.state & STRICT)
1467*906afcb8SAndy Fiddaman pp.flags |= PP_strict;
1468*906afcb8SAndy Fiddaman else
1469*906afcb8SAndy Fiddaman pp.flags &= ~PP_strict;
1470*906afcb8SAndy Fiddaman }
1471*906afcb8SAndy Fiddaman break;
1472*906afcb8SAndy Fiddaman case PP_TEST:
1473*906afcb8SAndy Fiddaman if (p = va_arg(ap, char*))
1474*906afcb8SAndy Fiddaman for (;;)
1475*906afcb8SAndy Fiddaman {
1476*906afcb8SAndy Fiddaman while (*p == ' ' || *p == '\t') p++;
1477*906afcb8SAndy Fiddaman for (s = p; n = *s; s++)
1478*906afcb8SAndy Fiddaman if (n == ',' || n == ' ' || n == '\t')
1479*906afcb8SAndy Fiddaman {
1480*906afcb8SAndy Fiddaman *s++ = 0;
1481*906afcb8SAndy Fiddaman break;
1482*906afcb8SAndy Fiddaman }
1483*906afcb8SAndy Fiddaman if (!*p)
1484*906afcb8SAndy Fiddaman break;
1485*906afcb8SAndy Fiddaman n = 0;
1486*906afcb8SAndy Fiddaman if (*p == 'n' && *(p + 1) == 'o')
1487*906afcb8SAndy Fiddaman {
1488*906afcb8SAndy Fiddaman p += 2;
1489*906afcb8SAndy Fiddaman op = 0;
1490*906afcb8SAndy Fiddaman }
1491*906afcb8SAndy Fiddaman else
1492*906afcb8SAndy Fiddaman op = 1;
1493*906afcb8SAndy Fiddaman if (streq(p, "count"))
1494*906afcb8SAndy Fiddaman n = TEST_count;
1495*906afcb8SAndy Fiddaman else if (streq(p, "hashcount"))
1496*906afcb8SAndy Fiddaman n = TEST_hashcount;
1497*906afcb8SAndy Fiddaman else if (streq(p, "hashdump"))
1498*906afcb8SAndy Fiddaman n = TEST_hashdump;
1499*906afcb8SAndy Fiddaman else if (streq(p, "hit"))
1500*906afcb8SAndy Fiddaman n = TEST_hit;
1501*906afcb8SAndy Fiddaman else if (streq(p, "init"))
1502*906afcb8SAndy Fiddaman n = TEST_noinit|TEST_INVERT;
1503*906afcb8SAndy Fiddaman else if (streq(p, "noise"))
1504*906afcb8SAndy Fiddaman n = TEST_nonoise|TEST_INVERT;
1505*906afcb8SAndy Fiddaman else if (streq(p, "proto"))
1506*906afcb8SAndy Fiddaman n = TEST_noproto|TEST_INVERT;
1507*906afcb8SAndy Fiddaman else if (*p >= '0' && *p <= '9')
1508*906afcb8SAndy Fiddaman n = strtoul(p, NiL, 0);
1509*906afcb8SAndy Fiddaman else
1510*906afcb8SAndy Fiddaman {
1511*906afcb8SAndy Fiddaman error(1, "%s: unknown test", p);
1512*906afcb8SAndy Fiddaman break;
1513*906afcb8SAndy Fiddaman }
1514*906afcb8SAndy Fiddaman if (n & TEST_INVERT)
1515*906afcb8SAndy Fiddaman {
1516*906afcb8SAndy Fiddaman n &= ~TEST_INVERT;
1517*906afcb8SAndy Fiddaman op = !op;
1518*906afcb8SAndy Fiddaman }
1519*906afcb8SAndy Fiddaman if (op)
1520*906afcb8SAndy Fiddaman pp.test |= n;
1521*906afcb8SAndy Fiddaman else
1522*906afcb8SAndy Fiddaman pp.test &= ~n;
1523*906afcb8SAndy Fiddaman p = s;
1524*906afcb8SAndy Fiddaman debug((-4, "test = 0%o", pp.test));
1525*906afcb8SAndy Fiddaman }
1526*906afcb8SAndy Fiddaman break;
1527*906afcb8SAndy Fiddaman case PP_TRANSITION:
1528*906afcb8SAndy Fiddaman if (ppset(&pp.state, TRANSITION, va_arg(ap, int)))
1529*906afcb8SAndy Fiddaman {
1530*906afcb8SAndy Fiddaman if (ppset(&pp.state, STRICT, 0))
1531*906afcb8SAndy Fiddaman pp.flags &= ~PP_strict;
1532*906afcb8SAndy Fiddaman if (pp.state & TRANSITION)
1533*906afcb8SAndy Fiddaman pp.flags |= PP_transition;
1534*906afcb8SAndy Fiddaman else
1535*906afcb8SAndy Fiddaman pp.flags &= ~PP_transition;
1536*906afcb8SAndy Fiddaman }
1537*906afcb8SAndy Fiddaman break;
1538*906afcb8SAndy Fiddaman case PP_TRUNCATE:
1539*906afcb8SAndy Fiddaman if (pp.initialized)
1540*906afcb8SAndy Fiddaman goto before;
1541*906afcb8SAndy Fiddaman if ((op = va_arg(ap, int)) < 0)
1542*906afcb8SAndy Fiddaman op = 0;
1543*906afcb8SAndy Fiddaman ppset(&pp.option, TRUNCATE, op);
1544*906afcb8SAndy Fiddaman if (pp.option & TRUNCATE)
1545*906afcb8SAndy Fiddaman {
1546*906afcb8SAndy Fiddaman Hash_bucket_t* b;
1547*906afcb8SAndy Fiddaman Hash_bucket_t* p;
1548*906afcb8SAndy Fiddaman Hash_position_t* pos;
1549*906afcb8SAndy Fiddaman Hash_table_t* tab;
1550*906afcb8SAndy Fiddaman
1551*906afcb8SAndy Fiddaman pp.truncate = op;
1552*906afcb8SAndy Fiddaman tab = pp.symtab;
1553*906afcb8SAndy Fiddaman pp.symtab = hashalloc(NiL, HASH_set, tab ? HASH_ALLOCATE : 0, HASH_compare, trunccomp, HASH_hash, trunchash, HASH_name, "truncate", 0);
1554*906afcb8SAndy Fiddaman if (tab && (pos = hashscan(tab, 0)))
1555*906afcb8SAndy Fiddaman {
1556*906afcb8SAndy Fiddaman if (p = hashnext(pos))
1557*906afcb8SAndy Fiddaman do
1558*906afcb8SAndy Fiddaman {
1559*906afcb8SAndy Fiddaman b = hashnext(pos);
1560*906afcb8SAndy Fiddaman hashlook(pp.symtab, (char*)p, HASH_BUCKET|HASH_INSTALL, NiL);
1561*906afcb8SAndy Fiddaman } while (p = b);
1562*906afcb8SAndy Fiddaman hashdone(pos);
1563*906afcb8SAndy Fiddaman }
1564*906afcb8SAndy Fiddaman }
1565*906afcb8SAndy Fiddaman else
1566*906afcb8SAndy Fiddaman pp.truncate = 0;
1567*906afcb8SAndy Fiddaman break;
1568*906afcb8SAndy Fiddaman case PP_VENDOR:
1569*906afcb8SAndy Fiddaman p = va_arg(ap, char*);
1570*906afcb8SAndy Fiddaman c = va_arg(ap, int) != 0;
1571*906afcb8SAndy Fiddaman if (!p || !*p)
1572*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
1573*906afcb8SAndy Fiddaman dp->type &= ~TYPE_VENDOR;
1574*906afcb8SAndy Fiddaman else if (streq(p, "-"))
1575*906afcb8SAndy Fiddaman {
1576*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
1577*906afcb8SAndy Fiddaman if (c)
1578*906afcb8SAndy Fiddaman dp->type |= TYPE_VENDOR;
1579*906afcb8SAndy Fiddaman else
1580*906afcb8SAndy Fiddaman dp->type &= ~TYPE_VENDOR;
1581*906afcb8SAndy Fiddaman }
1582*906afcb8SAndy Fiddaman else if (!stat((pathcanon(p, 0, 0), p), &st))
1583*906afcb8SAndy Fiddaman {
1584*906afcb8SAndy Fiddaman c = 0;
1585*906afcb8SAndy Fiddaman for (dp = pp.firstdir; dp; dp = dp->next)
1586*906afcb8SAndy Fiddaman {
1587*906afcb8SAndy Fiddaman if (!c && ((dp->type & TYPE_VENDOR) || dp->name && SAMEID(&dp->id, &st)))
1588*906afcb8SAndy Fiddaman c = 1;
1589*906afcb8SAndy Fiddaman if (c)
1590*906afcb8SAndy Fiddaman dp->type |= TYPE_VENDOR;
1591*906afcb8SAndy Fiddaman else
1592*906afcb8SAndy Fiddaman dp->type &= ~TYPE_VENDOR;
1593*906afcb8SAndy Fiddaman }
1594*906afcb8SAndy Fiddaman }
1595*906afcb8SAndy Fiddaman break;
1596*906afcb8SAndy Fiddaman case PP_WARN:
1597*906afcb8SAndy Fiddaman ppset(&pp.state, WARN, va_arg(ap, int));
1598*906afcb8SAndy Fiddaman break;
1599*906afcb8SAndy Fiddaman before:
1600*906afcb8SAndy Fiddaman error(3, "ppop(%d): preprocessor operation must be done before PP_INIT", op);
1601*906afcb8SAndy Fiddaman break;
1602*906afcb8SAndy Fiddaman default:
1603*906afcb8SAndy Fiddaman error(3, "ppop(%d): invalid preprocessor operation", op);
1604*906afcb8SAndy Fiddaman break;
1605*906afcb8SAndy Fiddaman }
1606*906afcb8SAndy Fiddaman va_end(ap);
1607*906afcb8SAndy Fiddaman }
1608