xref: /titanic_50/usr/src/lib/libpp/common/ppfsm.h (revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968)
1*da2e3ebdSchin /***********************************************************************
2*da2e3ebdSchin *                                                                      *
3*da2e3ebdSchin *               This software is part of the ast package               *
4*da2e3ebdSchin *           Copyright (c) 1986-2007 AT&T Knowledge Ventures            *
5*da2e3ebdSchin *                      and is licensed under the                       *
6*da2e3ebdSchin *                  Common Public License, Version 1.0                  *
7*da2e3ebdSchin *                      by AT&T Knowledge Ventures                      *
8*da2e3ebdSchin *                                                                      *
9*da2e3ebdSchin *                A copy of the License is available at                 *
10*da2e3ebdSchin *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*da2e3ebdSchin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*da2e3ebdSchin *                                                                      *
13*da2e3ebdSchin *              Information and Software Systems Research               *
14*da2e3ebdSchin *                            AT&T Research                             *
15*da2e3ebdSchin *                           Florham Park NJ                            *
16*da2e3ebdSchin *                                                                      *
17*da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18*da2e3ebdSchin *                                                                      *
19*da2e3ebdSchin ***********************************************************************/
20*da2e3ebdSchin #pragma prototyped
21*da2e3ebdSchin /*
22*da2e3ebdSchin  * Glenn Fowler
23*da2e3ebdSchin  * AT&T Research
24*da2e3ebdSchin  *
25*da2e3ebdSchin  * preprocessor lexical analyzer definitions
26*da2e3ebdSchin  */
27*da2e3ebdSchin 
28*da2e3ebdSchin #ifndef _PPFSM_H
29*da2e3ebdSchin #define _PPFSM_H
30*da2e3ebdSchin 
31*da2e3ebdSchin #define BITSTATE	16		/* bitsof(state)		*/
32*da2e3ebdSchin #define BITNONTERM	7		/* bitsof(non-terminal-state)	*/
33*da2e3ebdSchin #define BITTERM		7		/* bitsof(terminal-state)	*/
34*da2e3ebdSchin #define NMAC		19		/* number of MAC states		*/
35*da2e3ebdSchin 
36*da2e3ebdSchin #define SPLICE		(1<<BITTERM)
37*da2e3ebdSchin 
38*da2e3ebdSchin #define	CODE(tok,act)	((((tok)-N_PP)<<(BITTERM+1))|(act))
39*da2e3ebdSchin #define TERM(st)	((st)&((1<<(BITTERM+1))-1))
40*da2e3ebdSchin #define NEXT(st)	(((st)>>(BITTERM+1))&((1<<BITNONTERM)-1))
41*da2e3ebdSchin #define QUAL(st)	(((st)<<(BITTERM+1))|(S_QUAL))
42*da2e3ebdSchin #define	TYPE(st)	(NEXT(st)+N_PP)
43*da2e3ebdSchin 
44*da2e3ebdSchin #define BACK(tok)	CODE(tok,S_TOKB)
45*da2e3ebdSchin #define KEEP(tok)	CODE(tok,S_TOK)
46*da2e3ebdSchin 
47*da2e3ebdSchin #undef	MAX
48*da2e3ebdSchin #define MAX		255
49*da2e3ebdSchin 
50*da2e3ebdSchin #undef	EOB
51*da2e3ebdSchin #define EOB		0
52*da2e3ebdSchin #undef	EOF
53*da2e3ebdSchin #define EOF		(MAX+1)
54*da2e3ebdSchin 
55*da2e3ebdSchin /*
56*da2e3ebdSchin  * FSM states
57*da2e3ebdSchin  *
58*da2e3ebdSchin  * NOTE: preserve the ranges
59*da2e3ebdSchin  */
60*da2e3ebdSchin 
61*da2e3ebdSchin #define INDEX(p)	(((p)-fsm[0])/(MAX+1))
62*da2e3ebdSchin 
63*da2e3ebdSchin #define IDSTATE(x)	(((x)>=0&&INQMACRO(fsm[x]))?QID:(x))
64*da2e3ebdSchin 
65*da2e3ebdSchin #define INCOMMENT(p)	((p)>=fsm[COM2]&&(p)<=fsm[COM7])
66*da2e3ebdSchin #define INCOMMENTXX(p)	((p)>=fsm[COM5]&&(p)<=fsm[COM7])
67*da2e3ebdSchin #define INQMACRO(p)	((p)>=fsm[MAC0]&&(p)<=fsm[LIT0])
68*da2e3ebdSchin #define INTMACRO(p)	((p)>=fsm[NID]&&(p)<=fsm[LIT])
69*da2e3ebdSchin #define INQUOTE(p)	((p)>=fsm[LIT1]&&(p)<=fsm[LIT2])
70*da2e3ebdSchin #define INOPSPACE(p)	((p)==fsm[BIN1])
71*da2e3ebdSchin #define INSPACE(p)	((p)==fsm[WS1])
72*da2e3ebdSchin 
73*da2e3ebdSchin /*
74*da2e3ebdSchin  * proto non-terminal states
75*da2e3ebdSchin  */
76*da2e3ebdSchin 
77*da2e3ebdSchin #define PROTO		0
78*da2e3ebdSchin #define RES1		(PROTO+1)
79*da2e3ebdSchin #define RES1a		(PROTO+2)
80*da2e3ebdSchin #define RES1e		(PROTO+3)
81*da2e3ebdSchin #define RES1f		(PROTO+4)
82*da2e3ebdSchin #define RES1h		(PROTO+5)
83*da2e3ebdSchin #define RES1l		(PROTO+6)
84*da2e3ebdSchin #define RES1n		(PROTO+7)
85*da2e3ebdSchin #define RES1o		(PROTO+8)
86*da2e3ebdSchin #define RES1t		(PROTO+9)
87*da2e3ebdSchin #define RES1x		(PROTO+10)
88*da2e3ebdSchin #define RES1y		(PROTO+11)
89*da2e3ebdSchin #define COM1		(PROTO+12)
90*da2e3ebdSchin #define COM2		(PROTO+13)
91*da2e3ebdSchin #define COM3		(PROTO+14)
92*da2e3ebdSchin #define COM4		(PROTO+15)
93*da2e3ebdSchin #define COM5		(PROTO+16)
94*da2e3ebdSchin #define COM6		(PROTO+17)
95*da2e3ebdSchin #define COM7		(PROTO+18)
96*da2e3ebdSchin #define NID		(PROTO+19)
97*da2e3ebdSchin #define LIT		(PROTO+20)
98*da2e3ebdSchin #define LIT1		(PROTO+21)
99*da2e3ebdSchin #define LIT2		(PROTO+22)
100*da2e3ebdSchin #define BAD1		(PROTO+23)
101*da2e3ebdSchin #define BAD2		(PROTO+24)
102*da2e3ebdSchin #define DOT		(PROTO+25)
103*da2e3ebdSchin #define DOT2		(PROTO+26)
104*da2e3ebdSchin #define WS1		(PROTO+27)
105*da2e3ebdSchin 
106*da2e3ebdSchin #if PROTOMAIN
107*da2e3ebdSchin 
108*da2e3ebdSchin #define TERMINAL	(PROTO+28)	/* PROTOMAIN */
109*da2e3ebdSchin 
110*da2e3ebdSchin #else
111*da2e3ebdSchin 
112*da2e3ebdSchin /*
113*da2e3ebdSchin  * quick non-terminal states
114*da2e3ebdSchin  */
115*da2e3ebdSchin 
116*da2e3ebdSchin #define QUICK		(PROTO+28)
117*da2e3ebdSchin #define QTOK		(QUICK+1)
118*da2e3ebdSchin #define QNUM		(QUICK+2)
119*da2e3ebdSchin #define QEXP		(QUICK+3)
120*da2e3ebdSchin #define QCOM		(QUICK+4)
121*da2e3ebdSchin #define QID		(QUICK+5)
122*da2e3ebdSchin #define MAC0		(QUICK+6)
123*da2e3ebdSchin #define MACN		(MAC0+NMAC-1)
124*da2e3ebdSchin #define HIT0		(MACN+1)
125*da2e3ebdSchin #define HITN		(HIT0+NMAC-1)
126*da2e3ebdSchin #define LIT0		(HITN+1)
127*da2e3ebdSchin #define SHARP1		(HITN+2)
128*da2e3ebdSchin 
129*da2e3ebdSchin /*
130*da2e3ebdSchin  * tokenize non-terminal states
131*da2e3ebdSchin  */
132*da2e3ebdSchin 
133*da2e3ebdSchin #define TOKEN		(HITN+3)
134*da2e3ebdSchin #define OCT1		(TOKEN+1)
135*da2e3ebdSchin #define OCT2		(TOKEN+2)
136*da2e3ebdSchin #define OCT3		(TOKEN+3)
137*da2e3ebdSchin #define NOT1		(TOKEN+4)
138*da2e3ebdSchin #define PCT1		(TOKEN+5)
139*da2e3ebdSchin #define AND1		(TOKEN+6)
140*da2e3ebdSchin #define STAR1		(TOKEN+7)
141*da2e3ebdSchin #define PLUS1		(TOKEN+8)
142*da2e3ebdSchin #define MINUS1		(TOKEN+9)
143*da2e3ebdSchin #define ARROW1		(TOKEN+10)
144*da2e3ebdSchin #define COLON1		(TOKEN+11)
145*da2e3ebdSchin #define LT1		(TOKEN+12)
146*da2e3ebdSchin #define LSH1		(TOKEN+13)
147*da2e3ebdSchin #define EQ1		(TOKEN+14)
148*da2e3ebdSchin #define RSH1		(TOKEN+15)
149*da2e3ebdSchin #define GT1		(TOKEN+16)
150*da2e3ebdSchin #define CIRC1		(TOKEN+17)
151*da2e3ebdSchin #define OR1		(TOKEN+18)
152*da2e3ebdSchin #define DEC1		(TOKEN+19)
153*da2e3ebdSchin #define DEC2		(TOKEN+20)
154*da2e3ebdSchin #define HEX1		(TOKEN+21)
155*da2e3ebdSchin #define HEX2		(TOKEN+22)
156*da2e3ebdSchin #define HEX3		(TOKEN+23)
157*da2e3ebdSchin #define HEX4		(TOKEN+24)
158*da2e3ebdSchin #define HEX5		(TOKEN+25)
159*da2e3ebdSchin #define HEX6		(TOKEN+26)
160*da2e3ebdSchin #define HEX7		(TOKEN+27)
161*da2e3ebdSchin #define HEX8		(TOKEN+28)
162*da2e3ebdSchin #define DBL1		(TOKEN+29)
163*da2e3ebdSchin #define DBL2		(TOKEN+30)
164*da2e3ebdSchin #define DBL3		(TOKEN+31)
165*da2e3ebdSchin #define DBL4		(TOKEN+32)
166*da2e3ebdSchin #define DBL5		(TOKEN+33)
167*da2e3ebdSchin #define DOT1		(TOKEN+34)
168*da2e3ebdSchin #define HDR1		(TOKEN+35)
169*da2e3ebdSchin #define BIN1		(TOKEN+36)
170*da2e3ebdSchin 
171*da2e3ebdSchin #define TERMINAL	(TOKEN+37)
172*da2e3ebdSchin 
173*da2e3ebdSchin #endif
174*da2e3ebdSchin 
175*da2e3ebdSchin /*
176*da2e3ebdSchin  * quick terminal states grouped together
177*da2e3ebdSchin  */
178*da2e3ebdSchin 
179*da2e3ebdSchin #define S_CHRB		(TERMINAL+0)
180*da2e3ebdSchin #define S_COMMENT	(TERMINAL+1)
181*da2e3ebdSchin #define S_EOB		(TERMINAL+2)
182*da2e3ebdSchin #define S_LITBEG	(TERMINAL+3)
183*da2e3ebdSchin #define S_LITEND	(TERMINAL+4)
184*da2e3ebdSchin #define S_LITESC	(TERMINAL+5)
185*da2e3ebdSchin #define S_MACRO		(TERMINAL+6)
186*da2e3ebdSchin #define S_NL		(TERMINAL+7)
187*da2e3ebdSchin #define S_QUAL		(TERMINAL+8)
188*da2e3ebdSchin #define S_SHARP		(TERMINAL+9)
189*da2e3ebdSchin #define S_VS		(TERMINAL+10)
190*da2e3ebdSchin 
191*da2e3ebdSchin /*
192*da2e3ebdSchin  * and the remaining terminal states
193*da2e3ebdSchin  */
194*da2e3ebdSchin 
195*da2e3ebdSchin #define S_CHR		(TERMINAL+11)
196*da2e3ebdSchin #define S_HUH		(TERMINAL+12)
197*da2e3ebdSchin #define S_TOK		(TERMINAL+13)
198*da2e3ebdSchin #define S_TOKB		(TERMINAL+14)
199*da2e3ebdSchin #define S_WS		(TERMINAL+15)
200*da2e3ebdSchin 
201*da2e3ebdSchin #define S_RESERVED	(S_HUH)
202*da2e3ebdSchin 
203*da2e3ebdSchin /*
204*da2e3ebdSchin  * the last terminal state (for tracing)
205*da2e3ebdSchin  */
206*da2e3ebdSchin 
207*da2e3ebdSchin #define LAST		(S_WS)
208*da2e3ebdSchin 
209*da2e3ebdSchin /*
210*da2e3ebdSchin  * pseudo terminal states
211*da2e3ebdSchin  */
212*da2e3ebdSchin 
213*da2e3ebdSchin #define S_EOF		(0)
214*da2e3ebdSchin 
215*da2e3ebdSchin /*
216*da2e3ebdSchin  * common lex macros
217*da2e3ebdSchin  *
218*da2e3ebdSchin  * NOTE: common local variable names assumed
219*da2e3ebdSchin  */
220*da2e3ebdSchin 
221*da2e3ebdSchin #define GET(p,c,tp,xp)	\
222*da2e3ebdSchin 	do \
223*da2e3ebdSchin 	{ \
224*da2e3ebdSchin 		if ((c = GETCHR()) == EOB && pp.in->type == IN_FILE) \
225*da2e3ebdSchin 			FGET(p, c, tp, xp); \
226*da2e3ebdSchin 	} while (0)
227*da2e3ebdSchin 
228*da2e3ebdSchin #define FGET(p,c,tp,xp)	\
229*da2e3ebdSchin 	do \
230*da2e3ebdSchin 	{ \
231*da2e3ebdSchin 		if (op > xp + PPTOKSIZ) \
232*da2e3ebdSchin 		{ \
233*da2e3ebdSchin 			if (!INCOMMENT(rp) && !(pp.state & (NOTEXT|SKIPCONTROL))) \
234*da2e3ebdSchin 				error(2, "long token truncated"); \
235*da2e3ebdSchin 			op = xp + PPTOKSIZ; \
236*da2e3ebdSchin 		} \
237*da2e3ebdSchin 		if ((pp.in->flags & IN_flush) && pp.level == 1 && !INMACRO(rp) && (!pp.comment || !INCOMMENT(rp)) && (c = op - pp.outbuf) > 0 && *(op - 1) == '\n') \
238*da2e3ebdSchin 		{ \
239*da2e3ebdSchin 			PPWRITE(c); \
240*da2e3ebdSchin 			op = tp = pp.outp = pp.outbuf; \
241*da2e3ebdSchin 		} \
242*da2e3ebdSchin 		SYNCIN(); \
243*da2e3ebdSchin 		refill(p); \
244*da2e3ebdSchin 		CACHEIN(); \
245*da2e3ebdSchin 		if ((c = GETCHR()) == EOB) BACKIN(); \
246*da2e3ebdSchin 	} while (0)
247*da2e3ebdSchin 
248*da2e3ebdSchin #define POP()		\
249*da2e3ebdSchin 	do \
250*da2e3ebdSchin 	{ \
251*da2e3ebdSchin 		debug((-7, "POP  in=%s next=%s state=%s", ppinstr(cur), pptokchr(*prv->nextchr), pplexstr(INDEX(rp)))); \
252*da2e3ebdSchin 		ip = (pp.in = prv)->nextchr; \
253*da2e3ebdSchin 	} while (0)
254*da2e3ebdSchin 
255*da2e3ebdSchin /*
256*da2e3ebdSchin  * fsm implementaion globals
257*da2e3ebdSchin  */
258*da2e3ebdSchin 
259*da2e3ebdSchin #define fsm		_pp_fsmtab
260*da2e3ebdSchin #define refill		_pp_refill
261*da2e3ebdSchin #define trigraph	_pp_trigraph
262*da2e3ebdSchin 
263*da2e3ebdSchin /*
264*da2e3ebdSchin  * first index is state, second is char, value is next state
265*da2e3ebdSchin  * except for fsm[TERMINAL] where second is state+1 for EOF transition
266*da2e3ebdSchin  */
267*da2e3ebdSchin 
268*da2e3ebdSchin extern short		fsm[TERMINAL+1][MAX+1];
269*da2e3ebdSchin 
270*da2e3ebdSchin /*
271*da2e3ebdSchin  * the index is char, value is trigraph value for <?><?><char>, 0 if invalid
272*da2e3ebdSchin  */
273*da2e3ebdSchin 
274*da2e3ebdSchin extern char		trigraph[MAX+1];
275*da2e3ebdSchin 
276*da2e3ebdSchin extern void		refill(int);
277*da2e3ebdSchin 
278*da2e3ebdSchin #endif
279