1*b30d1939SAndy Fiddaman /***********************************************************************
2*b30d1939SAndy Fiddaman *                                                                      *
3*b30d1939SAndy Fiddaman *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1986-2011 AT&T Intellectual Property          *
5*b30d1939SAndy Fiddaman *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
7*b30d1939SAndy Fiddaman *                    by AT&T Intellectual Property                     *
8*b30d1939SAndy Fiddaman *                                                                      *
9*b30d1939SAndy Fiddaman *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*b30d1939SAndy Fiddaman *                                                                      *
13*b30d1939SAndy Fiddaman *              Information and Software Systems Research               *
14*b30d1939SAndy Fiddaman *                            AT&T Research                             *
15*b30d1939SAndy Fiddaman *                           Florham Park NJ                            *
16*b30d1939SAndy Fiddaman *                                                                      *
17*b30d1939SAndy Fiddaman *                 Glenn Fowler <gsf@research.att.com>                  *
18*b30d1939SAndy Fiddaman *                                                                      *
19*b30d1939SAndy Fiddaman ***********************************************************************/
20*b30d1939SAndy Fiddaman #pragma prototyped
21*b30d1939SAndy Fiddaman /*
22*b30d1939SAndy Fiddaman  * Glenn Fowler
23*b30d1939SAndy Fiddaman  * AT&T Research
24*b30d1939SAndy Fiddaman  *
25*b30d1939SAndy Fiddaman  * preprocessor lexical analyzer
26*b30d1939SAndy Fiddaman  * standalone and tokenizing lexer combined in one source
27*b30d1939SAndy Fiddaman  * define CPP=1 for standalone
28*b30d1939SAndy Fiddaman  */
29*b30d1939SAndy Fiddaman 
30*b30d1939SAndy Fiddaman #include "pplib.h"
31*b30d1939SAndy Fiddaman #include "ppfsm.h"
32*b30d1939SAndy Fiddaman 
33*b30d1939SAndy Fiddaman #if CPP
34*b30d1939SAndy Fiddaman 
35*b30d1939SAndy Fiddaman /*
36*b30d1939SAndy Fiddaman  * standalone entry point
37*b30d1939SAndy Fiddaman  */
38*b30d1939SAndy Fiddaman 
39*b30d1939SAndy Fiddaman #define PPCPP_T		void
40*b30d1939SAndy Fiddaman 
41*b30d1939SAndy Fiddaman #define START		QUICK
42*b30d1939SAndy Fiddaman #define INMACRO(x)	INQMACRO(x)
43*b30d1939SAndy Fiddaman #define DOSTRIP()	(st&STRIP)
44*b30d1939SAndy Fiddaman 
45*b30d1939SAndy Fiddaman #if DEBUG & TRACE_debug
46*b30d1939SAndy Fiddaman static int		hit[LAST-TERMINAL+2];
47*b30d1939SAndy Fiddaman #endif
48*b30d1939SAndy Fiddaman 
49*b30d1939SAndy Fiddaman #define BACKIN()	(ip--)
50*b30d1939SAndy Fiddaman #define BACKOUT()	(op=tp)
51*b30d1939SAndy Fiddaman #define CACHE()		do{CACHEINX();CACHEOUTX();st=pp.state;if(!pp.hidden)spliced=0;}while(0)
52*b30d1939SAndy Fiddaman #define CACHEIN()	do{CACHEINX();st=pp.state;if(!pp.hidden)spliced=0;}while(0)
53*b30d1939SAndy Fiddaman #define CACHEINX()	do{ip=pp.in->nextchr;}while(0)
54*b30d1939SAndy Fiddaman #define CACHEOUT()	do{CACHEOUTX();st=pp.state;if(!pp.hidden)spliced=0;}while(0)
55*b30d1939SAndy Fiddaman #define CACHEOUTX()	do{tp=op=pp.outp;xp=pp.oute;if(sp)sp=op;}while(0)
56*b30d1939SAndy Fiddaman #define GETCHR()	(*(unsigned char*)ip++)
57*b30d1939SAndy Fiddaman #define LASTCHR()	(*(ip-1))
58*b30d1939SAndy Fiddaman #define LASTOUT()	((op>pp.outbuf)?*(op-1):pp.lastout)
59*b30d1939SAndy Fiddaman #define SKIPIN()	(ip++)
60*b30d1939SAndy Fiddaman #define PUTCHR(c)	(*op++=(c))
61*b30d1939SAndy Fiddaman #define SETCHR(c)	(*op=(c))
62*b30d1939SAndy Fiddaman #define SYNC()		do{SYNCINX();SYNCOUTX();pp.state=st;}while(0)
63*b30d1939SAndy Fiddaman #define SYNCIN()	do{SYNCINX();pp.state=st;}while(0)
64*b30d1939SAndy Fiddaman #define SYNCINX()	do{pp.in->nextchr=ip;}while(0)
65*b30d1939SAndy Fiddaman #define SYNCOUT()	do{SYNCOUTX();pp.state=st;}while(0)
66*b30d1939SAndy Fiddaman #define SYNCOUTX()	do{if(sp)op=tp=sp;pp.outp=op;}while(0)
67*b30d1939SAndy Fiddaman #define UNGETCHR(c)	(*--ip=(c))
68*b30d1939SAndy Fiddaman 
69*b30d1939SAndy Fiddaman #define PPCHECKOUT()	do{if(op>xp){{PPWRITE(PPBUFSIZ);if(pp.outbuf==pp.outb){pp.outbuf+=PPBUFSIZ;xp=pp.oute+=PPBUFSIZ;}else{pp.outbuf-=PPBUFSIZ;memcpy(pp.outbuf,xp,op-xp);xp=pp.oute-=PPBUFSIZ;op-=2*PPBUFSIZ;}}}}while(0)
70*b30d1939SAndy Fiddaman #define PPCHECKOUTSP()	do{if(op>xp){if(sp)op=sp;else{PPWRITE(PPBUFSIZ);if(pp.outbuf==pp.outb){pp.outbuf+=PPBUFSIZ;xp=pp.oute+=PPBUFSIZ;}else{pp.outbuf-=PPBUFSIZ;memcpy(pp.outbuf,xp,op-xp);xp=pp.oute-=PPBUFSIZ;op-=2*PPBUFSIZ;}}}}while(0)
71*b30d1939SAndy Fiddaman #define PPCHECKOUTTP()	do{if(op>xp){{PPWRITE(PPBUFSIZ);if(pp.outbuf==pp.outb){pp.outbuf+=PPBUFSIZ;xp=pp.oute+=PPBUFSIZ;}else{pp.outbuf-=PPBUFSIZ;memcpy(pp.outbuf,xp,op-xp);xp=pp.oute-=PPBUFSIZ;op-=2*PPBUFSIZ;}}tp=op;}}while(0)
72*b30d1939SAndy Fiddaman 
73*b30d1939SAndy Fiddaman #define PPSYNCLINE()	do { \
74*b30d1939SAndy Fiddaman 		if ((st & (ADD|HIDDEN)) && !(*pp.control & SKIP)) \
75*b30d1939SAndy Fiddaman 		{ \
76*b30d1939SAndy Fiddaman 		    if (spliced) \
77*b30d1939SAndy Fiddaman 		    { \
78*b30d1939SAndy Fiddaman 			error_info.line += spliced; \
79*b30d1939SAndy Fiddaman 			spliced = 0; \
80*b30d1939SAndy Fiddaman 		    } \
81*b30d1939SAndy Fiddaman 		    else \
82*b30d1939SAndy Fiddaman 		    { \
83*b30d1939SAndy Fiddaman 			if (st & ADD) \
84*b30d1939SAndy Fiddaman 			{ \
85*b30d1939SAndy Fiddaman 				st &= ~ADD; \
86*b30d1939SAndy Fiddaman 				m = pp.addp - pp.addbuf; \
87*b30d1939SAndy Fiddaman 				pp.addp = pp.addbuf; \
88*b30d1939SAndy Fiddaman 				memcpy(op, pp.addbuf, m); \
89*b30d1939SAndy Fiddaman 				op += m; \
90*b30d1939SAndy Fiddaman 				PPCHECKOUT(); \
91*b30d1939SAndy Fiddaman 			} \
92*b30d1939SAndy Fiddaman 			if (pp.linesync) \
93*b30d1939SAndy Fiddaman 			{ \
94*b30d1939SAndy Fiddaman 				if ((st & SYNCLINE) || pp.hidden >= MAXHIDDEN) \
95*b30d1939SAndy Fiddaman 				{ \
96*b30d1939SAndy Fiddaman 					pp.hidden = 0; \
97*b30d1939SAndy Fiddaman 					st &= ~(HIDDEN|SYNCLINE); \
98*b30d1939SAndy Fiddaman 					if (error_info.line) \
99*b30d1939SAndy Fiddaman 					{ \
100*b30d1939SAndy Fiddaman 						if (LASTOUT() != '\n') \
101*b30d1939SAndy Fiddaman 							PUTCHR('\n'); \
102*b30d1939SAndy Fiddaman 						SYNCOUT(); \
103*b30d1939SAndy Fiddaman 						(*pp.linesync)(error_info.line, error_info.file); \
104*b30d1939SAndy Fiddaman 						CACHEOUT(); \
105*b30d1939SAndy Fiddaman 					} \
106*b30d1939SAndy Fiddaman 				} \
107*b30d1939SAndy Fiddaman 				else \
108*b30d1939SAndy Fiddaman 				{ \
109*b30d1939SAndy Fiddaman 					m = pp.hidden; \
110*b30d1939SAndy Fiddaman 					pp.hidden = 0; \
111*b30d1939SAndy Fiddaman 					st &= ~HIDDEN; \
112*b30d1939SAndy Fiddaman 					while (m-- > 0) \
113*b30d1939SAndy Fiddaman 						PUTCHR('\n'); \
114*b30d1939SAndy Fiddaman 				} \
115*b30d1939SAndy Fiddaman 			} \
116*b30d1939SAndy Fiddaman 			else \
117*b30d1939SAndy Fiddaman 			{ \
118*b30d1939SAndy Fiddaman 				pp.hidden = 0; \
119*b30d1939SAndy Fiddaman 				st &= ~HIDDEN; \
120*b30d1939SAndy Fiddaman 				PUTCHR('\n'); \
121*b30d1939SAndy Fiddaman 			} \
122*b30d1939SAndy Fiddaman 		    } \
123*b30d1939SAndy Fiddaman 		} \
124*b30d1939SAndy Fiddaman 	} while (0)
125*b30d1939SAndy Fiddaman 
126*b30d1939SAndy Fiddaman #if POOL
127*b30d1939SAndy Fiddaman 
128*b30d1939SAndy Fiddaman /*
129*b30d1939SAndy Fiddaman  * <wait.h> is poison here so pool moved to the end
130*b30d1939SAndy Fiddaman  */
131*b30d1939SAndy Fiddaman 
132*b30d1939SAndy Fiddaman static void	poolstatus(void);
133*b30d1939SAndy Fiddaman static void	pool(void);
134*b30d1939SAndy Fiddaman 
135*b30d1939SAndy Fiddaman #endif
136*b30d1939SAndy Fiddaman 
137*b30d1939SAndy Fiddaman #else
138*b30d1939SAndy Fiddaman 
139*b30d1939SAndy Fiddaman /*
140*b30d1939SAndy Fiddaman  * return next pp token
141*b30d1939SAndy Fiddaman  *
142*b30d1939SAndy Fiddaman  * NOTE: pp.token points to at least MAXTOKEN*2 chars and is
143*b30d1939SAndy Fiddaman  *       truncated back to MAXTOKEN on EOB
144*b30d1939SAndy Fiddaman  */
145*b30d1939SAndy Fiddaman 
146*b30d1939SAndy Fiddaman #define PPCPP_T		int
147*b30d1939SAndy Fiddaman #define ppcpp		pplex
148*b30d1939SAndy Fiddaman 
149*b30d1939SAndy Fiddaman #define START		TOKEN
150*b30d1939SAndy Fiddaman #define INMACRO(x)	INTMACRO(x)
151*b30d1939SAndy Fiddaman #define DOSTRIP()	((st&STRIP)||pp.level==1&&(st&(COMPILE|JOINING))==COMPILE&&!(pp.option&PRESERVE))
152*b30d1939SAndy Fiddaman 
153*b30d1939SAndy Fiddaman #define st		pp.state
154*b30d1939SAndy Fiddaman #define tp		pp.token
155*b30d1939SAndy Fiddaman #define xp		&pp.token[MAXTOKEN]
156*b30d1939SAndy Fiddaman 
157*b30d1939SAndy Fiddaman #define BACKIN()	(ip--)
158*b30d1939SAndy Fiddaman #define BACKOUT()	(op=pp.token)
159*b30d1939SAndy Fiddaman #define CACHE()		do{CACHEIN();CACHEOUT();}while(0)
160*b30d1939SAndy Fiddaman #define CACHEIN()	(ip=pp.in->nextchr)
161*b30d1939SAndy Fiddaman #define CACHEOUT()	(op=pp.token)
162*b30d1939SAndy Fiddaman #define GETCHR()	(*(unsigned char*)ip++)
163*b30d1939SAndy Fiddaman #define LASTCHR()	(*(ip-1))
164*b30d1939SAndy Fiddaman #define PUTCHR(c)	(*op++=(c))
165*b30d1939SAndy Fiddaman #define SETCHR(c)	(*op=(c))
166*b30d1939SAndy Fiddaman #define SKIPIN()	(ip++)
167*b30d1939SAndy Fiddaman #define SYNC()		do{SYNCIN();SYNCOUT();}while(0)
168*b30d1939SAndy Fiddaman #define SYNCIN()	(pp.in->nextchr=ip)
169*b30d1939SAndy Fiddaman #define SYNCOUT()	(pp.toknxt=op)
170*b30d1939SAndy Fiddaman #define UNGETCHR(c)	(*--ip=(c))
171*b30d1939SAndy Fiddaman 
172*b30d1939SAndy Fiddaman #endif
173*b30d1939SAndy Fiddaman 
174*b30d1939SAndy Fiddaman PPCPP_T
ppcpp(void)175*b30d1939SAndy Fiddaman ppcpp(void)
176*b30d1939SAndy Fiddaman {
177*b30d1939SAndy Fiddaman 	register short*		rp;
178*b30d1939SAndy Fiddaman 	register char*		ip;
179*b30d1939SAndy Fiddaman 	register int		state;
180*b30d1939SAndy Fiddaman 	register int		c;
181*b30d1939SAndy Fiddaman 	register char*		op;
182*b30d1939SAndy Fiddaman 	char*			bp;
183*b30d1939SAndy Fiddaman 	int			n;
184*b30d1939SAndy Fiddaman 	int			m;
185*b30d1939SAndy Fiddaman 	int			quot;
186*b30d1939SAndy Fiddaman 	int			quotquot;
187*b30d1939SAndy Fiddaman 	int			comdelim = 0;
188*b30d1939SAndy Fiddaman 	int			comstart = 0;
189*b30d1939SAndy Fiddaman 	int			comwarn = 0;
190*b30d1939SAndy Fiddaman 	char*			s;
191*b30d1939SAndy Fiddaman 	struct ppsymbol*	sym;
192*b30d1939SAndy Fiddaman #if CPP
193*b30d1939SAndy Fiddaman 	register long		st;
194*b30d1939SAndy Fiddaman 	char*			tp;
195*b30d1939SAndy Fiddaman 	char*			xp;
196*b30d1939SAndy Fiddaman 	char*			sp = 0;
197*b30d1939SAndy Fiddaman 	int			qual = 0;
198*b30d1939SAndy Fiddaman 	int			spliced = 0;
199*b30d1939SAndy Fiddaman #else
200*b30d1939SAndy Fiddaman 	int			qual;
201*b30d1939SAndy Fiddaman #endif
202*b30d1939SAndy Fiddaman 
203*b30d1939SAndy Fiddaman #if CPP
204*b30d1939SAndy Fiddaman #if POOL
205*b30d1939SAndy Fiddaman  fsm_pool:
206*b30d1939SAndy Fiddaman #endif
207*b30d1939SAndy Fiddaman #else
208*b30d1939SAndy Fiddaman 	count(pplex);
209*b30d1939SAndy Fiddaman #endif
210*b30d1939SAndy Fiddaman 	error_info.indent++;
211*b30d1939SAndy Fiddaman 	pp.level++;
212*b30d1939SAndy Fiddaman 	CACHE();
213*b30d1939SAndy Fiddaman #if !CPP
214*b30d1939SAndy Fiddaman  fsm_top:
215*b30d1939SAndy Fiddaman 	qual = 0;
216*b30d1939SAndy Fiddaman #endif
217*b30d1939SAndy Fiddaman  fsm_start:
218*b30d1939SAndy Fiddaman #if CPP
219*b30d1939SAndy Fiddaman 	PPCHECKOUTSP();
220*b30d1939SAndy Fiddaman 	tp = op;
221*b30d1939SAndy Fiddaman #endif
222*b30d1939SAndy Fiddaman 	state = START;
223*b30d1939SAndy Fiddaman  fsm_begin:
224*b30d1939SAndy Fiddaman 	bp = ip;
225*b30d1939SAndy Fiddaman 	do
226*b30d1939SAndy Fiddaman 	{
227*b30d1939SAndy Fiddaman 		rp = fsm[state];
228*b30d1939SAndy Fiddaman  fsm_get:
229*b30d1939SAndy Fiddaman 		while (!(state = rp[c = GETCHR()]));
230*b30d1939SAndy Fiddaman  fsm_next:
231*b30d1939SAndy Fiddaman 		;
232*b30d1939SAndy Fiddaman 	} while (state > 0);
233*b30d1939SAndy Fiddaman 	if (((state = ~state) != S_COMMENT || pp.comment || c == '/' && !INCOMMENT(rp)) && (n = ip - bp - 1) > 0)
234*b30d1939SAndy Fiddaman 	{
235*b30d1939SAndy Fiddaman 		ip = bp;
236*b30d1939SAndy Fiddaman #if CPP
237*b30d1939SAndy Fiddaman 		if (op == tp && (st & (ADD|HIDDEN)) && !(st & PASSTHROUGH) && !(pp.option & PRESERVE))
238*b30d1939SAndy Fiddaman 			switch (TERM(state))
239*b30d1939SAndy Fiddaman 			{
240*b30d1939SAndy Fiddaman 			case S_SHARP:
241*b30d1939SAndy Fiddaman 				break;
242*b30d1939SAndy Fiddaman 			case S_CHRB:
243*b30d1939SAndy Fiddaman 			case S_NL:
244*b30d1939SAndy Fiddaman 				if (*ip == '\n')
245*b30d1939SAndy Fiddaman 					break;
246*b30d1939SAndy Fiddaman 				/*FALLTHROUGH*/
247*b30d1939SAndy Fiddaman 			default:
248*b30d1939SAndy Fiddaman 				if ((pp.option & PRESERVE) && !(st & NEWLINE) && c != '\n')
249*b30d1939SAndy Fiddaman 					break;
250*b30d1939SAndy Fiddaman 				PPSYNCLINE();
251*b30d1939SAndy Fiddaman 				tp = op;
252*b30d1939SAndy Fiddaman 				break;
253*b30d1939SAndy Fiddaman 			}
254*b30d1939SAndy Fiddaman #endif
255*b30d1939SAndy Fiddaman 		MEMCPY(op, ip, n);
256*b30d1939SAndy Fiddaman 		ip++;
257*b30d1939SAndy Fiddaman 	}
258*b30d1939SAndy Fiddaman 	count(terminal);
259*b30d1939SAndy Fiddaman #if CPP && (DEBUG & TRACE_debug)
260*b30d1939SAndy Fiddaman 	hit[(state & SPLICE) ? (elementsof(hit) - 1) : (TERM(state) - TERMINAL)]++;
261*b30d1939SAndy Fiddaman #endif
262*b30d1939SAndy Fiddaman  fsm_terminal:
263*b30d1939SAndy Fiddaman 	debug((-9, "TERM %s > %s%s%s |%-*.*s|%s|", pplexstr(INDEX(rp)), pplexstr(state), (st & NEWLINE) ? "|NEWLINE" : "", (st & SKIPCONTROL) ? "|SKIP" : "", op - tp, op - tp, tp, pptokchr(c)));
264*b30d1939SAndy Fiddaman 	switch (TERM(state))
265*b30d1939SAndy Fiddaman 	{
266*b30d1939SAndy Fiddaman 
267*b30d1939SAndy Fiddaman #if !CPP
268*b30d1939SAndy Fiddaman 	case S_CHR:
269*b30d1939SAndy Fiddaman 		PUTCHR(c);
270*b30d1939SAndy Fiddaman 		break;
271*b30d1939SAndy Fiddaman #endif
272*b30d1939SAndy Fiddaman 
273*b30d1939SAndy Fiddaman 	case S_CHRB:
274*b30d1939SAndy Fiddaman 		BACKIN();
275*b30d1939SAndy Fiddaman #if CPP
276*b30d1939SAndy Fiddaman 		st &= ~NEWLINE;
277*b30d1939SAndy Fiddaman 		pp.in->flags |= IN_tokens;
278*b30d1939SAndy Fiddaman 		count(token);
279*b30d1939SAndy Fiddaman 		goto fsm_start;
280*b30d1939SAndy Fiddaman #else
281*b30d1939SAndy Fiddaman 		c = *tp;
282*b30d1939SAndy Fiddaman 		break;
283*b30d1939SAndy Fiddaman #endif
284*b30d1939SAndy Fiddaman 
285*b30d1939SAndy Fiddaman 	case S_COMMENT:
286*b30d1939SAndy Fiddaman 		switch (c)
287*b30d1939SAndy Fiddaman 		{
288*b30d1939SAndy Fiddaman 		case '\n':
289*b30d1939SAndy Fiddaman 			if (!INCOMMENTXX(rp))
290*b30d1939SAndy Fiddaman 			{
291*b30d1939SAndy Fiddaman 				qual = 0;
292*b30d1939SAndy Fiddaman 				if (!comstart) comstart = comdelim = error_info.line;
293*b30d1939SAndy Fiddaman 				error_info.line++;
294*b30d1939SAndy Fiddaman 				if (pp.comment) PUTCHR(c);
295*b30d1939SAndy Fiddaman 				else BACKOUT();
296*b30d1939SAndy Fiddaman #if CPP
297*b30d1939SAndy Fiddaman 				rp = fsm[COM2];
298*b30d1939SAndy Fiddaman 				bp = ip;
299*b30d1939SAndy Fiddaman 				goto fsm_get;
300*b30d1939SAndy Fiddaman #else
301*b30d1939SAndy Fiddaman 				state = COM2;
302*b30d1939SAndy Fiddaman 				goto fsm_begin;
303*b30d1939SAndy Fiddaman #endif
304*b30d1939SAndy Fiddaman 			}
305*b30d1939SAndy Fiddaman 			else if (comwarn < 0 && !(pp.mode & HOSTED))
306*b30d1939SAndy Fiddaman 				error(1, "/* appears in // comment");
307*b30d1939SAndy Fiddaman 			break;
308*b30d1939SAndy Fiddaman 		case '*':
309*b30d1939SAndy Fiddaman 			if (!comwarn && !(pp.mode & HOSTED))
310*b30d1939SAndy Fiddaman 			{
311*b30d1939SAndy Fiddaman 				if (INCOMMENTXX(rp)) comwarn = -1;
312*b30d1939SAndy Fiddaman 				else if (comstart && comstart != error_info.line)
313*b30d1939SAndy Fiddaman 				{
314*b30d1939SAndy Fiddaman 					if (qual || comdelim < error_info.line - 1)
315*b30d1939SAndy Fiddaman 					{
316*b30d1939SAndy Fiddaman 						error(1, "/* appears in /* ... */ comment starting at line %d", comstart);
317*b30d1939SAndy Fiddaman 						comwarn = 1;
318*b30d1939SAndy Fiddaman 					}
319*b30d1939SAndy Fiddaman 					else comdelim = error_info.line;
320*b30d1939SAndy Fiddaman 				}
321*b30d1939SAndy Fiddaman 			}
322*b30d1939SAndy Fiddaman  fsm_comment:
323*b30d1939SAndy Fiddaman 			PUTCHR(c);
324*b30d1939SAndy Fiddaman #if CPP
325*b30d1939SAndy Fiddaman 			rp = fsm[INCOMMENTXX(rp) ? COM5 : COM3];
326*b30d1939SAndy Fiddaman 			bp = ip;
327*b30d1939SAndy Fiddaman 			goto fsm_get;
328*b30d1939SAndy Fiddaman #else
329*b30d1939SAndy Fiddaman 			state = INCOMMENTXX(rp) ? COM5 : COM3;
330*b30d1939SAndy Fiddaman 			goto fsm_begin;
331*b30d1939SAndy Fiddaman #endif
332*b30d1939SAndy Fiddaman 		case '/':
333*b30d1939SAndy Fiddaman 			if (!INCOMMENT(rp))
334*b30d1939SAndy Fiddaman 			{
335*b30d1939SAndy Fiddaman 				if (!(pp.mode & HOSTED))
336*b30d1939SAndy Fiddaman 					error(1, "*/ appears outside of comment");
337*b30d1939SAndy Fiddaman 				BACKIN();
338*b30d1939SAndy Fiddaman #if CPP
339*b30d1939SAndy Fiddaman 				st &= ~NEWLINE;
340*b30d1939SAndy Fiddaman 				pp.in->flags |= IN_tokens;
341*b30d1939SAndy Fiddaman 				count(token);
342*b30d1939SAndy Fiddaman 				goto fsm_start;
343*b30d1939SAndy Fiddaman #else
344*b30d1939SAndy Fiddaman 				c = '*';
345*b30d1939SAndy Fiddaman 				if (!pp.comment) PUTCHR(c);
346*b30d1939SAndy Fiddaman 				goto fsm_token;
347*b30d1939SAndy Fiddaman #endif
348*b30d1939SAndy Fiddaman 			}
349*b30d1939SAndy Fiddaman 			else if (INCOMMENTXX(rp))
350*b30d1939SAndy Fiddaman 			{
351*b30d1939SAndy Fiddaman 				if (!(pp.mode & HOSTED))
352*b30d1939SAndy Fiddaman 				{
353*b30d1939SAndy Fiddaman 					if (comwarn < 0) comwarn = 0;
354*b30d1939SAndy Fiddaman 					else if (!comwarn)
355*b30d1939SAndy Fiddaman 					{
356*b30d1939SAndy Fiddaman 						comwarn = 1;
357*b30d1939SAndy Fiddaman 						error(1, "*/ appears in // comment");
358*b30d1939SAndy Fiddaman 					}
359*b30d1939SAndy Fiddaman 				}
360*b30d1939SAndy Fiddaman 				goto fsm_comment;
361*b30d1939SAndy Fiddaman 			}
362*b30d1939SAndy Fiddaman 			break;
363*b30d1939SAndy Fiddaman 		case EOF:
364*b30d1939SAndy Fiddaman 			BACKIN();
365*b30d1939SAndy Fiddaman 			if (!(pp.mode & HOSTED))
366*b30d1939SAndy Fiddaman 			{
367*b30d1939SAndy Fiddaman 				if (comstart) error(2, "unterminated /* ... */ comment starting at line %d", comstart);
368*b30d1939SAndy Fiddaman 				else if (INCOMMENTXX(rp)) error(2, "unterminated // ... comment");
369*b30d1939SAndy Fiddaman 				else error(2, "unterminated /* ... */ comment");
370*b30d1939SAndy Fiddaman 			}
371*b30d1939SAndy Fiddaman 			break;
372*b30d1939SAndy Fiddaman 		}
373*b30d1939SAndy Fiddaman #if CPP
374*b30d1939SAndy Fiddaman 		if (!pp.comment || sp)
375*b30d1939SAndy Fiddaman 		{
376*b30d1939SAndy Fiddaman #if COMPATIBLE
377*b30d1939SAndy Fiddaman 			if (!(pp.state & COMPATIBILITY) || *bp == ' ' || *bp == '\t')
378*b30d1939SAndy Fiddaman #endif
379*b30d1939SAndy Fiddaman 			{
380*b30d1939SAndy Fiddaman 				BACKOUT();
381*b30d1939SAndy Fiddaman 				PUTCHR(' ');
382*b30d1939SAndy Fiddaman 				tp = op;
383*b30d1939SAndy Fiddaman 			}
384*b30d1939SAndy Fiddaman 		}
385*b30d1939SAndy Fiddaman 		else if (pp.in->type & IN_TOP)
386*b30d1939SAndy Fiddaman #else
387*b30d1939SAndy Fiddaman 		if (pp.comment && !(st & (COLLECTING|DIRECTIVE|JOINING)) && !(*pp.control & SKIP) && (pp.in->type & IN_TOP))
388*b30d1939SAndy Fiddaman #endif
389*b30d1939SAndy Fiddaman 		{
390*b30d1939SAndy Fiddaman 			st &= ~HIDDEN;
391*b30d1939SAndy Fiddaman 			pp.hidden = 0;
392*b30d1939SAndy Fiddaman 			*(op - (c != '\n')) = 0;
393*b30d1939SAndy Fiddaman 			m = (op - (c != '\n') - tp > MAXTOKEN - 6) ? (error_info.line - MAXHIDDEN) : 0;
394*b30d1939SAndy Fiddaman 			BACKOUT();
395*b30d1939SAndy Fiddaman 			SYNC();
396*b30d1939SAndy Fiddaman 			while (*tp != '/') tp++;
397*b30d1939SAndy Fiddaman 			(*pp.comment)(c == '\n' ? "//" : "/*", tp + 2, c == '\n' ? "" : (st & HEADER) ? "*/\n" : "*/", comstart ? comstart : error_info.line);
398*b30d1939SAndy Fiddaman 			CACHE();
399*b30d1939SAndy Fiddaman 			comstart = m;
400*b30d1939SAndy Fiddaman 		}
401*b30d1939SAndy Fiddaman 		if (comstart)
402*b30d1939SAndy Fiddaman 		{
403*b30d1939SAndy Fiddaman 			st |= HIDDEN;
404*b30d1939SAndy Fiddaman 			pp.hidden += error_info.line - comstart;
405*b30d1939SAndy Fiddaman 			comstart = 0;
406*b30d1939SAndy Fiddaman 		}
407*b30d1939SAndy Fiddaman 		qual = comwarn = comdelim = 0;
408*b30d1939SAndy Fiddaman 		BACKOUT();
409*b30d1939SAndy Fiddaman 		if (c == '\n') goto fsm_newline;
410*b30d1939SAndy Fiddaman 		if ((st & PASSTHROUGH) && ((st & (HIDDEN|NEWLINE)) || *ip == '\n'))
411*b30d1939SAndy Fiddaman 		{
412*b30d1939SAndy Fiddaman 			if (*ip == '\n')
413*b30d1939SAndy Fiddaman 				ip++;
414*b30d1939SAndy Fiddaman 			goto fsm_newline;
415*b30d1939SAndy Fiddaman 		}
416*b30d1939SAndy Fiddaman #if COMPATIBLE
417*b30d1939SAndy Fiddaman 		if ((st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY) st &= ~NEWLINE;
418*b30d1939SAndy Fiddaman #endif
419*b30d1939SAndy Fiddaman #if !CPP
420*b30d1939SAndy Fiddaman 		if (pp.level > 1 && !(st & (NOSPACE|SKIPCONTROL)))
421*b30d1939SAndy Fiddaman 		{
422*b30d1939SAndy Fiddaman #if COMPATIBLE
423*b30d1939SAndy Fiddaman 			c = ((st & (COMPATIBILITY|DEFINITION)) == ((COMPATIBILITY|DEFINITION))) ? '\t' : ' ';
424*b30d1939SAndy Fiddaman #else
425*b30d1939SAndy Fiddaman 			c = ' ';
426*b30d1939SAndy Fiddaman #endif
427*b30d1939SAndy Fiddaman 			goto fsm_return;
428*b30d1939SAndy Fiddaman 		}
429*b30d1939SAndy Fiddaman #endif
430*b30d1939SAndy Fiddaman 		goto fsm_start;
431*b30d1939SAndy Fiddaman 
432*b30d1939SAndy Fiddaman 	case S_EOB:
433*b30d1939SAndy Fiddaman 		if (c)
434*b30d1939SAndy Fiddaman 		{
435*b30d1939SAndy Fiddaman 			if (state = fsm[TERMINAL][INDEX(rp)+1])
436*b30d1939SAndy Fiddaman 				goto fsm_terminal;
437*b30d1939SAndy Fiddaman #if CPP
438*b30d1939SAndy Fiddaman #if POOL
439*b30d1939SAndy Fiddaman 			if (pp.pool.input)
440*b30d1939SAndy Fiddaman 			{
441*b30d1939SAndy Fiddaman 				BACKIN();
442*b30d1939SAndy Fiddaman 				SYNC();
443*b30d1939SAndy Fiddaman 				pool();
444*b30d1939SAndy Fiddaman 				CACHE();
445*b30d1939SAndy Fiddaman 				goto fsm_pool;
446*b30d1939SAndy Fiddaman 			}
447*b30d1939SAndy Fiddaman #endif
448*b30d1939SAndy Fiddaman 			SYNCOUT();
449*b30d1939SAndy Fiddaman 			return;
450*b30d1939SAndy Fiddaman #else
451*b30d1939SAndy Fiddaman 			BACKIN();
452*b30d1939SAndy Fiddaman 			c = 0;
453*b30d1939SAndy Fiddaman 			goto fsm_return;
454*b30d1939SAndy Fiddaman #endif
455*b30d1939SAndy Fiddaman 		}
456*b30d1939SAndy Fiddaman 		{
457*b30d1939SAndy Fiddaman 			register struct ppinstk*	cur = pp.in;
458*b30d1939SAndy Fiddaman 			register struct ppinstk*	prv = pp.in->prev;
459*b30d1939SAndy Fiddaman 
460*b30d1939SAndy Fiddaman #if CPP
461*b30d1939SAndy Fiddaman 			if (sp) op = sp;
462*b30d1939SAndy Fiddaman #endif
463*b30d1939SAndy Fiddaman 			switch (cur->type)
464*b30d1939SAndy Fiddaman 			{
465*b30d1939SAndy Fiddaman 			case IN_BUFFER:
466*b30d1939SAndy Fiddaman 			case IN_INIT:
467*b30d1939SAndy Fiddaman 			case IN_RESCAN:
468*b30d1939SAndy Fiddaman #if CPP
469*b30d1939SAndy Fiddaman 				if (prv)
470*b30d1939SAndy Fiddaman #else
471*b30d1939SAndy Fiddaman 				if (!(st & PASSEOF) && prv)
472*b30d1939SAndy Fiddaman #endif
473*b30d1939SAndy Fiddaman 				{
474*b30d1939SAndy Fiddaman 					if (cur->type == IN_RESCAN || cur->type == IN_BUFFER)
475*b30d1939SAndy Fiddaman 					{
476*b30d1939SAndy Fiddaman  fsm_pop:
477*b30d1939SAndy Fiddaman #if PROTOTYPE
478*b30d1939SAndy Fiddaman 						if (cur->flags & IN_prototype)
479*b30d1939SAndy Fiddaman 							pppclose(cur->buffer + PPBAKSIZ);
480*b30d1939SAndy Fiddaman 						else
481*b30d1939SAndy Fiddaman #endif
482*b30d1939SAndy Fiddaman 						if (!(cur->flags & IN_static))
483*b30d1939SAndy Fiddaman 							free(cur->buffer);
484*b30d1939SAndy Fiddaman 					}
485*b30d1939SAndy Fiddaman 					while (pp.control-- != cur->control)
486*b30d1939SAndy Fiddaman 						error(2, "#%s on line %d has no #%s", dirname(IF), GETIFLINE(pp.control+1), dirname(ENDIF));
487*b30d1939SAndy Fiddaman 					st |= NEWLINE;
488*b30d1939SAndy Fiddaman 					error_info.file = cur->file;
489*b30d1939SAndy Fiddaman 					error_info.line = cur->line;
490*b30d1939SAndy Fiddaman 					pp.hidden = 0;
491*b30d1939SAndy Fiddaman #if CPP
492*b30d1939SAndy Fiddaman 					spliced = 0;
493*b30d1939SAndy Fiddaman #endif
494*b30d1939SAndy Fiddaman 					if (cur->flags & IN_hosted)
495*b30d1939SAndy Fiddaman 					{
496*b30d1939SAndy Fiddaman 						pp.mode |= HOSTED;
497*b30d1939SAndy Fiddaman 						pp.flags |= PP_hosted;
498*b30d1939SAndy Fiddaman 					}
499*b30d1939SAndy Fiddaman 					else
500*b30d1939SAndy Fiddaman 					{
501*b30d1939SAndy Fiddaman 						pp.mode &= ~HOSTED;
502*b30d1939SAndy Fiddaman 						pp.flags &= ~PP_hosted;
503*b30d1939SAndy Fiddaman 					}
504*b30d1939SAndy Fiddaman #if !CPP && CATSTRINGS
505*b30d1939SAndy Fiddaman 					if (st & JOINING) st |= HIDDEN|SYNCLINE;
506*b30d1939SAndy Fiddaman 					else
507*b30d1939SAndy Fiddaman #endif
508*b30d1939SAndy Fiddaman 					{
509*b30d1939SAndy Fiddaman 						st &= ~(HIDDEN|SYNCLINE);
510*b30d1939SAndy Fiddaman 						switch (cur->type)
511*b30d1939SAndy Fiddaman 						{
512*b30d1939SAndy Fiddaman 						case IN_BUFFER:
513*b30d1939SAndy Fiddaman 						case IN_INIT:
514*b30d1939SAndy Fiddaman 							if (!prv->prev) break;
515*b30d1939SAndy Fiddaman 							/*FALLTHROUGH*/
516*b30d1939SAndy Fiddaman 						case IN_FILE:
517*b30d1939SAndy Fiddaman 						case IN_RESCAN:
518*b30d1939SAndy Fiddaman 							if (prv->type == IN_FILE || cur->type == IN_FILE && (prv->type == IN_RESCAN || prv->type == IN_MULTILINE))
519*b30d1939SAndy Fiddaman 							{
520*b30d1939SAndy Fiddaman 								if (pp.linesync && (cur->type != IN_RESCAN || (cur->flags & IN_sync)))
521*b30d1939SAndy Fiddaman 								{
522*b30d1939SAndy Fiddaman 									POP();
523*b30d1939SAndy Fiddaman 									SYNCOUT();
524*b30d1939SAndy Fiddaman 									(*pp.linesync)(error_info.line, error_info.file);
525*b30d1939SAndy Fiddaman 									CACHEOUT();
526*b30d1939SAndy Fiddaman 									prv = pp.in;
527*b30d1939SAndy Fiddaman 								}
528*b30d1939SAndy Fiddaman 							}
529*b30d1939SAndy Fiddaman #if DEBUG
530*b30d1939SAndy Fiddaman 							else if (!prv->prev)
531*b30d1939SAndy Fiddaman 							{
532*b30d1939SAndy Fiddaman 								/*UNDENT*/
533*b30d1939SAndy Fiddaman 	c = 0;
534*b30d1939SAndy Fiddaman #if DEBUG & TRACE_count
535*b30d1939SAndy Fiddaman 	if (pp.test & TEST_count)
536*b30d1939SAndy Fiddaman 	{
537*b30d1939SAndy Fiddaman 		c = 1;
538*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "\n");
539*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: pplex calls\n", pp.counter.pplex);
540*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: terminal states\n", pp.counter.terminal);
541*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: emitted tokens\n", pp.counter.token);
542*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: input stream pushes\n", pp.counter.push);
543*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: macro candidates\n", pp.counter.candidate);
544*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: macro expansions\n", pp.counter.macro);
545*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "%7d: function macros\n", pp.counter.function);
546*b30d1939SAndy Fiddaman 	}
547*b30d1939SAndy Fiddaman #endif
548*b30d1939SAndy Fiddaman #if CPP && (DEBUG & TRACE_debug)
549*b30d1939SAndy Fiddaman 	if (pp.test & TEST_hit)
550*b30d1939SAndy Fiddaman 	{
551*b30d1939SAndy Fiddaman 		c = 1;
552*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "\n");
553*b30d1939SAndy Fiddaman 		if (hit[elementsof(hit) - 1])
554*b30d1939SAndy Fiddaman 			sfprintf(sfstderr, "%7d: SPLICE\n", hit[elementsof(hit) - 1]);
555*b30d1939SAndy Fiddaman 		for (n = 0; n < elementsof(hit) - 1; n++)
556*b30d1939SAndy Fiddaman 			if (hit[n])
557*b30d1939SAndy Fiddaman 				sfprintf(sfstderr, "%7d: %s\n", hit[n], pplexstr(TERMINAL + n));
558*b30d1939SAndy Fiddaman 	}
559*b30d1939SAndy Fiddaman #endif
560*b30d1939SAndy Fiddaman 	if (pp.test & (TEST_hashcount|TEST_hashdump))
561*b30d1939SAndy Fiddaman 	{
562*b30d1939SAndy Fiddaman 		c = 1;
563*b30d1939SAndy Fiddaman 		sfprintf(sfstderr, "\n");
564*b30d1939SAndy Fiddaman 		hashdump(NiL, (pp.test & TEST_hashdump) ? HASH_BUCKET : 0);
565*b30d1939SAndy Fiddaman 	}
566*b30d1939SAndy Fiddaman 	if (c) sfprintf(sfstderr, "\n");
567*b30d1939SAndy Fiddaman 								/*INDENT*/
568*b30d1939SAndy Fiddaman 							}
569*b30d1939SAndy Fiddaman #endif
570*b30d1939SAndy Fiddaman 							break;
571*b30d1939SAndy Fiddaman 						}
572*b30d1939SAndy Fiddaman 					}
573*b30d1939SAndy Fiddaman #if CHECKPOINT
574*b30d1939SAndy Fiddaman 					if (cur->index)
575*b30d1939SAndy Fiddaman 					{
576*b30d1939SAndy Fiddaman 						SYNCOUT();
577*b30d1939SAndy Fiddaman 						cur->index->end = ppoffset();
578*b30d1939SAndy Fiddaman 						cur->index = 0;
579*b30d1939SAndy Fiddaman 						CACHEOUT();
580*b30d1939SAndy Fiddaman 					}
581*b30d1939SAndy Fiddaman #endif
582*b30d1939SAndy Fiddaman 					POP();
583*b30d1939SAndy Fiddaman 					bp = ip;
584*b30d1939SAndy Fiddaman 					tp = op;
585*b30d1939SAndy Fiddaman 					goto fsm_get;
586*b30d1939SAndy Fiddaman 				}
587*b30d1939SAndy Fiddaman 				c = EOF;
588*b30d1939SAndy Fiddaman 				break;
589*b30d1939SAndy Fiddaman 			case IN_COPY:
590*b30d1939SAndy Fiddaman 				if (prv)
591*b30d1939SAndy Fiddaman 				{
592*b30d1939SAndy Fiddaman 					error_info.line = cur->line;
593*b30d1939SAndy Fiddaman 					if (!(prv->symbol->flags & SYM_MULTILINE))
594*b30d1939SAndy Fiddaman 						prv->symbol->flags |= SYM_DISABLED;
595*b30d1939SAndy Fiddaman 					POP();
596*b30d1939SAndy Fiddaman 					bp = ip;
597*b30d1939SAndy Fiddaman 					goto fsm_get;
598*b30d1939SAndy Fiddaman 				}
599*b30d1939SAndy Fiddaman 				c = EOF;
600*b30d1939SAndy Fiddaman 				break;
601*b30d1939SAndy Fiddaman 			case IN_EXPAND:
602*b30d1939SAndy Fiddaman 				if (prv)
603*b30d1939SAndy Fiddaman 				{
604*b30d1939SAndy Fiddaman 					error_info.line = cur->line;
605*b30d1939SAndy Fiddaman 					free(cur->buffer);
606*b30d1939SAndy Fiddaman 					POP();
607*b30d1939SAndy Fiddaman 					bp = ip;
608*b30d1939SAndy Fiddaman 					goto fsm_get;
609*b30d1939SAndy Fiddaman 				}
610*b30d1939SAndy Fiddaman 				c = EOF;
611*b30d1939SAndy Fiddaman 				break;
612*b30d1939SAndy Fiddaman 			case IN_FILE:
613*b30d1939SAndy Fiddaman 				FGET(c, c, tp, xp);
614*b30d1939SAndy Fiddaman 				if (c == EOB)
615*b30d1939SAndy Fiddaman 				{
616*b30d1939SAndy Fiddaman #if CPP
617*b30d1939SAndy Fiddaman 					if ((st & (NOTEXT|HIDDEN)) == HIDDEN && LASTOUT() != '\n')
618*b30d1939SAndy Fiddaman 						PUTCHR('\n');
619*b30d1939SAndy Fiddaman 					if (prv)
620*b30d1939SAndy Fiddaman #else
621*b30d1939SAndy Fiddaman 					if (st & EOF2NL)
622*b30d1939SAndy Fiddaman 					{
623*b30d1939SAndy Fiddaman 						st &= ~EOF2NL;
624*b30d1939SAndy Fiddaman 						*(ip - 1) = c = '\n';
625*b30d1939SAndy Fiddaman 					}
626*b30d1939SAndy Fiddaman 					else if (!(st & (FILEPOP|PASSEOF)) && prv)
627*b30d1939SAndy Fiddaman #endif
628*b30d1939SAndy Fiddaman 					{
629*b30d1939SAndy Fiddaman 						if (!(cur->flags & IN_newline))
630*b30d1939SAndy Fiddaman 						{
631*b30d1939SAndy Fiddaman 							cur->flags |= IN_newline;
632*b30d1939SAndy Fiddaman 							if ((pp.mode & (HOSTED|PEDANTIC)) == PEDANTIC && LASTCHR() != '\f' && LASTCHR() != CC_sub)
633*b30d1939SAndy Fiddaman 								error(1, "file does not end with %s", pptokchr('\n'));
634*b30d1939SAndy Fiddaman 							*(ip - 1) = c = '\n';
635*b30d1939SAndy Fiddaman 						}
636*b30d1939SAndy Fiddaman 						else
637*b30d1939SAndy Fiddaman 						{
638*b30d1939SAndy Fiddaman 							if (!(cur->flags & (IN_noguard|IN_tokens)) && cur->symbol)
639*b30d1939SAndy Fiddaman 								ppmultiple(ppsetfile(error_info.file), cur->symbol);
640*b30d1939SAndy Fiddaman 							if (cur->fd >= 0)
641*b30d1939SAndy Fiddaman 								close(cur->fd);
642*b30d1939SAndy Fiddaman 							if (pp.incref && !(pp.mode & INIT))
643*b30d1939SAndy Fiddaman 							{
644*b30d1939SAndy Fiddaman 								SYNCOUT();
645*b30d1939SAndy Fiddaman 								(*pp.incref)(error_info.file, cur->file, error_info.line - 1, PP_SYNC_POP);
646*b30d1939SAndy Fiddaman 								CACHEOUT();
647*b30d1939SAndy Fiddaman 							}
648*b30d1939SAndy Fiddaman 							goto fsm_pop;
649*b30d1939SAndy Fiddaman 						}
650*b30d1939SAndy Fiddaman 					}
651*b30d1939SAndy Fiddaman 					else
652*b30d1939SAndy Fiddaman 						c = EOF;
653*b30d1939SAndy Fiddaman 				}
654*b30d1939SAndy Fiddaman 				break;
655*b30d1939SAndy Fiddaman 			case IN_MACRO:
656*b30d1939SAndy Fiddaman 			case IN_MULTILINE:
657*b30d1939SAndy Fiddaman #if !CPP
658*b30d1939SAndy Fiddaman 				if (!(st & PASSEOF))
659*b30d1939SAndy Fiddaman #endif
660*b30d1939SAndy Fiddaman #if COMPATIBLE
661*b30d1939SAndy Fiddaman 				if (prv && (!INMACRO(rp) || (st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY && ppismac(*prv->nextchr)))
662*b30d1939SAndy Fiddaman #else
663*b30d1939SAndy Fiddaman 				if (prv && !INMACRO(rp))
664*b30d1939SAndy Fiddaman #endif
665*b30d1939SAndy Fiddaman 				{
666*b30d1939SAndy Fiddaman 					if (cur->type == IN_MULTILINE)
667*b30d1939SAndy Fiddaman 					{
668*b30d1939SAndy Fiddaman 						while (pp.control-- != cur->control)
669*b30d1939SAndy Fiddaman 							error(2, "#%s on line %d has no #%s", dirname(IF), GETIFLINE(pp.control+1), dirname(ENDIF));
670*b30d1939SAndy Fiddaman 						free(cur->buffer);
671*b30d1939SAndy Fiddaman 						error_info.file = cur->file;
672*b30d1939SAndy Fiddaman 						error_info.line = cur->line;
673*b30d1939SAndy Fiddaman 						if (pp.linesync)
674*b30d1939SAndy Fiddaman 						{
675*b30d1939SAndy Fiddaman 							SYNCOUT();
676*b30d1939SAndy Fiddaman 							(*pp.linesync)(error_info.line, error_info.file);
677*b30d1939SAndy Fiddaman 							CACHEOUT();
678*b30d1939SAndy Fiddaman 						}
679*b30d1939SAndy Fiddaman 					}
680*b30d1939SAndy Fiddaman 					cur->symbol->flags &= ~SYM_DISABLED;
681*b30d1939SAndy Fiddaman 					if (cur->symbol->flags & SYM_FUNCTION)
682*b30d1939SAndy Fiddaman 						popframe(pp.macp);
683*b30d1939SAndy Fiddaman 					POP();
684*b30d1939SAndy Fiddaman #if CPP
685*b30d1939SAndy Fiddaman 					if (!(st & COMPATIBILITY) && ppisidig(*(op - 1)) && ppisidig(*ip)) UNGETCHR(' ');
686*b30d1939SAndy Fiddaman #endif
687*b30d1939SAndy Fiddaman 					bp = ip;
688*b30d1939SAndy Fiddaman 					goto fsm_get;
689*b30d1939SAndy Fiddaman 				}
690*b30d1939SAndy Fiddaman 				c = EOF;
691*b30d1939SAndy Fiddaman 				break;
692*b30d1939SAndy Fiddaman 			case IN_QUOTE:
693*b30d1939SAndy Fiddaman 				if (prv)
694*b30d1939SAndy Fiddaman 				{
695*b30d1939SAndy Fiddaman 					error_info.line = cur->line;
696*b30d1939SAndy Fiddaman 					st &= ~(ESCAPE|QUOTE);
697*b30d1939SAndy Fiddaman 					POP();
698*b30d1939SAndy Fiddaman 					c = '"';
699*b30d1939SAndy Fiddaman 				}
700*b30d1939SAndy Fiddaman 				else c = EOF;
701*b30d1939SAndy Fiddaman 				break;
702*b30d1939SAndy Fiddaman 			case IN_SQUOTE:
703*b30d1939SAndy Fiddaman 				if (prv)
704*b30d1939SAndy Fiddaman 				{
705*b30d1939SAndy Fiddaman 					error_info.line = cur->line;
706*b30d1939SAndy Fiddaman 					st &= ~(ESCAPE|SQUOTE);
707*b30d1939SAndy Fiddaman 					POP();
708*b30d1939SAndy Fiddaman 					c = '\'';
709*b30d1939SAndy Fiddaman 				}
710*b30d1939SAndy Fiddaman 				else c = EOF;
711*b30d1939SAndy Fiddaman 				break;
712*b30d1939SAndy Fiddaman 			case IN_STRING:
713*b30d1939SAndy Fiddaman #if CPP
714*b30d1939SAndy Fiddaman 				if (prv)
715*b30d1939SAndy Fiddaman #else
716*b30d1939SAndy Fiddaman 				if (!(st & PASSEOF) && !(cur->flags & IN_expand) && prv)
717*b30d1939SAndy Fiddaman #endif
718*b30d1939SAndy Fiddaman 				{
719*b30d1939SAndy Fiddaman 					if (cur->flags & IN_disable) st |= DISABLE;
720*b30d1939SAndy Fiddaman 					else st &= ~DISABLE;
721*b30d1939SAndy Fiddaman 					POP();
722*b30d1939SAndy Fiddaman 					bp = ip;
723*b30d1939SAndy Fiddaman 					goto fsm_get;
724*b30d1939SAndy Fiddaman 				}
725*b30d1939SAndy Fiddaman 				c = EOF;
726*b30d1939SAndy Fiddaman 				break;
727*b30d1939SAndy Fiddaman 			default:
728*b30d1939SAndy Fiddaman 				c = EOF;
729*b30d1939SAndy Fiddaman 				break;
730*b30d1939SAndy Fiddaman 			}
731*b30d1939SAndy Fiddaman 		}
732*b30d1939SAndy Fiddaman 		bp = ip - 1;
733*b30d1939SAndy Fiddaman 		if (state = rp[c]) goto fsm_next;
734*b30d1939SAndy Fiddaman 		goto fsm_get;
735*b30d1939SAndy Fiddaman 
736*b30d1939SAndy Fiddaman #if !CPP
737*b30d1939SAndy Fiddaman 	case S_HUH:
738*b30d1939SAndy Fiddaman 		if (INOPSPACE(rp))
739*b30d1939SAndy Fiddaman 		{
740*b30d1939SAndy Fiddaman 			if (c == '=')
741*b30d1939SAndy Fiddaman 			{
742*b30d1939SAndy Fiddaman #if PROTOTYPE
743*b30d1939SAndy Fiddaman 				if (pp.in->flags & IN_prototype) PUTCHR(c);
744*b30d1939SAndy Fiddaman 				else
745*b30d1939SAndy Fiddaman 				{
746*b30d1939SAndy Fiddaman #endif
747*b30d1939SAndy Fiddaman 					while (*(op - 1) == ' ' || *(op - 1) == '\t') op--;
748*b30d1939SAndy Fiddaman 					PUTCHR(c);
749*b30d1939SAndy Fiddaman 					if (st & (STRICT|WARN)) error(1, "%-*.*s: space ignored in operator", op - tp, op - tp, tp);
750*b30d1939SAndy Fiddaman #if PROTOTYPE
751*b30d1939SAndy Fiddaman 				}
752*b30d1939SAndy Fiddaman #endif
753*b30d1939SAndy Fiddaman 				switch (*tp)
754*b30d1939SAndy Fiddaman 				{
755*b30d1939SAndy Fiddaman 				case '/':
756*b30d1939SAndy Fiddaman 					c = T_DIVEQ;
757*b30d1939SAndy Fiddaman 					break;
758*b30d1939SAndy Fiddaman 				case '%':
759*b30d1939SAndy Fiddaman 					c = T_MODEQ;
760*b30d1939SAndy Fiddaman 					break;
761*b30d1939SAndy Fiddaman 				case '&':
762*b30d1939SAndy Fiddaman 					c = T_ANDEQ;
763*b30d1939SAndy Fiddaman 					break;
764*b30d1939SAndy Fiddaman 				case '*':
765*b30d1939SAndy Fiddaman 					c = T_MPYEQ;
766*b30d1939SAndy Fiddaman 					break;
767*b30d1939SAndy Fiddaman 				case '+':
768*b30d1939SAndy Fiddaman 					c = T_ADDEQ;
769*b30d1939SAndy Fiddaman 					break;
770*b30d1939SAndy Fiddaman 				case '-':
771*b30d1939SAndy Fiddaman 					c = T_SUBEQ;
772*b30d1939SAndy Fiddaman 					break;
773*b30d1939SAndy Fiddaman 				case '^':
774*b30d1939SAndy Fiddaman 					c = T_XOREQ;
775*b30d1939SAndy Fiddaman 					break;
776*b30d1939SAndy Fiddaman 				case '|':
777*b30d1939SAndy Fiddaman 					c = T_OREQ;
778*b30d1939SAndy Fiddaman 					break;
779*b30d1939SAndy Fiddaman 				case '<':
780*b30d1939SAndy Fiddaman 					c = T_LSHIFTEQ;
781*b30d1939SAndy Fiddaman 					break;
782*b30d1939SAndy Fiddaman 				case '>':
783*b30d1939SAndy Fiddaman 					c = T_RSHIFTEQ;
784*b30d1939SAndy Fiddaman 					break;
785*b30d1939SAndy Fiddaman 				}
786*b30d1939SAndy Fiddaman 			}
787*b30d1939SAndy Fiddaman 			else
788*b30d1939SAndy Fiddaman 			{
789*b30d1939SAndy Fiddaman 				BACKIN();
790*b30d1939SAndy Fiddaman 				switch (c = *tp)
791*b30d1939SAndy Fiddaman 				{
792*b30d1939SAndy Fiddaman 				case '<':
793*b30d1939SAndy Fiddaman 					c = T_LSHIFT;
794*b30d1939SAndy Fiddaman 					break;
795*b30d1939SAndy Fiddaman 				case '>':
796*b30d1939SAndy Fiddaman 					c = T_RSHIFT;
797*b30d1939SAndy Fiddaman 					break;
798*b30d1939SAndy Fiddaman 				}
799*b30d1939SAndy Fiddaman 			}
800*b30d1939SAndy Fiddaman 		}
801*b30d1939SAndy Fiddaman 		else if (pp.level > 1 || (pp.option & PRESERVE)) PUTCHR(c);
802*b30d1939SAndy Fiddaman 		else if (tp == op)
803*b30d1939SAndy Fiddaman 		{
804*b30d1939SAndy Fiddaman 			if (pp.in->type != IN_BUFFER)
805*b30d1939SAndy Fiddaman 			{
806*b30d1939SAndy Fiddaman 				if (!(pp.option & ALLPOSSIBLE))
807*b30d1939SAndy Fiddaman 					error(1, "%s: invalid character ignored", pptokchr(c));
808*b30d1939SAndy Fiddaman 				goto fsm_top;
809*b30d1939SAndy Fiddaman 			}
810*b30d1939SAndy Fiddaman 			PUTCHR(c);
811*b30d1939SAndy Fiddaman 		}
812*b30d1939SAndy Fiddaman 		else if (*tp == ':')
813*b30d1939SAndy Fiddaman 		{
814*b30d1939SAndy Fiddaman 			PUTCHR(c);
815*b30d1939SAndy Fiddaman 			if (c == '=') error(2, "real programmers use =");
816*b30d1939SAndy Fiddaman 			else c = '+';
817*b30d1939SAndy Fiddaman 		}
818*b30d1939SAndy Fiddaman 		else
819*b30d1939SAndy Fiddaman 		{
820*b30d1939SAndy Fiddaman 			BACKIN();
821*b30d1939SAndy Fiddaman 			c = *tp;
822*b30d1939SAndy Fiddaman 		}
823*b30d1939SAndy Fiddaman 		break;
824*b30d1939SAndy Fiddaman #endif
825*b30d1939SAndy Fiddaman 
826*b30d1939SAndy Fiddaman 	case S_QUAL:
827*b30d1939SAndy Fiddaman 		if ((state = NEXT(state)) != LIT1)
828*b30d1939SAndy Fiddaman 		{
829*b30d1939SAndy Fiddaman 			rp = fsm[state];
830*b30d1939SAndy Fiddaman 			bp = ip;
831*b30d1939SAndy Fiddaman #if CPP
832*b30d1939SAndy Fiddaman 			qual = 1;
833*b30d1939SAndy Fiddaman #if COMPATIBLE
834*b30d1939SAndy Fiddaman 			if (!(st & COMPATIBILITY) || c != 'u' && c != 'U')
835*b30d1939SAndy Fiddaman #endif
836*b30d1939SAndy Fiddaman 				PUTCHR(c);
837*b30d1939SAndy Fiddaman #else
838*b30d1939SAndy Fiddaman 			switch (c)
839*b30d1939SAndy Fiddaman 			{
840*b30d1939SAndy Fiddaman 			case 'f':
841*b30d1939SAndy Fiddaman 			case 'F':
842*b30d1939SAndy Fiddaman 				qual |= N_FLOAT;
843*b30d1939SAndy Fiddaman #if COMPATIBLE
844*b30d1939SAndy Fiddaman 				if (!(st & COMPATIBILITY))
845*b30d1939SAndy Fiddaman #endif
846*b30d1939SAndy Fiddaman 				PUTCHR(c);
847*b30d1939SAndy Fiddaman 				break;
848*b30d1939SAndy Fiddaman 			case 'l':
849*b30d1939SAndy Fiddaman 			case 'L':
850*b30d1939SAndy Fiddaman 				qual |= N_LONG;
851*b30d1939SAndy Fiddaman 				PUTCHR(c);
852*b30d1939SAndy Fiddaman 				break;
853*b30d1939SAndy Fiddaman 			case 'u':
854*b30d1939SAndy Fiddaman 			case 'U':
855*b30d1939SAndy Fiddaman 				qual |= N_UNSIGNED;
856*b30d1939SAndy Fiddaman #if COMPATIBLE
857*b30d1939SAndy Fiddaman 				if (!(st & COMPATIBILITY))
858*b30d1939SAndy Fiddaman #endif
859*b30d1939SAndy Fiddaman 				PUTCHR(c);
860*b30d1939SAndy Fiddaman 				break;
861*b30d1939SAndy Fiddaman 			default:
862*b30d1939SAndy Fiddaman 				PUTCHR(c);
863*b30d1939SAndy Fiddaman 				break;
864*b30d1939SAndy Fiddaman 			}
865*b30d1939SAndy Fiddaman #endif
866*b30d1939SAndy Fiddaman 			goto fsm_get;
867*b30d1939SAndy Fiddaman 		}
868*b30d1939SAndy Fiddaman #if !CPP
869*b30d1939SAndy Fiddaman 		qual |= N_WIDE;
870*b30d1939SAndy Fiddaman 		if (DOSTRIP()) BACKOUT();
871*b30d1939SAndy Fiddaman #endif
872*b30d1939SAndy Fiddaman 		/*FALLTHROUGH*/
873*b30d1939SAndy Fiddaman 
874*b30d1939SAndy Fiddaman 	case S_LITBEG:
875*b30d1939SAndy Fiddaman #if CPP
876*b30d1939SAndy Fiddaman 		quot = c;
877*b30d1939SAndy Fiddaman 		rp = fsm[LIT1];
878*b30d1939SAndy Fiddaman 		if (op == tp)
879*b30d1939SAndy Fiddaman 		{
880*b30d1939SAndy Fiddaman 			PPSYNCLINE();
881*b30d1939SAndy Fiddaman 			tp = op;
882*b30d1939SAndy Fiddaman 		}
883*b30d1939SAndy Fiddaman #else
884*b30d1939SAndy Fiddaman 		if ((quot = c) == '<')
885*b30d1939SAndy Fiddaman 		{
886*b30d1939SAndy Fiddaman 			if (!(st & HEADER) || (pp.option & (HEADEREXPAND|HEADEREXPANDALL)) && pp.in->type != IN_FILE && pp.in->type != IN_BUFFER && pp.in->type != IN_INIT && pp.in->type != IN_RESCAN)
887*b30d1939SAndy Fiddaman 			{
888*b30d1939SAndy Fiddaman 				PUTCHR(c);
889*b30d1939SAndy Fiddaman 				bp = ip;
890*b30d1939SAndy Fiddaman 				rp = fsm[LT1];
891*b30d1939SAndy Fiddaman 				goto fsm_get;
892*b30d1939SAndy Fiddaman 			}
893*b30d1939SAndy Fiddaman 			quot = '>';
894*b30d1939SAndy Fiddaman 			rp = fsm[HDR1];
895*b30d1939SAndy Fiddaman 		}
896*b30d1939SAndy Fiddaman 		else rp = fsm[LIT1];
897*b30d1939SAndy Fiddaman 		if (!DOSTRIP())
898*b30d1939SAndy Fiddaman #endif
899*b30d1939SAndy Fiddaman 		PUTCHR(c);
900*b30d1939SAndy Fiddaman 		bp = ip;
901*b30d1939SAndy Fiddaman 		goto fsm_get;
902*b30d1939SAndy Fiddaman 
903*b30d1939SAndy Fiddaman 	case S_LITEND:
904*b30d1939SAndy Fiddaman 		n = 1;
905*b30d1939SAndy Fiddaman 		if (c != quot)
906*b30d1939SAndy Fiddaman 		{
907*b30d1939SAndy Fiddaman 			if (c != '\n' && c != EOF)
908*b30d1939SAndy Fiddaman 			{
909*b30d1939SAndy Fiddaman 				if (st & (QUOTE|SQUOTE))
910*b30d1939SAndy Fiddaman 				{
911*b30d1939SAndy Fiddaman 					if (!(st & ESCAPE))
912*b30d1939SAndy Fiddaman 					{
913*b30d1939SAndy Fiddaman 						st |= ESCAPE;
914*b30d1939SAndy Fiddaman 						quotquot = c;
915*b30d1939SAndy Fiddaman 					}
916*b30d1939SAndy Fiddaman 					else if (c == quotquot) st &= ~ESCAPE;
917*b30d1939SAndy Fiddaman 				}
918*b30d1939SAndy Fiddaman 				PUTCHR(c);
919*b30d1939SAndy Fiddaman 				bp = ip;
920*b30d1939SAndy Fiddaman 				goto fsm_get;
921*b30d1939SAndy Fiddaman 			}
922*b30d1939SAndy Fiddaman #if CPP
923*b30d1939SAndy Fiddaman 			if ((st & PASSTHROUGH) || (pp.option & PRESERVE))
924*b30d1939SAndy Fiddaman 			{
925*b30d1939SAndy Fiddaman 				if (c == '\n') goto fsm_newline;
926*b30d1939SAndy Fiddaman 				bp = ip;
927*b30d1939SAndy Fiddaman 				goto fsm_start;
928*b30d1939SAndy Fiddaman 			}
929*b30d1939SAndy Fiddaman #endif
930*b30d1939SAndy Fiddaman 			m = (st & SKIPCONTROL) && (pp.mode & HOSTED) ? -1 : 1;
931*b30d1939SAndy Fiddaman 			if (c == '\n' && quot == '\'' && (pp.option & STRINGSPAN)) n = 0;
932*b30d1939SAndy Fiddaman 			else
933*b30d1939SAndy Fiddaman #if COMPATIBLE && !CPP
934*b30d1939SAndy Fiddaman 			if ((st & (COMPATIBILITY|DEFINITION)) != (COMPATIBILITY|DEFINITION))
935*b30d1939SAndy Fiddaman #endif
936*b30d1939SAndy Fiddaman 			{
937*b30d1939SAndy Fiddaman 				switch (quot)
938*b30d1939SAndy Fiddaman 				{
939*b30d1939SAndy Fiddaman 				case '"':
940*b30d1939SAndy Fiddaman 					if (c == '\n')
941*b30d1939SAndy Fiddaman 					{
942*b30d1939SAndy Fiddaman 						if (!(pp.option & STRINGSPAN) || (st & (COMPATIBILITY|STRICT)) == STRICT)
943*b30d1939SAndy Fiddaman 							error(m, "%s in string", pptokchr(c));
944*b30d1939SAndy Fiddaman 						error_info.line++;
945*b30d1939SAndy Fiddaman 						if (!(pp.option & STRINGSPAN))
946*b30d1939SAndy Fiddaman 						{
947*b30d1939SAndy Fiddaman 							PUTCHR('\\');
948*b30d1939SAndy Fiddaman 							c = 'n';
949*b30d1939SAndy Fiddaman 						}
950*b30d1939SAndy Fiddaman 						else if (pp.option & STRINGSPLIT)
951*b30d1939SAndy Fiddaman 						{
952*b30d1939SAndy Fiddaman 							PUTCHR('\\');
953*b30d1939SAndy Fiddaman 							PUTCHR('n');
954*b30d1939SAndy Fiddaman 							PUTCHR('"');
955*b30d1939SAndy Fiddaman 							PUTCHR('\n');
956*b30d1939SAndy Fiddaman 							c = '"';
957*b30d1939SAndy Fiddaman 						}
958*b30d1939SAndy Fiddaman 						PUTCHR(c);
959*b30d1939SAndy Fiddaman 						bp = ip;
960*b30d1939SAndy Fiddaman 						goto fsm_get;
961*b30d1939SAndy Fiddaman 					}
962*b30d1939SAndy Fiddaman 					error(m, "%s in string", pptokchr(c));
963*b30d1939SAndy Fiddaman 					c = '\n';
964*b30d1939SAndy Fiddaman 					break;
965*b30d1939SAndy Fiddaman 				case '\'':
966*b30d1939SAndy Fiddaman 					if (!(st & DIRECTIVE) || !(pp.mode & (HOSTED|RELAX)))
967*b30d1939SAndy Fiddaman 						error(m, "%s in character constant", pptokchr(c));
968*b30d1939SAndy Fiddaman 					break;
969*b30d1939SAndy Fiddaman 				case '>':
970*b30d1939SAndy Fiddaman 					error(m, "%s in header constant", pptokchr(c));
971*b30d1939SAndy Fiddaman 					break;
972*b30d1939SAndy Fiddaman 				default:
973*b30d1939SAndy Fiddaman 					error(m, "%s in %c quote", pptokchr(c), quot);
974*b30d1939SAndy Fiddaman 					break;
975*b30d1939SAndy Fiddaman 				}
976*b30d1939SAndy Fiddaman #if !CPP
977*b30d1939SAndy Fiddaman 				if (!DOSTRIP())
978*b30d1939SAndy Fiddaman #endif
979*b30d1939SAndy Fiddaman 				PUTCHR(quot);
980*b30d1939SAndy Fiddaman 			}
981*b30d1939SAndy Fiddaman 			if (c == '\n')
982*b30d1939SAndy Fiddaman 			{
983*b30d1939SAndy Fiddaman 				UNGETCHR(c);
984*b30d1939SAndy Fiddaman 				c = quot;
985*b30d1939SAndy Fiddaman 			}
986*b30d1939SAndy Fiddaman 		}
987*b30d1939SAndy Fiddaman 		else if (st & (SQUOTE|QUOTE))
988*b30d1939SAndy Fiddaman 		{
989*b30d1939SAndy Fiddaman 			if (!(st & ESCAPE))
990*b30d1939SAndy Fiddaman 			{
991*b30d1939SAndy Fiddaman 				st |= ESCAPE;
992*b30d1939SAndy Fiddaman 				quotquot = c;
993*b30d1939SAndy Fiddaman 			}
994*b30d1939SAndy Fiddaman 			else if (c == quotquot) st &= ~ESCAPE;
995*b30d1939SAndy Fiddaman 			PUTCHR('\\');
996*b30d1939SAndy Fiddaman 			PUTCHR(c);
997*b30d1939SAndy Fiddaman 			bp = ip;
998*b30d1939SAndy Fiddaman 			goto fsm_get;
999*b30d1939SAndy Fiddaman 		}
1000*b30d1939SAndy Fiddaman #if CPP
1001*b30d1939SAndy Fiddaman 		else PUTCHR(c);
1002*b30d1939SAndy Fiddaman #else
1003*b30d1939SAndy Fiddaman 		else if (!DOSTRIP()) PUTCHR(c);
1004*b30d1939SAndy Fiddaman #endif
1005*b30d1939SAndy Fiddaman #if CATSTRINGS
1006*b30d1939SAndy Fiddaman #if CPP
1007*b30d1939SAndy Fiddaman 		if (c == '"' && !(st & (COLLECTING|NOTEXT|PASSTHROUGH|SKIPCONTROL)) && (pp.mode & CATLITERAL))
1008*b30d1939SAndy Fiddaman #else
1009*b30d1939SAndy Fiddaman 		if (c == '"' && pp.level == 1 && !(st & (COLLECTING|JOINING|NOTEXT|SKIPCONTROL)) && (pp.mode & CATLITERAL))
1010*b30d1939SAndy Fiddaman #endif
1011*b30d1939SAndy Fiddaman 		{
1012*b30d1939SAndy Fiddaman 			char*	pptoken;
1013*b30d1939SAndy Fiddaman 			long	ppstate;
1014*b30d1939SAndy Fiddaman 
1015*b30d1939SAndy Fiddaman 			pptoken = pp.token;
1016*b30d1939SAndy Fiddaman 			pp.token = pp.catbuf;
1017*b30d1939SAndy Fiddaman 			*pp.token++ = 0;
1018*b30d1939SAndy Fiddaman 			ppstate = (st & STRIP);
1019*b30d1939SAndy Fiddaman 			if (DOSTRIP())
1020*b30d1939SAndy Fiddaman 				ppstate |= ADD|QUOTE;
1021*b30d1939SAndy Fiddaman 			st |= JOINING;
1022*b30d1939SAndy Fiddaman 			st &= ~(NEWLINE|STRIP);
1023*b30d1939SAndy Fiddaman 
1024*b30d1939SAndy Fiddaman 			/*
1025*b30d1939SAndy Fiddaman 			 * revert to the top level since string
1026*b30d1939SAndy Fiddaman 			 * concatenation crosses file boundaries
1027*b30d1939SAndy Fiddaman 			 * (allowing intervening directives)
1028*b30d1939SAndy Fiddaman 			 */
1029*b30d1939SAndy Fiddaman 
1030*b30d1939SAndy Fiddaman 			pp.level = 0;
1031*b30d1939SAndy Fiddaman 			SYNCIN();
1032*b30d1939SAndy Fiddaman 			m = n = 0;
1033*b30d1939SAndy Fiddaman 			for (;;)
1034*b30d1939SAndy Fiddaman 			{
1035*b30d1939SAndy Fiddaman 				switch (c = pplex())
1036*b30d1939SAndy Fiddaman 				{
1037*b30d1939SAndy Fiddaman 				case '\n':
1038*b30d1939SAndy Fiddaman 					m++;
1039*b30d1939SAndy Fiddaman 					continue;
1040*b30d1939SAndy Fiddaman 				case ' ':
1041*b30d1939SAndy Fiddaman 					*pp.catbuf = ' ';
1042*b30d1939SAndy Fiddaman 					continue;
1043*b30d1939SAndy Fiddaman 				case T_WSTRING:
1044*b30d1939SAndy Fiddaman #if !CPP
1045*b30d1939SAndy Fiddaman 					qual = N_WIDE;
1046*b30d1939SAndy Fiddaman #endif
1047*b30d1939SAndy Fiddaman 					if (ppstate & ADD)
1048*b30d1939SAndy Fiddaman 						ppstate &= ~ADD;
1049*b30d1939SAndy Fiddaman 					else if (m == n || !(st & SPACEOUT))
1050*b30d1939SAndy Fiddaman 						op--;
1051*b30d1939SAndy Fiddaman 					else
1052*b30d1939SAndy Fiddaman 					{
1053*b30d1939SAndy Fiddaman 						n = m;
1054*b30d1939SAndy Fiddaman 						*(op - 1) = '\\';
1055*b30d1939SAndy Fiddaman 						*op++ = '\n';
1056*b30d1939SAndy Fiddaman 					}
1057*b30d1939SAndy Fiddaman 					STRCOPY(op, pp.token + 2 + (*pp.token == ' '), s);
1058*b30d1939SAndy Fiddaman 					continue;
1059*b30d1939SAndy Fiddaman 				case T_STRING:
1060*b30d1939SAndy Fiddaman 					if (ppstate & ADD)
1061*b30d1939SAndy Fiddaman 						ppstate &= ~ADD;
1062*b30d1939SAndy Fiddaman 					else if (m == n || !(st & SPACEOUT))
1063*b30d1939SAndy Fiddaman 						op--;
1064*b30d1939SAndy Fiddaman 					else
1065*b30d1939SAndy Fiddaman 					{
1066*b30d1939SAndy Fiddaman 						n = m;
1067*b30d1939SAndy Fiddaman 						*(op - 1) = '\\';
1068*b30d1939SAndy Fiddaman 						*op++ = '\n';
1069*b30d1939SAndy Fiddaman 					}
1070*b30d1939SAndy Fiddaman 					STRCOPY(op, pp.token + 1 + (*pp.token == ' '), s);
1071*b30d1939SAndy Fiddaman 					continue;
1072*b30d1939SAndy Fiddaman 				case 0:
1073*b30d1939SAndy Fiddaman 					m = error_info.line ? (error_info.line - 1) : 0;
1074*b30d1939SAndy Fiddaman 					*pp.token = 0;
1075*b30d1939SAndy Fiddaman 					/*FALLTHROUGH*/
1076*b30d1939SAndy Fiddaman 				default:
1077*b30d1939SAndy Fiddaman 					if (m)
1078*b30d1939SAndy Fiddaman 					{
1079*b30d1939SAndy Fiddaman 						if (--m)
1080*b30d1939SAndy Fiddaman 						{
1081*b30d1939SAndy Fiddaman 							pp.state |= HIDDEN|SYNCLINE;
1082*b30d1939SAndy Fiddaman 							pp.hidden += m;
1083*b30d1939SAndy Fiddaman 						}
1084*b30d1939SAndy Fiddaman #if COMPATIBLE
1085*b30d1939SAndy Fiddaman 						if ((st & COMPATIBILITY) && c == '#' && *(pp.token - 1))
1086*b30d1939SAndy Fiddaman 						{
1087*b30d1939SAndy Fiddaman 							*(pp.token + 3) = *(pp.token + 2);
1088*b30d1939SAndy Fiddaman 							*(pp.token + 2) = *(pp.token + 1);
1089*b30d1939SAndy Fiddaman 							*(pp.token + 1) = *pp.token;
1090*b30d1939SAndy Fiddaman 							*pp.token = *(pp.token - 1);
1091*b30d1939SAndy Fiddaman 						}
1092*b30d1939SAndy Fiddaman 						error_info.line--;
1093*b30d1939SAndy Fiddaman 						*--pp.token = '\n';
1094*b30d1939SAndy Fiddaman #endif
1095*b30d1939SAndy Fiddaman 					}
1096*b30d1939SAndy Fiddaman 					else if (*(pp.token - 1))
1097*b30d1939SAndy Fiddaman 						pp.token--;
1098*b30d1939SAndy Fiddaman 					if (ppisidig(*pp.token))
1099*b30d1939SAndy Fiddaman 						*op++ = ' ';
1100*b30d1939SAndy Fiddaman 					if (pp.in->type == IN_MACRO && (s = strchr(pp.token, MARK)) && !*(s + 1))
1101*b30d1939SAndy Fiddaman 					{
1102*b30d1939SAndy Fiddaman 						*(s + 1) = MARK;
1103*b30d1939SAndy Fiddaman 						*(s + 2) = 0;
1104*b30d1939SAndy Fiddaman 					}
1105*b30d1939SAndy Fiddaman 					PUSH_STRING(pp.token);
1106*b30d1939SAndy Fiddaman 					pp.state &= ~(JOINING|NEWLINE);
1107*b30d1939SAndy Fiddaman 					pp.state |= ppstate & ~(ADD|QUOTE);
1108*b30d1939SAndy Fiddaman 					if ((ppstate & (ADD|QUOTE)) == QUOTE)
1109*b30d1939SAndy Fiddaman 						op--;
1110*b30d1939SAndy Fiddaman 					break;
1111*b30d1939SAndy Fiddaman 				}
1112*b30d1939SAndy Fiddaman 				break;
1113*b30d1939SAndy Fiddaman 			}
1114*b30d1939SAndy Fiddaman 			pp.token = pptoken;
1115*b30d1939SAndy Fiddaman 			CACHEIN();
1116*b30d1939SAndy Fiddaman 			pp.level = 1;
1117*b30d1939SAndy Fiddaman #if !CPP
1118*b30d1939SAndy Fiddaman 			c = T_STRING | qual;
1119*b30d1939SAndy Fiddaman 			break;
1120*b30d1939SAndy Fiddaman #endif
1121*b30d1939SAndy Fiddaman 		}
1122*b30d1939SAndy Fiddaman #endif
1123*b30d1939SAndy Fiddaman #if CPP
1124*b30d1939SAndy Fiddaman 		if (n && !(st & (PASSTHROUGH|SKIPCONTROL|NOTEXT)) && c == '\'' && (op - tp) <= 2 && !(pp.mode & (HOSTED|RELAX)))
1125*b30d1939SAndy Fiddaman 			error(1, "empty character constant");
1126*b30d1939SAndy Fiddaman 		if (pp.option & PRESERVE)
1127*b30d1939SAndy Fiddaman 			st &= ~ESCAPE;
1128*b30d1939SAndy Fiddaman 		else
1129*b30d1939SAndy Fiddaman 			st &= ~(ESCAPE|NEWLINE);
1130*b30d1939SAndy Fiddaman 		pp.in->flags |= IN_tokens;
1131*b30d1939SAndy Fiddaman 		count(token);
1132*b30d1939SAndy Fiddaman 		goto fsm_start;
1133*b30d1939SAndy Fiddaman #else
1134*b30d1939SAndy Fiddaman 		st &= ~ESCAPE;
1135*b30d1939SAndy Fiddaman 		switch (quot)
1136*b30d1939SAndy Fiddaman 		{
1137*b30d1939SAndy Fiddaman 		case '\'':
1138*b30d1939SAndy Fiddaman 			if (n && !(st & NOTEXT) && (op - tp) <= (DOSTRIP() ? 0 : 2) && !(pp.mode & (HOSTED|RELAX)))
1139*b30d1939SAndy Fiddaman 				error(1, "empty character constant");
1140*b30d1939SAndy Fiddaman 			c = T_CHARCONST | qual;
1141*b30d1939SAndy Fiddaman 			break;
1142*b30d1939SAndy Fiddaman 		case '>':
1143*b30d1939SAndy Fiddaman 			c = T_HEADER;
1144*b30d1939SAndy Fiddaman 			break;
1145*b30d1939SAndy Fiddaman 		default:
1146*b30d1939SAndy Fiddaman 			if (c == quot)
1147*b30d1939SAndy Fiddaman 				c = T_STRING | qual;
1148*b30d1939SAndy Fiddaman 			break;
1149*b30d1939SAndy Fiddaman 		}
1150*b30d1939SAndy Fiddaman 		break;
1151*b30d1939SAndy Fiddaman #endif
1152*b30d1939SAndy Fiddaman 
1153*b30d1939SAndy Fiddaman 	case S_LITESC:
1154*b30d1939SAndy Fiddaman 		if (st & (COLLECTING|DIRECTIVE|QUOTE|SQUOTE))
1155*b30d1939SAndy Fiddaman 		{
1156*b30d1939SAndy Fiddaman 			if (st & ESCAPE)
1157*b30d1939SAndy Fiddaman 			{
1158*b30d1939SAndy Fiddaman 				PUTCHR('\\');
1159*b30d1939SAndy Fiddaman 				if (c == quot) PUTCHR('\\');
1160*b30d1939SAndy Fiddaman 			}
1161*b30d1939SAndy Fiddaman 			PUTCHR(c);
1162*b30d1939SAndy Fiddaman 		}
1163*b30d1939SAndy Fiddaman #if CPP
1164*b30d1939SAndy Fiddaman 		else if (st & PASSTHROUGH) PUTCHR(c);
1165*b30d1939SAndy Fiddaman #endif
1166*b30d1939SAndy Fiddaman 		else if (pp.option & PRESERVE) PUTCHR(c);
1167*b30d1939SAndy Fiddaman 		else switch (c)
1168*b30d1939SAndy Fiddaman 		{
1169*b30d1939SAndy Fiddaman 		case 'b':
1170*b30d1939SAndy Fiddaman 		case 'f':
1171*b30d1939SAndy Fiddaman 		case 'n':
1172*b30d1939SAndy Fiddaman 		case 'r':
1173*b30d1939SAndy Fiddaman 		case 't':
1174*b30d1939SAndy Fiddaman 		case '\\':
1175*b30d1939SAndy Fiddaman 		case '\'':
1176*b30d1939SAndy Fiddaman 		case '"':
1177*b30d1939SAndy Fiddaman 		case '?':
1178*b30d1939SAndy Fiddaman 			PUTCHR(c);
1179*b30d1939SAndy Fiddaman 			break;
1180*b30d1939SAndy Fiddaman #if COMPATIBLE
1181*b30d1939SAndy Fiddaman 		case '8':
1182*b30d1939SAndy Fiddaman 		case '9':
1183*b30d1939SAndy Fiddaman 			if (!(st & COMPATIBILITY)) goto unknown;
1184*b30d1939SAndy Fiddaman 			if (st & STRICT) error(1, "%c: invalid character in octal character escape", c);
1185*b30d1939SAndy Fiddaman #endif
1186*b30d1939SAndy Fiddaman 			/*FALLTHROUGH*/
1187*b30d1939SAndy Fiddaman 		case '0':
1188*b30d1939SAndy Fiddaman 		case '1':
1189*b30d1939SAndy Fiddaman 		case '2':
1190*b30d1939SAndy Fiddaman 		case '3':
1191*b30d1939SAndy Fiddaman 		case '4':
1192*b30d1939SAndy Fiddaman 		case '5':
1193*b30d1939SAndy Fiddaman 		case '6':
1194*b30d1939SAndy Fiddaman 		case '7':
1195*b30d1939SAndy Fiddaman 			n = c - '0';
1196*b30d1939SAndy Fiddaman 			for (m = 0; m < 2; m++)
1197*b30d1939SAndy Fiddaman 			{
1198*b30d1939SAndy Fiddaman 				GET(c, c, tp, xp);
1199*b30d1939SAndy Fiddaman 				switch (c)
1200*b30d1939SAndy Fiddaman 				{
1201*b30d1939SAndy Fiddaman #if COMPATIBLE
1202*b30d1939SAndy Fiddaman 				case '8':
1203*b30d1939SAndy Fiddaman 				case '9':
1204*b30d1939SAndy Fiddaman 					if (!(st & COMPATIBILITY))
1205*b30d1939SAndy Fiddaman 					{
1206*b30d1939SAndy Fiddaman 						UNGETCHR(c);
1207*b30d1939SAndy Fiddaman 						break;
1208*b30d1939SAndy Fiddaman 					}
1209*b30d1939SAndy Fiddaman 					if (st & STRICT) error(1, "%c: invalid character in octal character escape", c);
1210*b30d1939SAndy Fiddaman #endif
1211*b30d1939SAndy Fiddaman 					/*FALLTHROUGH*/
1212*b30d1939SAndy Fiddaman 				case '0':
1213*b30d1939SAndy Fiddaman 				case '1':
1214*b30d1939SAndy Fiddaman 				case '2':
1215*b30d1939SAndy Fiddaman 				case '3':
1216*b30d1939SAndy Fiddaman 				case '4':
1217*b30d1939SAndy Fiddaman 				case '5':
1218*b30d1939SAndy Fiddaman 				case '6':
1219*b30d1939SAndy Fiddaman 				case '7':
1220*b30d1939SAndy Fiddaman 					n = (n << 3) + c - '0';
1221*b30d1939SAndy Fiddaman 					continue;
1222*b30d1939SAndy Fiddaman 				default:
1223*b30d1939SAndy Fiddaman 					UNGETCHR(c);
1224*b30d1939SAndy Fiddaman 					break;
1225*b30d1939SAndy Fiddaman 				}
1226*b30d1939SAndy Fiddaman 				break;
1227*b30d1939SAndy Fiddaman 			}
1228*b30d1939SAndy Fiddaman 			if (n & ~0777) error(1, "octal character constant too large");
1229*b30d1939SAndy Fiddaman 			goto octal;
1230*b30d1939SAndy Fiddaman 		case 'a':
1231*b30d1939SAndy Fiddaman 			if (pp.option & MODERN)
1232*b30d1939SAndy Fiddaman 			{
1233*b30d1939SAndy Fiddaman 				PUTCHR(c);
1234*b30d1939SAndy Fiddaman 				break;
1235*b30d1939SAndy Fiddaman 			}
1236*b30d1939SAndy Fiddaman #if COMPATIBLE
1237*b30d1939SAndy Fiddaman 			if (st & COMPATIBILITY) goto unknown;
1238*b30d1939SAndy Fiddaman #endif
1239*b30d1939SAndy Fiddaman 			n = CC_bel;
1240*b30d1939SAndy Fiddaman 			goto octal;
1241*b30d1939SAndy Fiddaman 		case 'v':
1242*b30d1939SAndy Fiddaman 			if (pp.option & MODERN)
1243*b30d1939SAndy Fiddaman 			{
1244*b30d1939SAndy Fiddaman 				PUTCHR(c);
1245*b30d1939SAndy Fiddaman 				break;
1246*b30d1939SAndy Fiddaman 			}
1247*b30d1939SAndy Fiddaman 			n = CC_vt;
1248*b30d1939SAndy Fiddaman 			goto octal;
1249*b30d1939SAndy Fiddaman 		case 'E':
1250*b30d1939SAndy Fiddaman 			if (st & (COMPATIBILITY|STRICT)) goto unknown;
1251*b30d1939SAndy Fiddaman 			n = CC_esc;
1252*b30d1939SAndy Fiddaman 			goto octal;
1253*b30d1939SAndy Fiddaman 		case 'x':
1254*b30d1939SAndy Fiddaman #if COMPATIBLE
1255*b30d1939SAndy Fiddaman 			if (st & COMPATIBILITY) goto unknown;
1256*b30d1939SAndy Fiddaman #endif
1257*b30d1939SAndy Fiddaman 			n = 0;
1258*b30d1939SAndy Fiddaman 			for (m = 0; m < 3; m++)
1259*b30d1939SAndy Fiddaman 			{
1260*b30d1939SAndy Fiddaman 				GET(c, c, tp, xp);
1261*b30d1939SAndy Fiddaman 				switch (c)
1262*b30d1939SAndy Fiddaman 				{
1263*b30d1939SAndy Fiddaman 				case '0':
1264*b30d1939SAndy Fiddaman 				case '1':
1265*b30d1939SAndy Fiddaman 				case '2':
1266*b30d1939SAndy Fiddaman 				case '3':
1267*b30d1939SAndy Fiddaman 				case '4':
1268*b30d1939SAndy Fiddaman 				case '5':
1269*b30d1939SAndy Fiddaman 				case '6':
1270*b30d1939SAndy Fiddaman 				case '7':
1271*b30d1939SAndy Fiddaman 				case '8':
1272*b30d1939SAndy Fiddaman 				case '9':
1273*b30d1939SAndy Fiddaman 					n = (n << 4) + c - '0';
1274*b30d1939SAndy Fiddaman 					continue;
1275*b30d1939SAndy Fiddaman 				case 'a':
1276*b30d1939SAndy Fiddaman 				case 'b':
1277*b30d1939SAndy Fiddaman 				case 'c':
1278*b30d1939SAndy Fiddaman 				case 'd':
1279*b30d1939SAndy Fiddaman 				case 'e':
1280*b30d1939SAndy Fiddaman 				case 'f':
1281*b30d1939SAndy Fiddaman 					n = (n << 4) + c - 'a' + 10;
1282*b30d1939SAndy Fiddaman 					continue;
1283*b30d1939SAndy Fiddaman 				case 'A':
1284*b30d1939SAndy Fiddaman 				case 'B':
1285*b30d1939SAndy Fiddaman 				case 'C':
1286*b30d1939SAndy Fiddaman 				case 'D':
1287*b30d1939SAndy Fiddaman 				case 'E':
1288*b30d1939SAndy Fiddaman 				case 'F':
1289*b30d1939SAndy Fiddaman 					n = (n << 4) + c - 'A' + 10;
1290*b30d1939SAndy Fiddaman 					continue;
1291*b30d1939SAndy Fiddaman 				default:
1292*b30d1939SAndy Fiddaman 					if (!m) error(1, "\\x%c: invalid character in hexadecimal character constant", c);
1293*b30d1939SAndy Fiddaman 					UNGETCHR(c);
1294*b30d1939SAndy Fiddaman 					break;
1295*b30d1939SAndy Fiddaman 				}
1296*b30d1939SAndy Fiddaman 				break;
1297*b30d1939SAndy Fiddaman 			}
1298*b30d1939SAndy Fiddaman 			if (n & ~0777) error(1, "hexadecimal character constant too large");
1299*b30d1939SAndy Fiddaman 		octal:
1300*b30d1939SAndy Fiddaman 			PUTCHR(((n >> 6) & 07) + '0');
1301*b30d1939SAndy Fiddaman 			PUTCHR(((n >> 3) & 07) + '0');
1302*b30d1939SAndy Fiddaman 			PUTCHR((n & 07) + '0');
1303*b30d1939SAndy Fiddaman 			break;
1304*b30d1939SAndy Fiddaman 		default:
1305*b30d1939SAndy Fiddaman 		unknown:
1306*b30d1939SAndy Fiddaman 			if (st & (STRICT|WARN)) error(1, "\\%c: non-standard character constant", c);
1307*b30d1939SAndy Fiddaman 			PUTCHR(c);
1308*b30d1939SAndy Fiddaman 			break;
1309*b30d1939SAndy Fiddaman 		}
1310*b30d1939SAndy Fiddaman 		state = LIT1;
1311*b30d1939SAndy Fiddaman 		goto fsm_begin;
1312*b30d1939SAndy Fiddaman 
1313*b30d1939SAndy Fiddaman 	case S_MACRO:
1314*b30d1939SAndy Fiddaman 		BACKIN();
1315*b30d1939SAndy Fiddaman #if CPP
1316*b30d1939SAndy Fiddaman 		if (st & (DISABLE|SKIPCONTROL|SKIPMACRO))
1317*b30d1939SAndy Fiddaman 		{
1318*b30d1939SAndy Fiddaman 			if (st & SKIPMACRO)
1319*b30d1939SAndy Fiddaman 				pp.mode |= MARKMACRO;
1320*b30d1939SAndy Fiddaman 			st &= ~(NEWLINE|SKIPMACRO);
1321*b30d1939SAndy Fiddaman 			pp.in->flags |= IN_tokens;
1322*b30d1939SAndy Fiddaman 			count(token);
1323*b30d1939SAndy Fiddaman 			goto fsm_start;
1324*b30d1939SAndy Fiddaman 		}
1325*b30d1939SAndy Fiddaman 		count(candidate);
1326*b30d1939SAndy Fiddaman 		SETCHR(0);
1327*b30d1939SAndy Fiddaman 		switch (state = INDEX(rp))
1328*b30d1939SAndy Fiddaman 		{
1329*b30d1939SAndy Fiddaman 		case HIT0:
1330*b30d1939SAndy Fiddaman 			tp = op - 1;
1331*b30d1939SAndy Fiddaman 			break;
1332*b30d1939SAndy Fiddaman 		case HITN:
1333*b30d1939SAndy Fiddaman 			bp = tp;
1334*b30d1939SAndy Fiddaman 			tp = op - ((pp.truncate && pp.truncate < (HITN - HIT0)) ? (pp.truncate - 1) : (HITN - HIT0));
1335*b30d1939SAndy Fiddaman 			while (tp > bp && ppisidig(*(tp - 1))) tp--;
1336*b30d1939SAndy Fiddaman 			break;
1337*b30d1939SAndy Fiddaman 		default:
1338*b30d1939SAndy Fiddaman 			bp = tp;
1339*b30d1939SAndy Fiddaman 			if ((tp = op - (state - HIT0)) > bp && *(tp - 1) == 'L') tp--;
1340*b30d1939SAndy Fiddaman 			break;
1341*b30d1939SAndy Fiddaman 		}
1342*b30d1939SAndy Fiddaman 		if (sym = ppsymref(pp.symtab, tp))
1343*b30d1939SAndy Fiddaman 		{
1344*b30d1939SAndy Fiddaman 			SYNCIN();
1345*b30d1939SAndy Fiddaman 			n = ppcall(sym, 0);
1346*b30d1939SAndy Fiddaman 			CACHEIN();
1347*b30d1939SAndy Fiddaman 			if (n >= 0)
1348*b30d1939SAndy Fiddaman 			{
1349*b30d1939SAndy Fiddaman 				BACKOUT();
1350*b30d1939SAndy Fiddaman 				if (!n)
1351*b30d1939SAndy Fiddaman 				{
1352*b30d1939SAndy Fiddaman 					if (sp) op = sp;
1353*b30d1939SAndy Fiddaman 					else
1354*b30d1939SAndy Fiddaman 					{
1355*b30d1939SAndy Fiddaman 						s = ip;
1356*b30d1939SAndy Fiddaman 						ip = sym->macro->value;
1357*b30d1939SAndy Fiddaman 						c = sym->macro->size;
1358*b30d1939SAndy Fiddaman 						while (c > 0)
1359*b30d1939SAndy Fiddaman 						{
1360*b30d1939SAndy Fiddaman 							if (op + c < xp + PPBUFSIZ) n = c;
1361*b30d1939SAndy Fiddaman 							else n = xp + PPBUFSIZ - op;
1362*b30d1939SAndy Fiddaman 							MEMCPY(op, ip, n);
1363*b30d1939SAndy Fiddaman 							c -= n;
1364*b30d1939SAndy Fiddaman 							PPCHECKOUT();
1365*b30d1939SAndy Fiddaman 						}
1366*b30d1939SAndy Fiddaman 						ip = s;
1367*b30d1939SAndy Fiddaman 					}
1368*b30d1939SAndy Fiddaman 				}
1369*b30d1939SAndy Fiddaman 				else if ((sym->flags & SYM_MULTILINE) && pp.linesync)
1370*b30d1939SAndy Fiddaman 				{
1371*b30d1939SAndy Fiddaman 					SYNCOUT();
1372*b30d1939SAndy Fiddaman 					if (!(state & NEWLINE))
1373*b30d1939SAndy Fiddaman 						ppputchar('\n');
1374*b30d1939SAndy Fiddaman 					(*pp.linesync)(error_info.line, error_info.file);
1375*b30d1939SAndy Fiddaman 					CACHEOUT();
1376*b30d1939SAndy Fiddaman 				}
1377*b30d1939SAndy Fiddaman 			}
1378*b30d1939SAndy Fiddaman 		}
1379*b30d1939SAndy Fiddaman 		pp.in->flags |= IN_tokens;
1380*b30d1939SAndy Fiddaman 		goto fsm_start;
1381*b30d1939SAndy Fiddaman #else
1382*b30d1939SAndy Fiddaman 		if (st & (COLLECTING|DEFINITION|DISABLE|SKIPCONTROL|SKIPMACRO))
1383*b30d1939SAndy Fiddaman 		{
1384*b30d1939SAndy Fiddaman 			if (st & SKIPMACRO)
1385*b30d1939SAndy Fiddaman 				pp.mode |= MARKMACRO;
1386*b30d1939SAndy Fiddaman 			st &= ~(NEWLINE|NOEXPAND|SKIPMACRO);
1387*b30d1939SAndy Fiddaman 			c = T_ID;
1388*b30d1939SAndy Fiddaman 			if (pp.level == 1)
1389*b30d1939SAndy Fiddaman 			{
1390*b30d1939SAndy Fiddaman 				pp.in->flags |= IN_tokens;
1391*b30d1939SAndy Fiddaman 				if (st & NOTEXT)
1392*b30d1939SAndy Fiddaman 				{
1393*b30d1939SAndy Fiddaman 					BACKOUT();
1394*b30d1939SAndy Fiddaman 					goto fsm_top;
1395*b30d1939SAndy Fiddaman 				}
1396*b30d1939SAndy Fiddaman 				if (st & COMPILE)
1397*b30d1939SAndy Fiddaman 				{
1398*b30d1939SAndy Fiddaman 					SETCHR(0);
1399*b30d1939SAndy Fiddaman 					if (pp.truncate && (op - tp) > pp.truncate) tp[pp.truncate] = 0;
1400*b30d1939SAndy Fiddaman 					sym = (pp.option & NOHASH) ? ppsymref(pp.symtab, tp) : ppsymset(pp.symtab, tp);
1401*b30d1939SAndy Fiddaman  fsm_noise:
1402*b30d1939SAndy Fiddaman 					if (pp.symbol = sym)
1403*b30d1939SAndy Fiddaman 					{
1404*b30d1939SAndy Fiddaman 						if ((sym->flags & SYM_KEYWORD) && (!pp.truncate || (op - tp) <= pp.truncate || (tp[pp.truncate] = '_', tp[pp.truncate + 1] = 0, pp.symbol = sym = (pp.option & NOHASH) ? ppsymref(pp.symtab, tp) : ppsymset(pp.symtab, tp), 0)))
1405*b30d1939SAndy Fiddaman 						{
1406*b30d1939SAndy Fiddaman 							c = ((struct ppsymkey*)sym)->lex;
1407*b30d1939SAndy Fiddaman 							/*UNDENT*/
1408*b30d1939SAndy Fiddaman 
1409*b30d1939SAndy Fiddaman #define ADVANCE()	do{if(pp.toknxt<op)pp.token=pp.toknxt;}while(0)
1410*b30d1939SAndy Fiddaman 
1411*b30d1939SAndy Fiddaman #define NOISE_BRACE		01
1412*b30d1939SAndy Fiddaman #define NOISE_NOSPACEOUT	02
1413*b30d1939SAndy Fiddaman #define NOISE_PAREN		04
1414*b30d1939SAndy Fiddaman 
1415*b30d1939SAndy Fiddaman 	if ((pp.option & NOISE) && ppisnoise(c))
1416*b30d1939SAndy Fiddaman 	{
1417*b30d1939SAndy Fiddaman 		if (c != T_NOISE)
1418*b30d1939SAndy Fiddaman 		{
1419*b30d1939SAndy Fiddaman 			int		p;
1420*b30d1939SAndy Fiddaman 			int		f;
1421*b30d1939SAndy Fiddaman 			char*		pptoken;
1422*b30d1939SAndy Fiddaman 			PPCOMMENT	ppcomment;
1423*b30d1939SAndy Fiddaman 
1424*b30d1939SAndy Fiddaman 			SYNCIN();
1425*b30d1939SAndy Fiddaman 			pp.toknxt = op;
1426*b30d1939SAndy Fiddaman 			f = 0;
1427*b30d1939SAndy Fiddaman 			if (!(pp.state & SPACEOUT))
1428*b30d1939SAndy Fiddaman 			{
1429*b30d1939SAndy Fiddaman 				pp.state |= SPACEOUT;
1430*b30d1939SAndy Fiddaman 				f |= NOISE_NOSPACEOUT;
1431*b30d1939SAndy Fiddaman 			}
1432*b30d1939SAndy Fiddaman 			ppcomment = pp.comment;
1433*b30d1939SAndy Fiddaman 			pp.comment = 0;
1434*b30d1939SAndy Fiddaman 			op = (pptoken = tp) + MAXTOKEN;
1435*b30d1939SAndy Fiddaman 			switch (c)
1436*b30d1939SAndy Fiddaman 			{
1437*b30d1939SAndy Fiddaman 			case T_X_GROUP:
1438*b30d1939SAndy Fiddaman 				m = p = 0;
1439*b30d1939SAndy Fiddaman 				quot = 1;
1440*b30d1939SAndy Fiddaman 				for (;;)
1441*b30d1939SAndy Fiddaman 				{
1442*b30d1939SAndy Fiddaman 					ADVANCE();
1443*b30d1939SAndy Fiddaman 					switch (c = pplex())
1444*b30d1939SAndy Fiddaman 					{
1445*b30d1939SAndy Fiddaman 					case '(':
1446*b30d1939SAndy Fiddaman 					case '{':
1447*b30d1939SAndy Fiddaman 						if (!p)
1448*b30d1939SAndy Fiddaman 						{
1449*b30d1939SAndy Fiddaman 							if (c == '(')
1450*b30d1939SAndy Fiddaman 							{
1451*b30d1939SAndy Fiddaman 								if (f & NOISE_PAREN)
1452*b30d1939SAndy Fiddaman 								{
1453*b30d1939SAndy Fiddaman 									ungetchr(c);
1454*b30d1939SAndy Fiddaman 									*--pp.toknxt = 0;
1455*b30d1939SAndy Fiddaman 									break;
1456*b30d1939SAndy Fiddaman 								}
1457*b30d1939SAndy Fiddaman 								f |= NOISE_PAREN;
1458*b30d1939SAndy Fiddaman 								p = ')';
1459*b30d1939SAndy Fiddaman 							}
1460*b30d1939SAndy Fiddaman 							else
1461*b30d1939SAndy Fiddaman 							{
1462*b30d1939SAndy Fiddaman 								f |= NOISE_BRACE|NOISE_PAREN;
1463*b30d1939SAndy Fiddaman 								p = '}';
1464*b30d1939SAndy Fiddaman 							}
1465*b30d1939SAndy Fiddaman 							n = 1;
1466*b30d1939SAndy Fiddaman 							m = c;
1467*b30d1939SAndy Fiddaman 						}
1468*b30d1939SAndy Fiddaman 						else if (c == m) n++;
1469*b30d1939SAndy Fiddaman 						quot = 0;
1470*b30d1939SAndy Fiddaman 						continue;
1471*b30d1939SAndy Fiddaman 					case ')':
1472*b30d1939SAndy Fiddaman 					case '}':
1473*b30d1939SAndy Fiddaman 						if (c == p && --n <= 0)
1474*b30d1939SAndy Fiddaman 						{
1475*b30d1939SAndy Fiddaman 							if (c == '}') break;
1476*b30d1939SAndy Fiddaman 							m = '\n';
1477*b30d1939SAndy Fiddaman 							p = 0;
1478*b30d1939SAndy Fiddaman 						}
1479*b30d1939SAndy Fiddaman 						quot = 0;
1480*b30d1939SAndy Fiddaman 						continue;
1481*b30d1939SAndy Fiddaman 					case ' ':
1482*b30d1939SAndy Fiddaman 						continue;
1483*b30d1939SAndy Fiddaman 					case '\n':
1484*b30d1939SAndy Fiddaman 						error_info.line++;
1485*b30d1939SAndy Fiddaman 						if (!m) m = '\n';
1486*b30d1939SAndy Fiddaman 						continue;
1487*b30d1939SAndy Fiddaman 					case 0:
1488*b30d1939SAndy Fiddaman 						break;
1489*b30d1939SAndy Fiddaman 					case T_ID:
1490*b30d1939SAndy Fiddaman 						if (quot) continue;
1491*b30d1939SAndy Fiddaman 						/*FALLTHROUGH*/
1492*b30d1939SAndy Fiddaman 					default:
1493*b30d1939SAndy Fiddaman 						if (m == '\n')
1494*b30d1939SAndy Fiddaman 						{
1495*b30d1939SAndy Fiddaman 							/*
1496*b30d1939SAndy Fiddaman 							 * NOTE: token expanded again
1497*b30d1939SAndy Fiddaman 							 */
1498*b30d1939SAndy Fiddaman 
1499*b30d1939SAndy Fiddaman 							s = pp.toknxt;
1500*b30d1939SAndy Fiddaman 							while (s > pp.token) ungetchr(*--s);
1501*b30d1939SAndy Fiddaman 							*(pp.toknxt = s) = 0;
1502*b30d1939SAndy Fiddaman 							break;
1503*b30d1939SAndy Fiddaman 						}
1504*b30d1939SAndy Fiddaman 						continue;
1505*b30d1939SAndy Fiddaman 					}
1506*b30d1939SAndy Fiddaman 					break;
1507*b30d1939SAndy Fiddaman 				}
1508*b30d1939SAndy Fiddaman 				break;
1509*b30d1939SAndy Fiddaman 			case T_X_LINE:
1510*b30d1939SAndy Fiddaman 				for (;;)
1511*b30d1939SAndy Fiddaman 				{
1512*b30d1939SAndy Fiddaman 					ADVANCE();
1513*b30d1939SAndy Fiddaman 					switch (pplex())
1514*b30d1939SAndy Fiddaman 					{
1515*b30d1939SAndy Fiddaman 					case 0:
1516*b30d1939SAndy Fiddaman 						break;
1517*b30d1939SAndy Fiddaman 					case '\n':
1518*b30d1939SAndy Fiddaman 						error_info.line++;
1519*b30d1939SAndy Fiddaman 						break;
1520*b30d1939SAndy Fiddaman 					default:
1521*b30d1939SAndy Fiddaman 						continue;
1522*b30d1939SAndy Fiddaman 					}
1523*b30d1939SAndy Fiddaman 					break;
1524*b30d1939SAndy Fiddaman 				}
1525*b30d1939SAndy Fiddaman 				break;
1526*b30d1939SAndy Fiddaman 			case T_X_STATEMENT:
1527*b30d1939SAndy Fiddaman 				for (;;)
1528*b30d1939SAndy Fiddaman 				{
1529*b30d1939SAndy Fiddaman 					ADVANCE();
1530*b30d1939SAndy Fiddaman 					switch (pplex())
1531*b30d1939SAndy Fiddaman 					{
1532*b30d1939SAndy Fiddaman 					case 0:
1533*b30d1939SAndy Fiddaman 						break;
1534*b30d1939SAndy Fiddaman 					case ';':
1535*b30d1939SAndy Fiddaman 						ungetchr(';');
1536*b30d1939SAndy Fiddaman 						*(pp.toknxt = pp.token) = 0;
1537*b30d1939SAndy Fiddaman 						break;
1538*b30d1939SAndy Fiddaman 					default:
1539*b30d1939SAndy Fiddaman 						continue;
1540*b30d1939SAndy Fiddaman 					}
1541*b30d1939SAndy Fiddaman 					break;
1542*b30d1939SAndy Fiddaman 				}
1543*b30d1939SAndy Fiddaman 				break;
1544*b30d1939SAndy Fiddaman 			}
1545*b30d1939SAndy Fiddaman 			pp.comment = ppcomment;
1546*b30d1939SAndy Fiddaman 			if (f & NOISE_NOSPACEOUT)
1547*b30d1939SAndy Fiddaman 				pp.state &= ~SPACEOUT;
1548*b30d1939SAndy Fiddaman 			CACHEIN();
1549*b30d1939SAndy Fiddaman 			tp = pptoken;
1550*b30d1939SAndy Fiddaman 			op = pp.toknxt;
1551*b30d1939SAndy Fiddaman 			c = T_NOISES;
1552*b30d1939SAndy Fiddaman 		}
1553*b30d1939SAndy Fiddaman 		if (pp.option & NOISEFILTER)
1554*b30d1939SAndy Fiddaman 		{
1555*b30d1939SAndy Fiddaman 			BACKOUT();
1556*b30d1939SAndy Fiddaman 			goto fsm_top;
1557*b30d1939SAndy Fiddaman 		}
1558*b30d1939SAndy Fiddaman 	}
1559*b30d1939SAndy Fiddaman 
1560*b30d1939SAndy Fiddaman 							/*INDENT*/
1561*b30d1939SAndy Fiddaman 						}
1562*b30d1939SAndy Fiddaman 						else if ((pp.option & NOISE) && c == T_ID && strneq(tp, "__builtin_", 10))
1563*b30d1939SAndy Fiddaman 						{
1564*b30d1939SAndy Fiddaman 							hashlook(pp.symtab, tp, HASH_DELETE, NiL);
1565*b30d1939SAndy Fiddaman 							pp.symbol = sym = (struct ppsymbol*)ppkeyset(pp.symtab, tp);
1566*b30d1939SAndy Fiddaman 							sym->flags |= SYM_KEYWORD;
1567*b30d1939SAndy Fiddaman 							c = ((struct ppsymkey*)sym)->lex = T_BUILTIN;
1568*b30d1939SAndy Fiddaman 						}
1569*b30d1939SAndy Fiddaman 					}
1570*b30d1939SAndy Fiddaman 				}
1571*b30d1939SAndy Fiddaman 				goto fsm_symbol;
1572*b30d1939SAndy Fiddaman 			}
1573*b30d1939SAndy Fiddaman 			goto fsm_check;
1574*b30d1939SAndy Fiddaman 		}
1575*b30d1939SAndy Fiddaman 		if (pp.level == 1)
1576*b30d1939SAndy Fiddaman 		{
1577*b30d1939SAndy Fiddaman 			st &= ~(NEWLINE|PASSEOF);
1578*b30d1939SAndy Fiddaman 			pp.in->flags |= IN_tokens;
1579*b30d1939SAndy Fiddaman 		}
1580*b30d1939SAndy Fiddaman 		else st &= ~PASSEOF;
1581*b30d1939SAndy Fiddaman 		count(candidate);
1582*b30d1939SAndy Fiddaman 		SETCHR(0);
1583*b30d1939SAndy Fiddaman 		if (sym = ppsymref(pp.symtab, tp))
1584*b30d1939SAndy Fiddaman 		{
1585*b30d1939SAndy Fiddaman 			SYNCIN();
1586*b30d1939SAndy Fiddaman 			c = ppcall(sym, 1);
1587*b30d1939SAndy Fiddaman 			CACHEIN();
1588*b30d1939SAndy Fiddaman 			if (c >= 0)
1589*b30d1939SAndy Fiddaman 			{
1590*b30d1939SAndy Fiddaman 				BACKOUT();
1591*b30d1939SAndy Fiddaman 				if ((sym->flags & SYM_MULTILINE) && pp.linesync)
1592*b30d1939SAndy Fiddaman 				{
1593*b30d1939SAndy Fiddaman 					SYNCOUT();
1594*b30d1939SAndy Fiddaman 					(*pp.linesync)(error_info.line, error_info.file);
1595*b30d1939SAndy Fiddaman 					CACHEOUT();
1596*b30d1939SAndy Fiddaman 				}
1597*b30d1939SAndy Fiddaman 				goto fsm_top;
1598*b30d1939SAndy Fiddaman 			}
1599*b30d1939SAndy Fiddaman 		}
1600*b30d1939SAndy Fiddaman 		c = T_ID;
1601*b30d1939SAndy Fiddaman 		if (pp.level == 1)
1602*b30d1939SAndy Fiddaman 		{
1603*b30d1939SAndy Fiddaman 			if (st & NOTEXT)
1604*b30d1939SAndy Fiddaman 			{
1605*b30d1939SAndy Fiddaman 				BACKOUT();
1606*b30d1939SAndy Fiddaman 				goto fsm_top;
1607*b30d1939SAndy Fiddaman 			}
1608*b30d1939SAndy Fiddaman 			if (st & COMPILE)
1609*b30d1939SAndy Fiddaman 			{
1610*b30d1939SAndy Fiddaman 				if (pp.truncate && (op - tp) > pp.truncate)
1611*b30d1939SAndy Fiddaman 				{
1612*b30d1939SAndy Fiddaman 					tp[pp.truncate] = 0;
1613*b30d1939SAndy Fiddaman 					sym = 0;
1614*b30d1939SAndy Fiddaman 				}
1615*b30d1939SAndy Fiddaman 				if (!sym)
1616*b30d1939SAndy Fiddaman 				{
1617*b30d1939SAndy Fiddaman 					if (!(pp.option & NOHASH)) sym = ppsymset(pp.symtab, tp);
1618*b30d1939SAndy Fiddaman 					else if (!(sym = ppsymref(pp.symtab, tp))) goto fsm_symbol;
1619*b30d1939SAndy Fiddaman 				}
1620*b30d1939SAndy Fiddaman 				goto fsm_noise;
1621*b30d1939SAndy Fiddaman 			}
1622*b30d1939SAndy Fiddaman 			goto fsm_symbol;
1623*b30d1939SAndy Fiddaman 		}
1624*b30d1939SAndy Fiddaman 		goto fsm_check;
1625*b30d1939SAndy Fiddaman #endif
1626*b30d1939SAndy Fiddaman 
1627*b30d1939SAndy Fiddaman 	case S_SHARP:
1628*b30d1939SAndy Fiddaman 		if (c == '(')
1629*b30d1939SAndy Fiddaman 		{
1630*b30d1939SAndy Fiddaman 			pp.in->flags |= IN_tokens;
1631*b30d1939SAndy Fiddaman 			if ((st & STRICT) && pp.in->type != IN_MACRO && pp.in->type != IN_MULTILINE)
1632*b30d1939SAndy Fiddaman 			{
1633*b30d1939SAndy Fiddaman 				if (!(pp.mode & HOSTED)) error(1, "non-standard reference to #(...)");
1634*b30d1939SAndy Fiddaman 				if (st & STRICT)
1635*b30d1939SAndy Fiddaman 				{
1636*b30d1939SAndy Fiddaman 					PUTCHR(c);
1637*b30d1939SAndy Fiddaman #if CPP
1638*b30d1939SAndy Fiddaman 					st &= ~NEWLINE;
1639*b30d1939SAndy Fiddaman 					count(token);
1640*b30d1939SAndy Fiddaman 					goto fsm_start;
1641*b30d1939SAndy Fiddaman #else
1642*b30d1939SAndy Fiddaman 					break;
1643*b30d1939SAndy Fiddaman #endif
1644*b30d1939SAndy Fiddaman 				}
1645*b30d1939SAndy Fiddaman 			}
1646*b30d1939SAndy Fiddaman 			if (st & (COLLECTING|DEFINITION|DISABLE|SKIPCONTROL))
1647*b30d1939SAndy Fiddaman 			{
1648*b30d1939SAndy Fiddaman 				PUTCHR(c);
1649*b30d1939SAndy Fiddaman #if CPP
1650*b30d1939SAndy Fiddaman 				st &= ~NEWLINE;
1651*b30d1939SAndy Fiddaman 				count(token);
1652*b30d1939SAndy Fiddaman 				goto fsm_start;
1653*b30d1939SAndy Fiddaman #else
1654*b30d1939SAndy Fiddaman 				st &= ~NOEXPAND;
1655*b30d1939SAndy Fiddaman 				break;
1656*b30d1939SAndy Fiddaman #endif
1657*b30d1939SAndy Fiddaman 			}
1658*b30d1939SAndy Fiddaman 			op--;
1659*b30d1939SAndy Fiddaman 			SYNC();
1660*b30d1939SAndy Fiddaman 			ppbuiltin();
1661*b30d1939SAndy Fiddaman 			CACHE();
1662*b30d1939SAndy Fiddaman #if CPP
1663*b30d1939SAndy Fiddaman 			count(token);
1664*b30d1939SAndy Fiddaman 			goto fsm_start;
1665*b30d1939SAndy Fiddaman #else
1666*b30d1939SAndy Fiddaman 			goto fsm_top;
1667*b30d1939SAndy Fiddaman #endif
1668*b30d1939SAndy Fiddaman 		}
1669*b30d1939SAndy Fiddaman 		BACKIN();
1670*b30d1939SAndy Fiddaman #if CPP
1671*b30d1939SAndy Fiddaman 		if (!(st & NEWLINE) || !(pp.in->type & IN_TOP))
1672*b30d1939SAndy Fiddaman 		{
1673*b30d1939SAndy Fiddaman  fsm_nondirective:
1674*b30d1939SAndy Fiddaman 			st &= ~NEWLINE;
1675*b30d1939SAndy Fiddaman 			pp.in->flags |= IN_tokens;
1676*b30d1939SAndy Fiddaman 			count(token);
1677*b30d1939SAndy Fiddaman 			goto fsm_start;
1678*b30d1939SAndy Fiddaman 		}
1679*b30d1939SAndy Fiddaman 		if (*(s = tp) != '#')
1680*b30d1939SAndy Fiddaman 		{
1681*b30d1939SAndy Fiddaman #if COMPATIBLE
1682*b30d1939SAndy Fiddaman 			if ((st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY) goto fsm_nondirective;
1683*b30d1939SAndy Fiddaman #endif
1684*b30d1939SAndy Fiddaman 			while (*s == ' ' || *s == '\t') s++;
1685*b30d1939SAndy Fiddaman 			if (*s != '#') goto fsm_nondirective;
1686*b30d1939SAndy Fiddaman 		}
1687*b30d1939SAndy Fiddaman 		BACKOUT();
1688*b30d1939SAndy Fiddaman #else
1689*b30d1939SAndy Fiddaman 		if (!(st & NEWLINE) || (st & DEFINITION) || !(pp.in->type & IN_TOP))
1690*b30d1939SAndy Fiddaman 		{
1691*b30d1939SAndy Fiddaman 			if (c == '#')
1692*b30d1939SAndy Fiddaman 			{
1693*b30d1939SAndy Fiddaman 				SKIPIN();
1694*b30d1939SAndy Fiddaman 				if (!(st & DEFINITION))
1695*b30d1939SAndy Fiddaman 					PUTCHR(c);
1696*b30d1939SAndy Fiddaman 				c = T_TOKCAT;
1697*b30d1939SAndy Fiddaman 			}
1698*b30d1939SAndy Fiddaman 			else if (pp.level == 1 && !(st & (JOINING|SPACEOUT)) && !(pp.option & PRESERVE))
1699*b30d1939SAndy Fiddaman 			{
1700*b30d1939SAndy Fiddaman 				char*		pptoken;
1701*b30d1939SAndy Fiddaman 				char*		oop;
1702*b30d1939SAndy Fiddaman 				PPCOMMENT	ppcomment;
1703*b30d1939SAndy Fiddaman 
1704*b30d1939SAndy Fiddaman 				SYNCIN();
1705*b30d1939SAndy Fiddaman 				pp.toknxt = oop = op;
1706*b30d1939SAndy Fiddaman 				pp.state |= SPACEOUT;
1707*b30d1939SAndy Fiddaman 				ppcomment = pp.comment;
1708*b30d1939SAndy Fiddaman 				pp.comment = 0;
1709*b30d1939SAndy Fiddaman 				op = (pptoken = tp) + MAXTOKEN;
1710*b30d1939SAndy Fiddaman 				for (;;)
1711*b30d1939SAndy Fiddaman 				{
1712*b30d1939SAndy Fiddaman 					ADVANCE();
1713*b30d1939SAndy Fiddaman 					switch (pplex())
1714*b30d1939SAndy Fiddaman 					{
1715*b30d1939SAndy Fiddaman 					case 0:
1716*b30d1939SAndy Fiddaman 						break;
1717*b30d1939SAndy Fiddaman 					case '\n':
1718*b30d1939SAndy Fiddaman 						error_info.line++;
1719*b30d1939SAndy Fiddaman 						break;
1720*b30d1939SAndy Fiddaman 					default:
1721*b30d1939SAndy Fiddaman 						continue;
1722*b30d1939SAndy Fiddaman 					}
1723*b30d1939SAndy Fiddaman 					break;
1724*b30d1939SAndy Fiddaman 				}
1725*b30d1939SAndy Fiddaman 				pp.comment = ppcomment;
1726*b30d1939SAndy Fiddaman 				pp.state &= ~SPACEOUT;
1727*b30d1939SAndy Fiddaman 				CACHEIN();
1728*b30d1939SAndy Fiddaman 				tp = pptoken;
1729*b30d1939SAndy Fiddaman 				*--op = 0;
1730*b30d1939SAndy Fiddaman 				op = oop;
1731*b30d1939SAndy Fiddaman 				if (pp.pragma && !(st & NOTEXT))
1732*b30d1939SAndy Fiddaman 				{
1733*b30d1939SAndy Fiddaman 					*s = 0;
1734*b30d1939SAndy Fiddaman 					SYNC();
1735*b30d1939SAndy Fiddaman 					(*pp.pragma)(NiL, NiL, NiL, tp, 1);
1736*b30d1939SAndy Fiddaman 					CACHE();
1737*b30d1939SAndy Fiddaman 				}
1738*b30d1939SAndy Fiddaman 				if (!c) BACKIN();
1739*b30d1939SAndy Fiddaman 				goto fsm_top;
1740*b30d1939SAndy Fiddaman 			}
1741*b30d1939SAndy Fiddaman 			else c = '#';
1742*b30d1939SAndy Fiddaman 			break;
1743*b30d1939SAndy Fiddaman 		}
1744*b30d1939SAndy Fiddaman 		if ((st & (COLLECTING|STRICT)) == (COLLECTING|STRICT))
1745*b30d1939SAndy Fiddaman 			error(1, "directives in macro call arguments are not portable");
1746*b30d1939SAndy Fiddaman #endif
1747*b30d1939SAndy Fiddaman 		if (c == '#' && pp.in->type == IN_RESCAN)
1748*b30d1939SAndy Fiddaman 		{
1749*b30d1939SAndy Fiddaman 			/*
1750*b30d1939SAndy Fiddaman 			 * pass line to pp.pragma VERBATIM
1751*b30d1939SAndy Fiddaman 			 */
1752*b30d1939SAndy Fiddaman 
1753*b30d1939SAndy Fiddaman 			SKIPIN();
1754*b30d1939SAndy Fiddaman 			s = pp.valbuf;
1755*b30d1939SAndy Fiddaman 			while ((c = GETCHR()) && c != '\n')
1756*b30d1939SAndy Fiddaman 				if ((*s++ = c) == MARK) SKIPIN();
1757*b30d1939SAndy Fiddaman 			if (pp.pragma && !(st & NOTEXT))
1758*b30d1939SAndy Fiddaman 			{
1759*b30d1939SAndy Fiddaman 				*s = 0;
1760*b30d1939SAndy Fiddaman 				SYNC();
1761*b30d1939SAndy Fiddaman 				(*pp.pragma)(NiL, NiL, NiL, pp.valbuf, 1);
1762*b30d1939SAndy Fiddaman 				CACHE();
1763*b30d1939SAndy Fiddaman 			}
1764*b30d1939SAndy Fiddaman 			if (!c) BACKIN();
1765*b30d1939SAndy Fiddaman #if CPP
1766*b30d1939SAndy Fiddaman 			goto fsm_start;
1767*b30d1939SAndy Fiddaman #else
1768*b30d1939SAndy Fiddaman 			goto fsm_top;
1769*b30d1939SAndy Fiddaman #endif
1770*b30d1939SAndy Fiddaman 		}
1771*b30d1939SAndy Fiddaman 		SYNC();
1772*b30d1939SAndy Fiddaman 		ppcontrol();
1773*b30d1939SAndy Fiddaman 		CACHE();
1774*b30d1939SAndy Fiddaman #if CPP
1775*b30d1939SAndy Fiddaman 		if (st & (NOTEXT|SKIPCONTROL))
1776*b30d1939SAndy Fiddaman 		{
1777*b30d1939SAndy Fiddaman 			if (!sp)
1778*b30d1939SAndy Fiddaman 			{
1779*b30d1939SAndy Fiddaman 				PPCHECKOUTTP();
1780*b30d1939SAndy Fiddaman 				sp = tp;
1781*b30d1939SAndy Fiddaman 			}
1782*b30d1939SAndy Fiddaman 		}
1783*b30d1939SAndy Fiddaman 		else if (sp)
1784*b30d1939SAndy Fiddaman 		{
1785*b30d1939SAndy Fiddaman 			tp = op = sp;
1786*b30d1939SAndy Fiddaman 			sp = 0;
1787*b30d1939SAndy Fiddaman 		}
1788*b30d1939SAndy Fiddaman 		goto fsm_start;
1789*b30d1939SAndy Fiddaman #else
1790*b30d1939SAndy Fiddaman 		goto fsm_top;
1791*b30d1939SAndy Fiddaman #endif
1792*b30d1939SAndy Fiddaman 
1793*b30d1939SAndy Fiddaman 	case S_NL:
1794*b30d1939SAndy Fiddaman #if CPP
1795*b30d1939SAndy Fiddaman 		if (op == tp && !(st & JOINING) && pp.in->type == IN_FILE && !(pp.option & PRESERVE))
1796*b30d1939SAndy Fiddaman 		{
1797*b30d1939SAndy Fiddaman 			st |= NEWLINE|HIDDEN;
1798*b30d1939SAndy Fiddaman 			pp.hidden++;
1799*b30d1939SAndy Fiddaman 			error_info.line++;
1800*b30d1939SAndy Fiddaman 			goto fsm_start;
1801*b30d1939SAndy Fiddaman 		}
1802*b30d1939SAndy Fiddaman #endif
1803*b30d1939SAndy Fiddaman  fsm_newline:
1804*b30d1939SAndy Fiddaman #if CPP
1805*b30d1939SAndy Fiddaman 		if (sp)
1806*b30d1939SAndy Fiddaman 			op = sp;
1807*b30d1939SAndy Fiddaman 		else if (!(pp.in->flags & IN_noguard))
1808*b30d1939SAndy Fiddaman 		{
1809*b30d1939SAndy Fiddaman 			while (tp < op)
1810*b30d1939SAndy Fiddaman 				if ((c = *tp++) != ' ' && c != '\t')
1811*b30d1939SAndy Fiddaman 				{
1812*b30d1939SAndy Fiddaman 					pp.in->flags |= IN_tokens;
1813*b30d1939SAndy Fiddaman 					break;
1814*b30d1939SAndy Fiddaman 				}
1815*b30d1939SAndy Fiddaman 			c = '\n';
1816*b30d1939SAndy Fiddaman 		}
1817*b30d1939SAndy Fiddaman 		st |= NEWLINE;
1818*b30d1939SAndy Fiddaman 		error_info.line++;
1819*b30d1939SAndy Fiddaman 		if (*ip == '\n' && *(ip + 1) != '\n' && !pp.macref && !(st & (ADD|HIDDEN)))
1820*b30d1939SAndy Fiddaman 		{
1821*b30d1939SAndy Fiddaman 			ip++;
1822*b30d1939SAndy Fiddaman 			PUTCHR('\n');
1823*b30d1939SAndy Fiddaman 			error_info.line++;
1824*b30d1939SAndy Fiddaman 		}
1825*b30d1939SAndy Fiddaman 		if ((st & NOTEXT) && ((pp.mode & FILEDEPS) || (pp.option & (DEFINITIONS|PREDEFINITIONS))))
1826*b30d1939SAndy Fiddaman 			BACKOUT();
1827*b30d1939SAndy Fiddaman 		else
1828*b30d1939SAndy Fiddaman 		{
1829*b30d1939SAndy Fiddaman 			debug((-5, "token[%d] %03o = %s [line=%d]", pp.level, c, pptokchr(c), error_info.line));
1830*b30d1939SAndy Fiddaman 			PUTCHR('\n');
1831*b30d1939SAndy Fiddaman 			PPSYNCLINE();
1832*b30d1939SAndy Fiddaman 			if (sp)
1833*b30d1939SAndy Fiddaman 			{
1834*b30d1939SAndy Fiddaman 				PPCHECKOUT();
1835*b30d1939SAndy Fiddaman 				sp = op;
1836*b30d1939SAndy Fiddaman 			}
1837*b30d1939SAndy Fiddaman 		}
1838*b30d1939SAndy Fiddaman 		goto fsm_start;
1839*b30d1939SAndy Fiddaman #else
1840*b30d1939SAndy Fiddaman 		st |= NEWLINE;
1841*b30d1939SAndy Fiddaman 		if (pp.level == 1)
1842*b30d1939SAndy Fiddaman 		{
1843*b30d1939SAndy Fiddaman 			error_info.line++;
1844*b30d1939SAndy Fiddaman 			if (!(st & (JOINING|SPACEOUT)))
1845*b30d1939SAndy Fiddaman 			{
1846*b30d1939SAndy Fiddaman 				debug((-5, "token[%d] %03o = %s [line=%d]", pp.level, c, pptokchr(c), error_info.line));
1847*b30d1939SAndy Fiddaman 				BACKOUT();
1848*b30d1939SAndy Fiddaman 				goto fsm_top;
1849*b30d1939SAndy Fiddaman 			}
1850*b30d1939SAndy Fiddaman 		}
1851*b30d1939SAndy Fiddaman 		BACKOUT();
1852*b30d1939SAndy Fiddaman 		if (st & SKIPCONTROL)
1853*b30d1939SAndy Fiddaman 		{
1854*b30d1939SAndy Fiddaman 			error_info.line++;
1855*b30d1939SAndy Fiddaman 			st |= HIDDEN;
1856*b30d1939SAndy Fiddaman 			pp.hidden++;
1857*b30d1939SAndy Fiddaman 			goto fsm_start;
1858*b30d1939SAndy Fiddaman 		}
1859*b30d1939SAndy Fiddaman 		PUTCHR(c = '\n');
1860*b30d1939SAndy Fiddaman 		goto fsm_return;
1861*b30d1939SAndy Fiddaman #endif
1862*b30d1939SAndy Fiddaman 
1863*b30d1939SAndy Fiddaman #if !CPP
1864*b30d1939SAndy Fiddaman 	case S_TOK:
1865*b30d1939SAndy Fiddaman 		PUTCHR(c);
1866*b30d1939SAndy Fiddaman 		c = TYPE(state) | qual;
1867*b30d1939SAndy Fiddaman 		break;
1868*b30d1939SAndy Fiddaman 
1869*b30d1939SAndy Fiddaman 	case S_TOKB:
1870*b30d1939SAndy Fiddaman 		BACKIN();
1871*b30d1939SAndy Fiddaman 		c = TYPE(state) | qual;
1872*b30d1939SAndy Fiddaman 		break;
1873*b30d1939SAndy Fiddaman #endif
1874*b30d1939SAndy Fiddaman 
1875*b30d1939SAndy Fiddaman 	case S_VS:
1876*b30d1939SAndy Fiddaman 		PUTCHR(c);
1877*b30d1939SAndy Fiddaman #if !CPP
1878*b30d1939SAndy Fiddaman 		if (st & NOVERTICAL)
1879*b30d1939SAndy Fiddaman 		{
1880*b30d1939SAndy Fiddaman 			error(1, "%s invalid in directives", pptokchr(c));
1881*b30d1939SAndy Fiddaman 			st &= ~NOVERTICAL;
1882*b30d1939SAndy Fiddaman 		}
1883*b30d1939SAndy Fiddaman #endif
1884*b30d1939SAndy Fiddaman #if COMPATIBLE
1885*b30d1939SAndy Fiddaman 		if (st & COMPATIBILITY) st |= NEWLINE;
1886*b30d1939SAndy Fiddaman #endif
1887*b30d1939SAndy Fiddaman #if CPP
1888*b30d1939SAndy Fiddaman 		if (!(pp.in->flags & IN_noguard))
1889*b30d1939SAndy Fiddaman 			while (tp < op)
1890*b30d1939SAndy Fiddaman 				if ((c = *tp++) != ' ' && c != '\t')
1891*b30d1939SAndy Fiddaman 				{
1892*b30d1939SAndy Fiddaman 					pp.in->flags |= IN_tokens;
1893*b30d1939SAndy Fiddaman 					break;
1894*b30d1939SAndy Fiddaman 				}
1895*b30d1939SAndy Fiddaman 		goto fsm_start;
1896*b30d1939SAndy Fiddaman #else
1897*b30d1939SAndy Fiddaman 		bp = ip;
1898*b30d1939SAndy Fiddaman 		rp = fsm[WS1];
1899*b30d1939SAndy Fiddaman 		goto fsm_get;
1900*b30d1939SAndy Fiddaman #endif
1901*b30d1939SAndy Fiddaman 
1902*b30d1939SAndy Fiddaman #if !CPP
1903*b30d1939SAndy Fiddaman 	case S_WS:
1904*b30d1939SAndy Fiddaman #if COMPATIBLE
1905*b30d1939SAndy Fiddaman 		if ((st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY) st &= ~NEWLINE;
1906*b30d1939SAndy Fiddaman #endif
1907*b30d1939SAndy Fiddaman 		if (pp.level == 1)
1908*b30d1939SAndy Fiddaman 		{
1909*b30d1939SAndy Fiddaman 			if ((st & (COMPATIBILITY|SPACEOUT)) && !(st & TRANSITION))
1910*b30d1939SAndy Fiddaman 			{
1911*b30d1939SAndy Fiddaman 				if (st & (COMPILE|NOTEXT))
1912*b30d1939SAndy Fiddaman 				{
1913*b30d1939SAndy Fiddaman #if CATSTRINGS
1914*b30d1939SAndy Fiddaman 					if ((st & (JOINING|NOTEXT|SPACEOUT)) != SPACEOUT)
1915*b30d1939SAndy Fiddaman #else
1916*b30d1939SAndy Fiddaman 					if ((st & (NOTEXT|SPACEOUT)) != SPACEOUT)
1917*b30d1939SAndy Fiddaman #endif
1918*b30d1939SAndy Fiddaman 					{
1919*b30d1939SAndy Fiddaman 						BACKOUT();
1920*b30d1939SAndy Fiddaman 						bp = ip - 1;
1921*b30d1939SAndy Fiddaman 						rp = fsm[START];
1922*b30d1939SAndy Fiddaman 						if (state = rp[c]) goto fsm_next;
1923*b30d1939SAndy Fiddaman 						goto fsm_get;
1924*b30d1939SAndy Fiddaman 					}
1925*b30d1939SAndy Fiddaman 				}
1926*b30d1939SAndy Fiddaman 				else
1927*b30d1939SAndy Fiddaman #if CATSTRINGS
1928*b30d1939SAndy Fiddaman 				if (!(st & JOINING))
1929*b30d1939SAndy Fiddaman #endif
1930*b30d1939SAndy Fiddaman 				{
1931*b30d1939SAndy Fiddaman 					tp = op;
1932*b30d1939SAndy Fiddaman 					bp = ip - 1;
1933*b30d1939SAndy Fiddaman 					rp = fsm[START];
1934*b30d1939SAndy Fiddaman 					if (state = rp[c]) goto fsm_next;
1935*b30d1939SAndy Fiddaman 					goto fsm_get;
1936*b30d1939SAndy Fiddaman 				}
1937*b30d1939SAndy Fiddaman 				BACKIN();
1938*b30d1939SAndy Fiddaman 				c = ' ';
1939*b30d1939SAndy Fiddaman 				goto fsm_return;
1940*b30d1939SAndy Fiddaman 			}
1941*b30d1939SAndy Fiddaman 			BACKOUT();
1942*b30d1939SAndy Fiddaman 			bp = ip - 1;
1943*b30d1939SAndy Fiddaman 			rp = fsm[START];
1944*b30d1939SAndy Fiddaman 			if (state = rp[c]) goto fsm_next;
1945*b30d1939SAndy Fiddaman 			goto fsm_get;
1946*b30d1939SAndy Fiddaman 		}
1947*b30d1939SAndy Fiddaman 		if (st & (NOSPACE|SKIPCONTROL))
1948*b30d1939SAndy Fiddaman 		{
1949*b30d1939SAndy Fiddaman 			BACKOUT();
1950*b30d1939SAndy Fiddaman 			bp = ip - 1;
1951*b30d1939SAndy Fiddaman 			rp = fsm[START];
1952*b30d1939SAndy Fiddaman 			if (state = rp[c]) goto fsm_next;
1953*b30d1939SAndy Fiddaman 			goto fsm_get;
1954*b30d1939SAndy Fiddaman 		}
1955*b30d1939SAndy Fiddaman 		if (c != '\n')
1956*b30d1939SAndy Fiddaman 		{
1957*b30d1939SAndy Fiddaman 			BACKIN();
1958*b30d1939SAndy Fiddaman 			c = ' ';
1959*b30d1939SAndy Fiddaman 		}
1960*b30d1939SAndy Fiddaman 		if (!(pp.option & PRESERVE))
1961*b30d1939SAndy Fiddaman 		{
1962*b30d1939SAndy Fiddaman 			BACKOUT();
1963*b30d1939SAndy Fiddaman 			PUTCHR(c);
1964*b30d1939SAndy Fiddaman 		}
1965*b30d1939SAndy Fiddaman 		goto fsm_return;
1966*b30d1939SAndy Fiddaman #endif
1967*b30d1939SAndy Fiddaman 
1968*b30d1939SAndy Fiddaman 	default:
1969*b30d1939SAndy Fiddaman 		if (state & SPLICE)
1970*b30d1939SAndy Fiddaman 		{
1971*b30d1939SAndy Fiddaman 			switch (c)
1972*b30d1939SAndy Fiddaman 			{
1973*b30d1939SAndy Fiddaman 			case MARK:
1974*b30d1939SAndy Fiddaman 				/*
1975*b30d1939SAndy Fiddaman 				 * internal mark
1976*b30d1939SAndy Fiddaman 				 */
1977*b30d1939SAndy Fiddaman 
1978*b30d1939SAndy Fiddaman 				switch (pp.in->type)
1979*b30d1939SAndy Fiddaman 				{
1980*b30d1939SAndy Fiddaman 				case IN_BUFFER:
1981*b30d1939SAndy Fiddaman 				case IN_FILE:
1982*b30d1939SAndy Fiddaman #if !CPP
1983*b30d1939SAndy Fiddaman 				case IN_INIT:
1984*b30d1939SAndy Fiddaman #if CATSTRINGS
1985*b30d1939SAndy Fiddaman 					if ((st & JOINING) && (!INQUOTE(rp) || quot != '"') || pp.level > 1 && (rp == fsm[START] || INQUOTE(rp)))
1986*b30d1939SAndy Fiddaman #else
1987*b30d1939SAndy Fiddaman 					if (pp.level > 1 && (rp == fsm[START] || INQUOTE(rp)))
1988*b30d1939SAndy Fiddaman #endif
1989*b30d1939SAndy Fiddaman 						PUTCHR(c);
1990*b30d1939SAndy Fiddaman #endif
1991*b30d1939SAndy Fiddaman 					break;
1992*b30d1939SAndy Fiddaman 				default:
1993*b30d1939SAndy Fiddaman 					switch (GETCHR())
1994*b30d1939SAndy Fiddaman 					{
1995*b30d1939SAndy Fiddaman 					case 'A':
1996*b30d1939SAndy Fiddaman 						if (!(st & (DEFINITION|DISABLE)))
1997*b30d1939SAndy Fiddaman 						{
1998*b30d1939SAndy Fiddaman 							c = GETCHR();
1999*b30d1939SAndy Fiddaman 							SYNCIN();
2000*b30d1939SAndy Fiddaman 							if (pp.macp->arg[c - ARGOFFSET][-1])
2001*b30d1939SAndy Fiddaman 								PUSH_EXPAND(pp.macp->arg[c - ARGOFFSET], pp.macp->line);
2002*b30d1939SAndy Fiddaman 							else
2003*b30d1939SAndy Fiddaman 								PUSH_COPY(pp.macp->arg[c - ARGOFFSET], pp.macp->line);
2004*b30d1939SAndy Fiddaman 							CACHEIN();
2005*b30d1939SAndy Fiddaman 							bp = ip;
2006*b30d1939SAndy Fiddaman 							goto fsm_get;
2007*b30d1939SAndy Fiddaman 						}
2008*b30d1939SAndy Fiddaman 						/*FALLTHROUGH*/
2009*b30d1939SAndy Fiddaman 					case 'C':
2010*b30d1939SAndy Fiddaman 						c = GETCHR() - ARGOFFSET;
2011*b30d1939SAndy Fiddaman 						if (!*(s = pp.macp->arg[c]) && (pp.in->symbol->flags & SYM_VARIADIC) && pp.in->symbol->macro->arity == (c + 1))
2012*b30d1939SAndy Fiddaman 						{
2013*b30d1939SAndy Fiddaman 							s = ip - 3;
2014*b30d1939SAndy Fiddaman 							while (--op > tp && --s > bp && ppisidig(*s));
2015*b30d1939SAndy Fiddaman 						}
2016*b30d1939SAndy Fiddaman 						else
2017*b30d1939SAndy Fiddaman 						{
2018*b30d1939SAndy Fiddaman 							SYNCIN();
2019*b30d1939SAndy Fiddaman 							PUSH_COPY(s, pp.macp->line);
2020*b30d1939SAndy Fiddaman 							CACHEIN();
2021*b30d1939SAndy Fiddaman 						}
2022*b30d1939SAndy Fiddaman 						bp = ip;
2023*b30d1939SAndy Fiddaman 						goto fsm_get;
2024*b30d1939SAndy Fiddaman 					case 'F':
2025*b30d1939SAndy Fiddaman 						error_info.file = (char*)strtoul(ip, &s, 16);
2026*b30d1939SAndy Fiddaman 						debug((-6, "actual sync: file = \"%s\"", error_info.file));
2027*b30d1939SAndy Fiddaman 						bp = ip = s + 1;
2028*b30d1939SAndy Fiddaman 						goto fsm_get;
2029*b30d1939SAndy Fiddaman 					case 'L':
2030*b30d1939SAndy Fiddaman 						error_info.line = strtoul(ip, &s, 16);
2031*b30d1939SAndy Fiddaman 						debug((-6, "actual sync: line = %d", error_info.line));
2032*b30d1939SAndy Fiddaman 						bp = ip = s + 1;
2033*b30d1939SAndy Fiddaman 						goto fsm_get;
2034*b30d1939SAndy Fiddaman 					case 'Q':
2035*b30d1939SAndy Fiddaman 						c = GETCHR();
2036*b30d1939SAndy Fiddaman 						SYNCIN();
2037*b30d1939SAndy Fiddaman 						PUSH_QUOTE(pp.macp->arg[c - ARGOFFSET], pp.macp->line);
2038*b30d1939SAndy Fiddaman 						CACHEIN();
2039*b30d1939SAndy Fiddaman 						*(bp = ip - 1) = '"';
2040*b30d1939SAndy Fiddaman 						if (st & (COLLECTING|EOF2NL|JOINING)) rp = fsm[START];
2041*b30d1939SAndy Fiddaman 						if (state = rp[c = '"']) goto fsm_next;
2042*b30d1939SAndy Fiddaman 						goto fsm_get;
2043*b30d1939SAndy Fiddaman 					case 'S':
2044*b30d1939SAndy Fiddaman 						c = GETCHR();
2045*b30d1939SAndy Fiddaman 						SYNCIN();
2046*b30d1939SAndy Fiddaman 						PUSH_SQUOTE(pp.macp->arg[c - ARGOFFSET], pp.macp->line);
2047*b30d1939SAndy Fiddaman 						CACHEIN();
2048*b30d1939SAndy Fiddaman 						bp = ip - 1;
2049*b30d1939SAndy Fiddaman 						if (st & COLLECTING) rp = fsm[START];
2050*b30d1939SAndy Fiddaman 						if (state = rp[c = '\'']) goto fsm_next;
2051*b30d1939SAndy Fiddaman 						goto fsm_get;
2052*b30d1939SAndy Fiddaman 					case 'X':
2053*b30d1939SAndy Fiddaman 						if (pp.in->type != IN_COPY)
2054*b30d1939SAndy Fiddaman 							st |= SKIPMACRO;
2055*b30d1939SAndy Fiddaman 						if (pp.level <= 1)
2056*b30d1939SAndy Fiddaman 						{
2057*b30d1939SAndy Fiddaman 							bp = ip;
2058*b30d1939SAndy Fiddaman 							goto fsm_get;
2059*b30d1939SAndy Fiddaman 						}
2060*b30d1939SAndy Fiddaman 						if (pp.in->type == IN_EXPAND)
2061*b30d1939SAndy Fiddaman 						{
2062*b30d1939SAndy Fiddaman 							st &= ~SKIPMACRO;
2063*b30d1939SAndy Fiddaman 							PUTCHR(c);
2064*b30d1939SAndy Fiddaman 							PUTCHR('X');
2065*b30d1939SAndy Fiddaman 						}
2066*b30d1939SAndy Fiddaman 						c = GETCHR();
2067*b30d1939SAndy Fiddaman 						break;
2068*b30d1939SAndy Fiddaman 					case 0:
2069*b30d1939SAndy Fiddaman 						if ((state &= ~SPLICE) >= TERMINAL) goto fsm_terminal;
2070*b30d1939SAndy Fiddaman 						goto fsm_begin;
2071*b30d1939SAndy Fiddaman 					default:
2072*b30d1939SAndy Fiddaman #if DEBUG
2073*b30d1939SAndy Fiddaman 						error(PANIC, "invalid mark op `%c'", LASTCHR());
2074*b30d1939SAndy Fiddaman 						/*FALLTHROUGH*/
2075*b30d1939SAndy Fiddaman 					case MARK:
2076*b30d1939SAndy Fiddaman #endif
2077*b30d1939SAndy Fiddaman #if CATSTRINGS
2078*b30d1939SAndy Fiddaman 						if ((st & (JOINING|QUOTE)) == JOINING)
2079*b30d1939SAndy Fiddaman 						{
2080*b30d1939SAndy Fiddaman 							if (!INQUOTE(rp))
2081*b30d1939SAndy Fiddaman 								PUTCHR(c);
2082*b30d1939SAndy Fiddaman 						}
2083*b30d1939SAndy Fiddaman 						else
2084*b30d1939SAndy Fiddaman #endif
2085*b30d1939SAndy Fiddaman #if CPP
2086*b30d1939SAndy Fiddaman 						if (rp != fsm[START] && !INQUOTE(rp))
2087*b30d1939SAndy Fiddaman 							UNGETCHR(c);
2088*b30d1939SAndy Fiddaman #else
2089*b30d1939SAndy Fiddaman 						if (rp != fsm[START] && !INQUOTE(rp))
2090*b30d1939SAndy Fiddaman 							UNGETCHR(c);
2091*b30d1939SAndy Fiddaman 						else if (pp.level > 1)
2092*b30d1939SAndy Fiddaman 							PUTCHR(c);
2093*b30d1939SAndy Fiddaman #endif
2094*b30d1939SAndy Fiddaman 						break;
2095*b30d1939SAndy Fiddaman 					}
2096*b30d1939SAndy Fiddaman 					break;
2097*b30d1939SAndy Fiddaman 				}
2098*b30d1939SAndy Fiddaman 				break;
2099*b30d1939SAndy Fiddaman 			case '?':
2100*b30d1939SAndy Fiddaman 				/*
2101*b30d1939SAndy Fiddaman 				 * trigraph
2102*b30d1939SAndy Fiddaman 				 */
2103*b30d1939SAndy Fiddaman 
2104*b30d1939SAndy Fiddaman 				if (pp.in->type == IN_FILE)
2105*b30d1939SAndy Fiddaman 				{
2106*b30d1939SAndy Fiddaman 					GET(c, n, tp, xp);
2107*b30d1939SAndy Fiddaman 					if (n == '?')
2108*b30d1939SAndy Fiddaman 					{
2109*b30d1939SAndy Fiddaman 						GET(c, n, tp, xp);
2110*b30d1939SAndy Fiddaman 						if (c = trigraph[n])
2111*b30d1939SAndy Fiddaman 						{
2112*b30d1939SAndy Fiddaman 							if ((st & WARN) && (st & (COMPATIBILITY|TRANSITION)) && !(pp.mode & HOSTED) && !INCOMMENT(rp))
2113*b30d1939SAndy Fiddaman 								error(1, "trigraph conversion %c%c%c -> %c%s", '?', '?', n, c, (st & TRANSITION) ? "" : " inhibited");
2114*b30d1939SAndy Fiddaman #if COMPATIBLE
2115*b30d1939SAndy Fiddaman 							if ((st & (COMPATIBILITY|TRANSITION)) != COMPATIBILITY)
2116*b30d1939SAndy Fiddaman 							{
2117*b30d1939SAndy Fiddaman #endif
2118*b30d1939SAndy Fiddaman 							*(bp = ip - 1) = c;
2119*b30d1939SAndy Fiddaman 							if (state = rp[c]) goto fsm_next;
2120*b30d1939SAndy Fiddaman 							goto fsm_get;
2121*b30d1939SAndy Fiddaman #if COMPATIBLE
2122*b30d1939SAndy Fiddaman 							}
2123*b30d1939SAndy Fiddaman #endif
2124*b30d1939SAndy Fiddaman 						}
2125*b30d1939SAndy Fiddaman 						if (n != EOB) BACKIN();
2126*b30d1939SAndy Fiddaman 						UNGETCHR(c = '?');
2127*b30d1939SAndy Fiddaman 					}
2128*b30d1939SAndy Fiddaman 					else if (n != EOB) BACKIN();
2129*b30d1939SAndy Fiddaman 				}
2130*b30d1939SAndy Fiddaman 				break;
2131*b30d1939SAndy Fiddaman 			case '%':
2132*b30d1939SAndy Fiddaman 			case '<':
2133*b30d1939SAndy Fiddaman 			case ':':
2134*b30d1939SAndy Fiddaman 				/*
2135*b30d1939SAndy Fiddaman 				 * digraph = --trigraph
2136*b30d1939SAndy Fiddaman 				 */
2137*b30d1939SAndy Fiddaman 
2138*b30d1939SAndy Fiddaman 				if (pp.in->type == IN_FILE && (pp.option & PLUSPLUS))
2139*b30d1939SAndy Fiddaman 				{
2140*b30d1939SAndy Fiddaman 					m = 0;
2141*b30d1939SAndy Fiddaman 					GET(c, n, tp, xp);
2142*b30d1939SAndy Fiddaman 					switch (n)
2143*b30d1939SAndy Fiddaman 					{
2144*b30d1939SAndy Fiddaman 					case '%':
2145*b30d1939SAndy Fiddaman 						if (c == '<') m = '{';
2146*b30d1939SAndy Fiddaman 						break;
2147*b30d1939SAndy Fiddaman 					case '>':
2148*b30d1939SAndy Fiddaman 						if (c == '%') m = '}';
2149*b30d1939SAndy Fiddaman 						else if (c == ':') m = ']';
2150*b30d1939SAndy Fiddaman 						break;
2151*b30d1939SAndy Fiddaman 					case ':':
2152*b30d1939SAndy Fiddaman 						if (c == '%') m = '#';
2153*b30d1939SAndy Fiddaman 						else if (c == '<') m = '[';
2154*b30d1939SAndy Fiddaman 						break;
2155*b30d1939SAndy Fiddaman 					}
2156*b30d1939SAndy Fiddaman 					if (m)
2157*b30d1939SAndy Fiddaman 					{
2158*b30d1939SAndy Fiddaman 						if ((st & WARN) && (st & (COMPATIBILITY|TRANSITION)) && !(pp.mode & HOSTED) && !INCOMMENT(rp))
2159*b30d1939SAndy Fiddaman 							error(1, "digraph conversion %c%c -> %c%s", c, n, m, (st & TRANSITION) ? "" : " inhibited");
2160*b30d1939SAndy Fiddaman #if COMPATIBLE
2161*b30d1939SAndy Fiddaman 						if ((st & (COMPATIBILITY|TRANSITION)) != COMPATIBILITY)
2162*b30d1939SAndy Fiddaman 						{
2163*b30d1939SAndy Fiddaman #endif
2164*b30d1939SAndy Fiddaman 						*(bp = ip - 1) = c = m;
2165*b30d1939SAndy Fiddaman 						if (state = rp[c]) goto fsm_next;
2166*b30d1939SAndy Fiddaman 						goto fsm_get;
2167*b30d1939SAndy Fiddaman #if COMPATIBLE
2168*b30d1939SAndy Fiddaman 						}
2169*b30d1939SAndy Fiddaman #endif
2170*b30d1939SAndy Fiddaman 					}
2171*b30d1939SAndy Fiddaman 					if (n != EOB) BACKIN();
2172*b30d1939SAndy Fiddaman 				}
2173*b30d1939SAndy Fiddaman 				break;
2174*b30d1939SAndy Fiddaman 			case '\\':
2175*b30d1939SAndy Fiddaman 				/*
2176*b30d1939SAndy Fiddaman 				 * line splice
2177*b30d1939SAndy Fiddaman 				 */
2178*b30d1939SAndy Fiddaman 
2179*b30d1939SAndy Fiddaman 				if (pp.in->type == IN_FILE && (!(pp.option & PLUSSPLICE) || !INCOMMENTXX(rp)))
2180*b30d1939SAndy Fiddaman 				{
2181*b30d1939SAndy Fiddaman 					m = 0;
2182*b30d1939SAndy Fiddaman 					GET(c, n, tp, xp);
2183*b30d1939SAndy Fiddaman 					if ((pp.option & SPLICESPACE) && !INQUOTE(rp))
2184*b30d1939SAndy Fiddaman 						while (n == ' ')
2185*b30d1939SAndy Fiddaman 						{
2186*b30d1939SAndy Fiddaman 							GET(c, n, tp, xp);
2187*b30d1939SAndy Fiddaman 							m = 1;
2188*b30d1939SAndy Fiddaman 						}
2189*b30d1939SAndy Fiddaman 					if (n == '\r')
2190*b30d1939SAndy Fiddaman 					{
2191*b30d1939SAndy Fiddaman 						GET(c, n, tp, xp);
2192*b30d1939SAndy Fiddaman 						if (n != '\n' && n != EOB)
2193*b30d1939SAndy Fiddaman 							BACKIN();
2194*b30d1939SAndy Fiddaman 					}
2195*b30d1939SAndy Fiddaman 					if (n == '\n')
2196*b30d1939SAndy Fiddaman 					{
2197*b30d1939SAndy Fiddaman #if CPP
2198*b30d1939SAndy Fiddaman 						if (INQUOTE(rp))
2199*b30d1939SAndy Fiddaman 						{
2200*b30d1939SAndy Fiddaman 							if ((pp.option & STRINGSPLIT) && quot == '"')
2201*b30d1939SAndy Fiddaman 							{
2202*b30d1939SAndy Fiddaman 								PUTCHR(quot);
2203*b30d1939SAndy Fiddaman 								PUTCHR(n);
2204*b30d1939SAndy Fiddaman 								PUTCHR(quot);
2205*b30d1939SAndy Fiddaman 							}
2206*b30d1939SAndy Fiddaman 							else if (*pp.lineid)
2207*b30d1939SAndy Fiddaman 							{
2208*b30d1939SAndy Fiddaman 								PUTCHR(c);
2209*b30d1939SAndy Fiddaman 								PUTCHR(n);
2210*b30d1939SAndy Fiddaman 							}
2211*b30d1939SAndy Fiddaman 							else
2212*b30d1939SAndy Fiddaman 							{
2213*b30d1939SAndy Fiddaman 								st |= HIDDEN;
2214*b30d1939SAndy Fiddaman 								pp.hidden++;
2215*b30d1939SAndy Fiddaman 							}
2216*b30d1939SAndy Fiddaman 						}
2217*b30d1939SAndy Fiddaman 						else
2218*b30d1939SAndy Fiddaman #else
2219*b30d1939SAndy Fiddaman #if COMPATIBLE
2220*b30d1939SAndy Fiddaman 						if (!INQUOTE(rp) && (st & (COMPATIBILITY|DEFINITION|TRANSITION)) == (COMPATIBILITY|DEFINITION))
2221*b30d1939SAndy Fiddaman 						{
2222*b30d1939SAndy Fiddaman 							if (op == tp)
2223*b30d1939SAndy Fiddaman 							{
2224*b30d1939SAndy Fiddaman 								st |= HIDDEN;
2225*b30d1939SAndy Fiddaman 								pp.hidden++;
2226*b30d1939SAndy Fiddaman 								error_info.line++;
2227*b30d1939SAndy Fiddaman 								if (st & SPACEOUT)
2228*b30d1939SAndy Fiddaman 									goto fsm_start;
2229*b30d1939SAndy Fiddaman 								c = (pp.option & SPLICECAT) ? '\t' : ' ';
2230*b30d1939SAndy Fiddaman 								PUTCHR(c);
2231*b30d1939SAndy Fiddaman 								goto fsm_check;
2232*b30d1939SAndy Fiddaman 							}
2233*b30d1939SAndy Fiddaman 							UNGETCHR(n);
2234*b30d1939SAndy Fiddaman 							state &= ~SPLICE;
2235*b30d1939SAndy Fiddaman 							goto fsm_terminal;
2236*b30d1939SAndy Fiddaman 						}
2237*b30d1939SAndy Fiddaman #endif
2238*b30d1939SAndy Fiddaman #endif
2239*b30d1939SAndy Fiddaman 						{
2240*b30d1939SAndy Fiddaman 							st |= HIDDEN;
2241*b30d1939SAndy Fiddaman 							pp.hidden++;
2242*b30d1939SAndy Fiddaman 						}
2243*b30d1939SAndy Fiddaman #if CPP
2244*b30d1939SAndy Fiddaman 						spliced++;
2245*b30d1939SAndy Fiddaman #else
2246*b30d1939SAndy Fiddaman 						error_info.line++;
2247*b30d1939SAndy Fiddaman #endif
2248*b30d1939SAndy Fiddaman 						bp = ip;
2249*b30d1939SAndy Fiddaman 						goto fsm_get;
2250*b30d1939SAndy Fiddaman 					}
2251*b30d1939SAndy Fiddaman 					else if ((n == 'u' || n == 'U') && !INQUOTE(rp))
2252*b30d1939SAndy Fiddaman 					{
2253*b30d1939SAndy Fiddaman 						PUTCHR(c);
2254*b30d1939SAndy Fiddaman 						PUTCHR(n);
2255*b30d1939SAndy Fiddaman 						bp = ip;
2256*b30d1939SAndy Fiddaman 						goto fsm_get;
2257*b30d1939SAndy Fiddaman 					}
2258*b30d1939SAndy Fiddaman #if COMPATIBLE
2259*b30d1939SAndy Fiddaman 					else if ((st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY && (n == '"' || n == '\'') && !INQUOTE(rp))
2260*b30d1939SAndy Fiddaman 					{
2261*b30d1939SAndy Fiddaman 						PUTCHR(c);
2262*b30d1939SAndy Fiddaman 						PUTCHR(n);
2263*b30d1939SAndy Fiddaman 						bp = ip;
2264*b30d1939SAndy Fiddaman 						goto fsm_get;
2265*b30d1939SAndy Fiddaman 					}
2266*b30d1939SAndy Fiddaman #endif
2267*b30d1939SAndy Fiddaman 					else if (n != EOB)
2268*b30d1939SAndy Fiddaman 						BACKIN();
2269*b30d1939SAndy Fiddaman 					if (m && INSPACE(rp))
2270*b30d1939SAndy Fiddaman 						UNGETCHR(c);
2271*b30d1939SAndy Fiddaman 				}
2272*b30d1939SAndy Fiddaman #if COMPATIBLE
2273*b30d1939SAndy Fiddaman 				else if ((st & (COMPATIBILITY|TRANSITION)) == COMPATIBILITY && !INQUOTE(rp))
2274*b30d1939SAndy Fiddaman 				{
2275*b30d1939SAndy Fiddaman 					GET(c, n, tp, xp);
2276*b30d1939SAndy Fiddaman 					if (n == '"' || n == '\'')
2277*b30d1939SAndy Fiddaman 					{
2278*b30d1939SAndy Fiddaman 						PUTCHR(c);
2279*b30d1939SAndy Fiddaman 						PUTCHR(n);
2280*b30d1939SAndy Fiddaman 						bp = ip;
2281*b30d1939SAndy Fiddaman 						goto fsm_get;
2282*b30d1939SAndy Fiddaman 					}
2283*b30d1939SAndy Fiddaman 					if (n != EOB)
2284*b30d1939SAndy Fiddaman 						BACKIN();
2285*b30d1939SAndy Fiddaman 				}
2286*b30d1939SAndy Fiddaman #endif
2287*b30d1939SAndy Fiddaman 				break;
2288*b30d1939SAndy Fiddaman 			case '\r':
2289*b30d1939SAndy Fiddaman 				/*
2290*b30d1939SAndy Fiddaman 				 * barf
2291*b30d1939SAndy Fiddaman 				 */
2292*b30d1939SAndy Fiddaman 
2293*b30d1939SAndy Fiddaman 				if (pp.in->type == IN_FILE)
2294*b30d1939SAndy Fiddaman 				{
2295*b30d1939SAndy Fiddaman 					GET(c, n, tp, xp);
2296*b30d1939SAndy Fiddaman 					if (n == '\n')
2297*b30d1939SAndy Fiddaman 					{
2298*b30d1939SAndy Fiddaman 						*(bp = ip - 1) = c = n;
2299*b30d1939SAndy Fiddaman 						if (state = rp[c]) goto fsm_next;
2300*b30d1939SAndy Fiddaman 						goto fsm_get;
2301*b30d1939SAndy Fiddaman 					}
2302*b30d1939SAndy Fiddaman 					if (n != EOB) BACKIN();
2303*b30d1939SAndy Fiddaman 				}
2304*b30d1939SAndy Fiddaman 				break;
2305*b30d1939SAndy Fiddaman 			case CC_sub:
2306*b30d1939SAndy Fiddaman 				/*
2307*b30d1939SAndy Fiddaman 				 * barf & puke
2308*b30d1939SAndy Fiddaman 				 */
2309*b30d1939SAndy Fiddaman 
2310*b30d1939SAndy Fiddaman 				if ((pp.option & ZEOF) && pp.in->type == IN_FILE)
2311*b30d1939SAndy Fiddaman 				{
2312*b30d1939SAndy Fiddaman 					pp.in->flags |= IN_eof;
2313*b30d1939SAndy Fiddaman 					c = 0;
2314*b30d1939SAndy Fiddaman 					state = S_EOB;
2315*b30d1939SAndy Fiddaman 					goto fsm_terminal;
2316*b30d1939SAndy Fiddaman 				}
2317*b30d1939SAndy Fiddaman 				break;
2318*b30d1939SAndy Fiddaman 			}
2319*b30d1939SAndy Fiddaman 			if ((state &= ~SPLICE) >= TERMINAL)
2320*b30d1939SAndy Fiddaman 				goto fsm_terminal;
2321*b30d1939SAndy Fiddaman 			PUTCHR(c);
2322*b30d1939SAndy Fiddaman 			goto fsm_begin;
2323*b30d1939SAndy Fiddaman 		}
2324*b30d1939SAndy Fiddaman #if CPP
2325*b30d1939SAndy Fiddaman 		if (INOPSPACE(rp))
2326*b30d1939SAndy Fiddaman 		{
2327*b30d1939SAndy Fiddaman 			BACKIN();
2328*b30d1939SAndy Fiddaman 			goto fsm_start;
2329*b30d1939SAndy Fiddaman 		}
2330*b30d1939SAndy Fiddaman #endif
2331*b30d1939SAndy Fiddaman 		PUTCHR(c);
2332*b30d1939SAndy Fiddaman 		bp = ip;
2333*b30d1939SAndy Fiddaman 		goto fsm_get;
2334*b30d1939SAndy Fiddaman 	}
2335*b30d1939SAndy Fiddaman #if !CPP
2336*b30d1939SAndy Fiddaman  fsm_token:
2337*b30d1939SAndy Fiddaman 	st &= ~NEWLINE;
2338*b30d1939SAndy Fiddaman 	if (pp.level == 1)
2339*b30d1939SAndy Fiddaman 	{
2340*b30d1939SAndy Fiddaman 		pp.in->flags |= IN_tokens;
2341*b30d1939SAndy Fiddaman 		if (st & NOTEXT)
2342*b30d1939SAndy Fiddaman 		{
2343*b30d1939SAndy Fiddaman 			BACKOUT();
2344*b30d1939SAndy Fiddaman 			goto fsm_top;
2345*b30d1939SAndy Fiddaman 		}
2346*b30d1939SAndy Fiddaman  fsm_symbol:
2347*b30d1939SAndy Fiddaman 		count(token);
2348*b30d1939SAndy Fiddaman 	}
2349*b30d1939SAndy Fiddaman  fsm_check:
2350*b30d1939SAndy Fiddaman 	if (st & SKIPCONTROL)
2351*b30d1939SAndy Fiddaman 	{
2352*b30d1939SAndy Fiddaman 		BACKOUT();
2353*b30d1939SAndy Fiddaman 		goto fsm_start;
2354*b30d1939SAndy Fiddaman 	}
2355*b30d1939SAndy Fiddaman  fsm_return:
2356*b30d1939SAndy Fiddaman #if CPP
2357*b30d1939SAndy Fiddaman 	error_info.line += spliced;
2358*b30d1939SAndy Fiddaman #endif
2359*b30d1939SAndy Fiddaman 	SETCHR(0);
2360*b30d1939SAndy Fiddaman 	debug((-5, "token[%d] %03o = %s", pp.level, c, pptokstr(tp, 0)));
2361*b30d1939SAndy Fiddaman 	SYNC();
2362*b30d1939SAndy Fiddaman 	pp.level--;
2363*b30d1939SAndy Fiddaman 	error_info.indent--;
2364*b30d1939SAndy Fiddaman 	return c;
2365*b30d1939SAndy Fiddaman #endif
2366*b30d1939SAndy Fiddaman }
2367*b30d1939SAndy Fiddaman 
2368*b30d1939SAndy Fiddaman #if CPP && POOL
2369*b30d1939SAndy Fiddaman 
2370*b30d1939SAndy Fiddaman #include <ls.h>
2371*b30d1939SAndy Fiddaman #include <wait.h>
2372*b30d1939SAndy Fiddaman 
2373*b30d1939SAndy Fiddaman /*
2374*b30d1939SAndy Fiddaman  * output pool status on exit
2375*b30d1939SAndy Fiddaman  */
2376*b30d1939SAndy Fiddaman 
2377*b30d1939SAndy Fiddaman static void
poolstatus(void)2378*b30d1939SAndy Fiddaman poolstatus(void)
2379*b30d1939SAndy Fiddaman {
2380*b30d1939SAndy Fiddaman 	error(ERROR_OUTPUT|0, pp.pool.output, "%d", error_info.errors != 0);
2381*b30d1939SAndy Fiddaman }
2382*b30d1939SAndy Fiddaman 
2383*b30d1939SAndy Fiddaman /*
2384*b30d1939SAndy Fiddaman  * loop on < input output >
2385*b30d1939SAndy Fiddaman  */
2386*b30d1939SAndy Fiddaman 
2387*b30d1939SAndy Fiddaman static void
pool(void)2388*b30d1939SAndy Fiddaman pool(void)
2389*b30d1939SAndy Fiddaman {
2390*b30d1939SAndy Fiddaman 	char*	ifile;
2391*b30d1939SAndy Fiddaman 	char*	ofile;
2392*b30d1939SAndy Fiddaman 
2393*b30d1939SAndy Fiddaman 	ppflushout();
2394*b30d1939SAndy Fiddaman 	if (!sfnew(sfstdin, NiL, SF_UNBOUND, pp.pool.input, SF_READ))
2395*b30d1939SAndy Fiddaman 		error(ERROR_SYSTEM|3, "cannot dup pool input");
2396*b30d1939SAndy Fiddaman 
2397*b30d1939SAndy Fiddaman 	/*
2398*b30d1939SAndy Fiddaman 	 * kick the -I cache
2399*b30d1939SAndy Fiddaman 	 */
2400*b30d1939SAndy Fiddaman 
2401*b30d1939SAndy Fiddaman 	ppsearch(".", T_STRING, SEARCH_EXISTS);
2402*b30d1939SAndy Fiddaman 
2403*b30d1939SAndy Fiddaman 	/*
2404*b30d1939SAndy Fiddaman 	 * loop on < input output >
2405*b30d1939SAndy Fiddaman 	 */
2406*b30d1939SAndy Fiddaman 
2407*b30d1939SAndy Fiddaman 	pp.pool.input = 0;
2408*b30d1939SAndy Fiddaman 	while (ifile = sfgetr(sfstdin, '\n', 1))
2409*b30d1939SAndy Fiddaman 	{
2410*b30d1939SAndy Fiddaman 		if (!(ofile = strchr(ifile, ' ')))
2411*b30d1939SAndy Fiddaman 			error(3, "%s: pool output file expected", ifile);
2412*b30d1939SAndy Fiddaman 		*ofile++ = 0;
2413*b30d1939SAndy Fiddaman 		waitpid(0, NiL, WNOHANG);
2414*b30d1939SAndy Fiddaman 		switch (fork())
2415*b30d1939SAndy Fiddaman 		{
2416*b30d1939SAndy Fiddaman 		case -1:
2417*b30d1939SAndy Fiddaman 			error(ERROR_SYSTEM|3, "cannot fork pool");
2418*b30d1939SAndy Fiddaman 			/* FALLTHROUGH */
2419*b30d1939SAndy Fiddaman 		case 0:
2420*b30d1939SAndy Fiddaman 			atexit(poolstatus);
2421*b30d1939SAndy Fiddaman 			error_info.errors = 0;
2422*b30d1939SAndy Fiddaman 			error_info.warnings = 0;
2423*b30d1939SAndy Fiddaman 			close(0);
2424*b30d1939SAndy Fiddaman 			if (open(ifile, O_RDONLY))
2425*b30d1939SAndy Fiddaman 				error(ERROR_SYSTEM|3, "%s: cannot read", ifile);
2426*b30d1939SAndy Fiddaman 			close(1);
2427*b30d1939SAndy Fiddaman 			if (open(ofile, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) != 1)
2428*b30d1939SAndy Fiddaman 				error(ERROR_SYSTEM|3, "%s: cannot create", ofile);
2429*b30d1939SAndy Fiddaman 			pp.outfile = ofile;
2430*b30d1939SAndy Fiddaman 			pathcanon(ifile, 0, 0);
2431*b30d1939SAndy Fiddaman 			ifile = ppsetfile(ifile)->name;
2432*b30d1939SAndy Fiddaman #if CHECKPOINT
2433*b30d1939SAndy Fiddaman 			if (pp.mode & DUMP)
2434*b30d1939SAndy Fiddaman 			{
2435*b30d1939SAndy Fiddaman 				if (!pp.pragma)
2436*b30d1939SAndy Fiddaman 					error(3, "#%s must be enabled for checkpoints", dirname(PRAGMA));
2437*b30d1939SAndy Fiddaman 				(*pp.pragma)(dirname(PRAGMA), pp.pass, keyname(X_CHECKPOINT), pp.checkpoint, 1);
2438*b30d1939SAndy Fiddaman 			}
2439*b30d1939SAndy Fiddaman #endif
2440*b30d1939SAndy Fiddaman 			PUSH_FILE(ifile, 0);
2441*b30d1939SAndy Fiddaman 			return;
2442*b30d1939SAndy Fiddaman 		}
2443*b30d1939SAndy Fiddaman 	}
2444*b30d1939SAndy Fiddaman 	while (wait(NiL) != -1);
2445*b30d1939SAndy Fiddaman }
2446*b30d1939SAndy Fiddaman 
2447*b30d1939SAndy Fiddaman #endif
2448