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