xref: /illumos-gate/usr/src/contrib/ast/src/lib/libpp/pp.h (revision b30d1939)
1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin *                                                                      *
3da2e3ebdSchin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1986-2011 AT&T Intellectual Property          *
5da2e3ebdSchin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
8da2e3ebdSchin *                                                                      *
9da2e3ebdSchin *                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)         *
12da2e3ebdSchin *                                                                      *
13da2e3ebdSchin *              Information and Software Systems Research               *
14da2e3ebdSchin *                            AT&T Research                             *
15da2e3ebdSchin *                           Florham Park NJ                            *
16da2e3ebdSchin *                                                                      *
17da2e3ebdSchin *                 Glenn Fowler <gsf@research.att.com>                  *
18da2e3ebdSchin *                                                                      *
19da2e3ebdSchin ***********************************************************************/
20da2e3ebdSchin #pragma prototyped
21da2e3ebdSchin /*
22da2e3ebdSchin  * Glenn Fowler
23da2e3ebdSchin  * AT&T Research
24da2e3ebdSchin  *
25da2e3ebdSchin  * preprocessor library public definitions
26da2e3ebdSchin  */
27da2e3ebdSchin 
28da2e3ebdSchin #ifndef _PP_H
29da2e3ebdSchin #define _PP_H
30da2e3ebdSchin 
31da2e3ebdSchin #ifdef ppsymbol
32da2e3ebdSchin /*
33da2e3ebdSchin  * undo old nmake cpp name-space intrusion
34da2e3ebdSchin  * this disables __LINE__, __FILE__, __DATE__ and __TIME__
35da2e3ebdSchin  */
36da2e3ebdSchin #undef	ppsymbol
37da2e3ebdSchin #undef	__LINE__
38da2e3ebdSchin #define __LINE__	0
39da2e3ebdSchin #undef	__FILE__
40da2e3ebdSchin #define __FILE__	"libpp"
41da2e3ebdSchin #undef	__DATE__
42da2e3ebdSchin #define __DATE__	"MMM DD YYYY"
43da2e3ebdSchin #undef	__TIME__
44da2e3ebdSchin #define __TIME__	"HH:MM:SS"
45da2e3ebdSchin #endif
46da2e3ebdSchin 
47da2e3ebdSchin 
48da2e3ebdSchin #if PROTOMAIN
49da2e3ebdSchin #define HASH_HEADER	int	hash_header
50da2e3ebdSchin #define Hash_table_t	char
51da2e3ebdSchin #define Sfio_t		char
52da2e3ebdSchin #define CC_bel		(('A'==0301)?0057:0007)
53da2e3ebdSchin #define CC_esc		(('A'==0301)?0047:0033)
54da2e3ebdSchin #define CC_vt		0013
55da2e3ebdSchin #else
56da2e3ebdSchin #include <limits.h>
57da2e3ebdSchin #include <hash.h>
58da2e3ebdSchin #include <error.h>
59da2e3ebdSchin #include <ccode.h>
60da2e3ebdSchin #endif
61da2e3ebdSchin 
62da2e3ebdSchin #define PPDEFAULT	"pp_default.h"		/* runtime definitions	*/
63da2e3ebdSchin #define PPPROBE		"cc"			/* default probe key	*/
64da2e3ebdSchin #define PPSTANDARD	"/usr/include"		/* standard include dir	*/
65da2e3ebdSchin 
66da2e3ebdSchin #define PPBLKSIZ	1024			/* unit block size	*/
67da2e3ebdSchin #define PPBAKSIZ	(1*PPBLKSIZ)		/* input pushback size	*/
68da2e3ebdSchin #define PPBUFSIZ	(32*PPBLKSIZ)		/* io buffer size	*/
69da2e3ebdSchin #define PPTOKSIZ	((PPBUFSIZ/2)-1)	/* max token size	*/
70da2e3ebdSchin 
717c2fbfb3SApril Chin #define PPWRITE(n)	do{if(write(1,pp.outbuf,n)!=(n))pperror(ERROR_SYSTEM|3,"%s: write error",pp.outfile);pp.offset+=(n);pp.lastout=pp.outbuf[(n)-1];}while(0)
72da2e3ebdSchin 
73da2e3ebdSchin #define pplastout()	((pp.outp>pp.outbuf)?*(pp.outp-1):pp.lastout)
74da2e3ebdSchin #define ppoffset()	(pp.offset+pppendout())
75da2e3ebdSchin #define pppendout()	(pp.outp-pp.outbuf)
76da2e3ebdSchin #define ppputchar(c)	(*pp.outp++=(c))
77da2e3ebdSchin #define ppflushout()	do{if(pp.outp>pp.outbuf){PPWRITE(pp.outp-pp.outbuf);pp.outp=pp.outbuf;}}while(0)
78da2e3ebdSchin #define ppcheckout()	do{if(pp.outp>pp.oute){PPWRITE(PPBUFSIZ);if(pp.outbuf==pp.outb){pp.outbuf+=PPBUFSIZ;pp.oute+=PPBUFSIZ;}else{pp.outbuf-=PPBUFSIZ;memcpy(pp.outbuf,pp.oute,pp.outp-pp.oute);pp.oute-=PPBUFSIZ;pp.outp-=2*PPBUFSIZ;}}}while(0)
79da2e3ebdSchin 
80da2e3ebdSchin #define ppsymget(t,n)	(struct ppsymbol*)hashlook(t,n,HASH_LOOKUP,NiL)
81da2e3ebdSchin #define ppsymref(t,n)	(struct ppsymbol*)hashlook(t,n,pp.truncate?HASH_LOOKUP:HASH_LOOKUP|HASH_INTERNAL,NiL)
82da2e3ebdSchin #define ppsymset(t,n)	(struct ppsymbol*)hashlook(t,n,HASH_CREATE|HASH_SIZE(sizeof(struct ppsymbol)),NiL)
83da2e3ebdSchin 
84da2e3ebdSchin #if CHAR_MIN < 0
8534f9b3eeSRoland Mainz #define pptype		(ppctype-(CHAR_MIN))
86da2e3ebdSchin #else
87da2e3ebdSchin #define pptype		(ppctype)
88da2e3ebdSchin #endif
89da2e3ebdSchin 
90da2e3ebdSchin #define C_ID		(1<<0)
91da2e3ebdSchin #define C_DIG		(1<<1)
92da2e3ebdSchin #define C_SPLICE	(1<<2)
93da2e3ebdSchin 
94da2e3ebdSchin #define ppisdig(c)	((pptype)[c]&C_DIG)
95da2e3ebdSchin #define ppisid(c)	((pptype)[c]&C_ID)
96da2e3ebdSchin #define ppisidig(c)	((pptype)[c]&(C_ID|C_DIG))
97da2e3ebdSchin #define ppismac(c)	((pptype)[c]&(C_ID|C_DIG|C_SPLICE))
98da2e3ebdSchin #define ppissplice(c)	((pptype)[c]&C_SPLICE)
99da2e3ebdSchin 
100da2e3ebdSchin #define setid(c)	((pptype)[c]|=C_ID)
101da2e3ebdSchin #define clrid(c)	((pptype)[c]&=~C_ID)
102da2e3ebdSchin #define setdig(c)	((pptype)[c]|=C_DIG)
103da2e3ebdSchin #define setsplice(c)	((pptype)[c]|=C_SPLICE)
104da2e3ebdSchin 
105da2e3ebdSchin #define REF_CREATE	(REF_NORMAL+1)	/* include wrapper (internal)	*/
106da2e3ebdSchin #define REF_DELETE	(REF_NORMAL+2)	/* macro definition (internal)	*/
107da2e3ebdSchin #define REF_NORMAL	0		/* normal macro reference	*/
108da2e3ebdSchin #define REF_IF		(-1)		/* if, ifdef, ifndef, elif	*/
109da2e3ebdSchin #define REF_UNDEF	(-2)		/* undef			*/
110da2e3ebdSchin 
111da2e3ebdSchin #define SYM_ACTIVE	(1L<<0)		/* active macro lock		*/
112da2e3ebdSchin #define SYM_BUILTIN	(1L<<1)		/* builtin macro		*/
113da2e3ebdSchin #define SYM_DISABLED	(1L<<2)		/* macro expansion disabled	*/
114da2e3ebdSchin #define SYM_EMPTY	(1L<<3)		/* allow empty/missing actuals	*/
115da2e3ebdSchin #define SYM_FINAL	(1L<<4)		/* final hosted value		*/
116da2e3ebdSchin #define SYM_FUNCTION	(1L<<5)		/* macro with args		*/
117da2e3ebdSchin #define SYM_INIT	(1L<<6)		/* initialization macro		*/
118da2e3ebdSchin #define SYM_INITIAL	(1L<<7)		/* initial hosted value		*/
119da2e3ebdSchin #define SYM_KEYWORD	(1L<<8)		/* keyword identifier		*/
120da2e3ebdSchin #define SYM_LEX		(1L<<9)		/* ppsymkey with lex field	*/
121da2e3ebdSchin #define SYM_MULTILINE	(1L<<10)	/* multi-line macro		*/
122da2e3ebdSchin #define SYM_NOEXPAND	(1L<<11)	/* no identifiers in macro body	*/
123da2e3ebdSchin #define SYM_NOTICED	(1L<<12)	/* symbol noticed in output	*/
124da2e3ebdSchin #define SYM_PREDEFINED	(1L<<13)	/* predefined macro		*/
125da2e3ebdSchin #define SYM_PREDICATE	(1L<<14)	/* also a predicate		*/
126da2e3ebdSchin #define SYM_READONLY	(1L<<15)	/* readonly macro		*/
127da2e3ebdSchin #define SYM_REDEFINE	(1L<<16)	/* ok to redefine		*/
128da2e3ebdSchin #define SYM_VARIADIC	(1L<<17)	/* variadic macro with args	*/
129da2e3ebdSchin #define SYM_UNUSED	24		/* first unused symbol flag bit	*/
130da2e3ebdSchin 
131da2e3ebdSchin #define PP_ASSERT		1	/* preassert symbol		*/
132da2e3ebdSchin #define PP_BUILTIN		2	/* #(<id>) handler		*/
133da2e3ebdSchin #define PP_CDIR			3	/* C (vs. C++) file dirs follow	*/
134da2e3ebdSchin #define PP_CHOP			4	/* include prefix chop		*/
135da2e3ebdSchin #define PP_COMMENT		5	/* passed comment handler	*/
136da2e3ebdSchin #define PP_COMPATIBILITY	6	/* old (Reiser) dialect		*/
137da2e3ebdSchin #define PP_COMPILE		7	/* tokenize for front end	*/
138da2e3ebdSchin #define PP_DEBUG		8	/* set debug trace level	*/
139da2e3ebdSchin #define PP_DEFINE		9	/* predefine symbol		*/
140da2e3ebdSchin #define PP_DEFAULT		10	/* read default include files	*/
141da2e3ebdSchin #define PP_DIRECTIVE		11	/* initialization directive	*/
142da2e3ebdSchin #define PP_DONE			12	/* all processing done		*/
143da2e3ebdSchin #define PP_DUMP			13	/* do checkpoint dump		*/
144da2e3ebdSchin #define PP_FILEDEPS		14	/* output file dependencies	*/
145da2e3ebdSchin #define PP_FILENAME		15	/* set input file name		*/
146da2e3ebdSchin #define PP_HOSTDIR		16	/* hosted file dirs follow	*/
147da2e3ebdSchin #define PP_ID			17	/* add to identifier set	*/
148da2e3ebdSchin #define PP_IGNORE		18	/* ignore this include file	*/
149da2e3ebdSchin #define PP_IGNORELIST		19	/* include ignore list file	*/
150da2e3ebdSchin #define PP_INCLUDE		20	/* add dir to include search	*/
151da2e3ebdSchin #define PP_INCREF		21	/* include file push/ret handler*/
152da2e3ebdSchin #define PP_INIT			22	/* one time initialization	*/
153da2e3ebdSchin #define PP_INPUT		23	/* set input source file	*/
154da2e3ebdSchin #define PP_KEYARGS		24	/* name=value macro args	*/
155da2e3ebdSchin #define PP_LINE			25	/* line sync handler		*/
156da2e3ebdSchin #define PP_LINEBASE		26	/* base name in line sync	*/
157da2e3ebdSchin #define PP_LINEFILE		27	/* line sync requires file arg	*/
158da2e3ebdSchin #define PP_LINEID		28	/* PP_LINE directive id		*/
159da2e3ebdSchin #define PP_LINETYPE		29	/* # extra line sync type args	*/
160da2e3ebdSchin #define PP_LOCAL		30	/* previous PP_INCLUDE for ""	*/
161da2e3ebdSchin #define PP_MACREF		31	/* macro def/ref handler	*/
162da2e3ebdSchin #define PP_MULTIPLE		32	/* set all files multiple	*/
163da2e3ebdSchin #define PP_NOHASH		33	/* don't hash PP_COMPILE T_ID's	*/
164da2e3ebdSchin #define PP_NOISE		34	/* convert T_X_* to T_NOISE	*/
165da2e3ebdSchin #define PP_OPTION		35	/* set pragma option		*/
166da2e3ebdSchin #define PP_OPTARG		36	/* unknown option arg handler	*/
167da2e3ebdSchin #define PP_OUTPUT		37	/* set output file sink		*/
168da2e3ebdSchin #define PP_PASSTHROUGH		38	/* ppcpp() expands # lines only	*/
169da2e3ebdSchin #define PP_PEDANTIC		39	/* pedantic non-hosted warnings	*/
170da2e3ebdSchin #define PP_PLUSCOMMENT		40	/* enable C++ comments		*/
171da2e3ebdSchin #define PP_PLUSPLUS		41	/* tokenize for C++		*/
172da2e3ebdSchin #define PP_POOL			42	/* pool for multiple io passes	*/
173da2e3ebdSchin #define PP_PRAGMA		43	/* passed pragma handler	*/
174da2e3ebdSchin #define PP_PRAGMAFLAGS		44	/* global pragma flags		*/
175da2e3ebdSchin #define PP_PROBE		45	/* ppdefault probe key		*/
176da2e3ebdSchin #define PP_QUOTE		46	/* add to quote set		*/
177da2e3ebdSchin #define PP_READ			47	/* include file without output	*/
178da2e3ebdSchin #define PP_REGUARD		48	/* file pop emits guard define	*/
179da2e3ebdSchin #define PP_RESERVED		49	/* COMPILE reserved keyword	*/
180da2e3ebdSchin #define PP_RESET		50	/* reset to initiali predefs	*/
181da2e3ebdSchin #define PP_SPACEOUT		51	/* pplex returns space,newline	*/
182da2e3ebdSchin #define PP_STANDALONE		52	/* standalone preprocessor	*/
183da2e3ebdSchin #define PP_STANDARD		53	/* standard include dir		*/
184da2e3ebdSchin #define PP_STRICT		54	/* strict implementation	*/
185da2e3ebdSchin #define PP_TEST			55	/* enable (undocumented) tests	*/
186da2e3ebdSchin #define PP_TEXT			56	/* include file with output	*/
187da2e3ebdSchin #define PP_TRANSITION		57	/* on COMPATIBILITY boundary	*/
188da2e3ebdSchin #define PP_TRUNCATE		58	/* truncate macro names		*/
189da2e3ebdSchin #define PP_UNDEF		59	/* undef symbol after ppdefault	*/
190da2e3ebdSchin #define PP_VENDOR		60	/* vendor file dirs follow	*/
191da2e3ebdSchin #define PP_WARN			61	/* enable annoying warnings	*/
192da2e3ebdSchin 
193da2e3ebdSchin #define PP_comment		(1<<0)	/* PP_COMMENT is set		*/
194da2e3ebdSchin #define PP_compatibility	(1<<1)	/* PP_COMPATIBILITY is set	*/
195da2e3ebdSchin #define PP_hosted		(1<<2)	/* current file is hosted	*/
196da2e3ebdSchin #define PP_linebase		(1<<3)	/* base name in line sync	*/
197da2e3ebdSchin #define PP_linefile		(1<<4)	/* line sync file arg required	*/
198da2e3ebdSchin #define PP_linehosted		(1<<5)	/* line sync hosted arg required*/
199da2e3ebdSchin #define PP_lineignore		(1<<6)	/* line sync for ignored file	*/
200da2e3ebdSchin #define PP_linetype		(1<<7)	/* line sync type arg required	*/
201da2e3ebdSchin #define PP_strict		(1<<8)	/* PP_STRICT is set		*/
202da2e3ebdSchin #define PP_transition		(1<<9)	/* PP_TRANSITION is set		*/
203da2e3ebdSchin 
204da2e3ebdSchin #define PP_deps			(1<<0)	/* generate header deps		*/
205da2e3ebdSchin #define PP_deps_file		(1<<1)	/* write deps to separate file	*/
206da2e3ebdSchin #define PP_deps_generated	(1<<2)	/* missing deps are generated	*/
207da2e3ebdSchin #define PP_deps_local		(1<<3)	/* only local header deps	*/
208da2e3ebdSchin 
209da2e3ebdSchin #define PP_sync			0	/* normal line sync		*/
210da2e3ebdSchin #define PP_sync_push		'1'	/* [3] include file push	*/
211da2e3ebdSchin #define PP_sync_pop		'2'	/* [3] include file pop		*/
212da2e3ebdSchin #define PP_sync_ignore		'3'	/* [3] ignored include file	*/
213da2e3ebdSchin #define PP_sync_hosted		'3'	/* [4] hosted include file	*/
214da2e3ebdSchin 
215da2e3ebdSchin #define PP_SYNC_PUSH		(1<<0)	/* pp.incref PP_sync_push type	*/
216da2e3ebdSchin #define PP_SYNC_POP		(1<<1)	/* pp.incref PP_sync_pop type	*/
217da2e3ebdSchin #define PP_SYNC_IGNORE		(1<<2)	/* pp.incref PP_sync_ignore type*/
218da2e3ebdSchin #define PP_SYNC_HOSTED		(1<<3)	/* pp.incref PP_sync_hosted type*/
219da2e3ebdSchin #define PP_SYNC_INSERT		(1<<4)	/* pinserted by other means	*/
220da2e3ebdSchin 
221da2e3ebdSchin /*
222da2e3ebdSchin  * numeric modifiers
223da2e3ebdSchin  *
224da2e3ebdSchin  * NOTE: 0400 is claimed by error in yacc
225da2e3ebdSchin  * 	 (N_PP+30) is the largest valid pp token
226da2e3ebdSchin  *	 free tokens start at T_TOKEN
227da2e3ebdSchin  */
228da2e3ebdSchin 
229da2e3ebdSchin #define N_PP			0401		/* pp tokens 0401..0437	*/
230da2e3ebdSchin #define N_NUMBER		0440		/* numbers 0440..0477	*/
231da2e3ebdSchin #define N_TEST			(N_NUMBER|07700)/* number test mask	*/
232da2e3ebdSchin #define N_TOKEN			0500		/* free 0500..07777	*/
233da2e3ebdSchin #define N_WIDE			1		/* wide quoted constant	*/
234da2e3ebdSchin 
235da2e3ebdSchin /*
236da2e3ebdSchin  * NOTE: preserve the token ranges and encodings for is*(x)
237da2e3ebdSchin  */
238da2e3ebdSchin 
239da2e3ebdSchin #define ppisnumber(x)		(((x)&N_TEST)==N_NUMBER)
240da2e3ebdSchin #define ppisinteger(x)		(((x)&(N_TEST|N_REAL))==N_NUMBER)
241da2e3ebdSchin #define ppisreal(x)		(((x)&(N_TEST|N_REAL))==(N_NUMBER|N_REAL))
242da2e3ebdSchin #define ppisassignop(x)		(((x)>=T_MPYEQ)&&((x)<=T_OREQ))
243da2e3ebdSchin #define ppisseparate(x)		(((x)>=N_PP)&&((x)<=T_WSTRING)||((x)>=N_NUMBER)||((x)=='+')||((x)=='-'))
244da2e3ebdSchin 
245da2e3ebdSchin #define N_LONG			0001
246da2e3ebdSchin #define N_UNSIGNED		0002		/* if ppisinteger(x)	*/
247da2e3ebdSchin #define N_FLOAT			0002		/* if ppisreal(x)		*/
248da2e3ebdSchin 
249da2e3ebdSchin #define N_REAL			0004
250da2e3ebdSchin #define N_OCTAL			0010
251da2e3ebdSchin #define N_HEXADECIMAL		0020
252da2e3ebdSchin 
253da2e3ebdSchin #define N_EXPONENT		010000		/* for lexing only	*/
254da2e3ebdSchin #define N_SIGN			020000		/* for lexing only	*/
255da2e3ebdSchin #define N_TRAILING		040000		/* for lexing only	*/
256da2e3ebdSchin 
257da2e3ebdSchin #if !defined(T_DOUBLE)
258da2e3ebdSchin 
259da2e3ebdSchin /*
260da2e3ebdSchin  * numeric constants
261da2e3ebdSchin  */
262da2e3ebdSchin 
263da2e3ebdSchin #define T_DOUBLE		(N_NUMBER|N_REAL)
264da2e3ebdSchin #define T_DOUBLE_L		(N_NUMBER|N_REAL|N_LONG)
265da2e3ebdSchin #define T_FLOAT			(N_NUMBER|N_REAL|N_FLOAT)
266da2e3ebdSchin #define T_DECIMAL		(N_NUMBER)
267da2e3ebdSchin #define T_DECIMAL_L		(N_NUMBER|N_LONG)
268da2e3ebdSchin #define T_DECIMAL_U		(N_NUMBER|N_UNSIGNED)
269da2e3ebdSchin #define T_DECIMAL_UL		(N_NUMBER|N_UNSIGNED|N_LONG)
270da2e3ebdSchin #define T_OCTAL			(N_NUMBER|N_OCTAL)
271da2e3ebdSchin #define T_OCTAL_L		(N_NUMBER|N_OCTAL|N_LONG)
272da2e3ebdSchin #define T_OCTAL_U		(N_NUMBER|N_OCTAL|N_UNSIGNED)
273da2e3ebdSchin #define T_OCTAL_UL		(N_NUMBER|N_OCTAL|N_UNSIGNED|N_LONG)
274da2e3ebdSchin #define T_HEXADECIMAL		(N_NUMBER|N_HEXADECIMAL)
275da2e3ebdSchin #define T_HEXADECIMAL_L		(N_NUMBER|N_HEXADECIMAL|N_LONG)
276da2e3ebdSchin #define T_HEXADECIMAL_U		(N_NUMBER|N_HEXADECIMAL|N_UNSIGNED)
277da2e3ebdSchin #define T_HEXADECIMAL_UL	(N_NUMBER|N_HEXADECIMAL|N_UNSIGNED|N_LONG)
278da2e3ebdSchin #define T_HEXDOUBLE		(N_NUMBER|N_HEXADECIMAL|N_REAL)
279da2e3ebdSchin #define T_HEXDOUBLE_L		(N_NUMBER|N_HEXADECIMAL|N_REAL|N_LONG)
280da2e3ebdSchin 
281da2e3ebdSchin /*
282da2e3ebdSchin  * identifier and invalid token
283da2e3ebdSchin  */
284da2e3ebdSchin 
285da2e3ebdSchin #define T_ID			(N_PP+0)
286da2e3ebdSchin #define T_INVALID		(N_PP+1)
287da2e3ebdSchin 
288da2e3ebdSchin /*
289da2e3ebdSchin  * quoted constants
290da2e3ebdSchin  */
291da2e3ebdSchin 
292da2e3ebdSchin #define T_HEADER		(N_PP+2)		/*	<..>	*/
293da2e3ebdSchin #define T_CHARCONST		(N_PP+3)		/*	'..'	*/
294da2e3ebdSchin #define T_WCHARCONST		(T_CHARCONST|N_WIDE)	/*	L'..'	*/
295da2e3ebdSchin #define T_STRING		(N_PP+5)		/*	".."	*/
296da2e3ebdSchin #define T_WSTRING		(T_STRING|N_WIDE)	/*	L".."	*/
297da2e3ebdSchin 
298da2e3ebdSchin /*
299da2e3ebdSchin  * multichar operators
300da2e3ebdSchin  */
301da2e3ebdSchin 
302da2e3ebdSchin #define T_PTRMEM		(N_PP+7)	/*	->	*/
303da2e3ebdSchin #define T_ADDADD		(N_PP+8)	/*	++	*/
304da2e3ebdSchin #define T_SUBSUB		(N_PP+9)	/*	--	*/
305da2e3ebdSchin #define T_LSHIFT		(N_PP+10)	/*	<<	*/
306da2e3ebdSchin #define T_RSHIFT		(N_PP+11)	/*	>>	*/
307da2e3ebdSchin #define T_LE			(N_PP+12)	/*	<=	*/
308da2e3ebdSchin #define T_GE			(N_PP+13)	/*	>=	*/
309da2e3ebdSchin #define T_EQ			(N_PP+14)	/*	==	*/
310da2e3ebdSchin #define T_NE			(N_PP+15)	/*	!=	*/
311da2e3ebdSchin #define T_ANDAND		(N_PP+16)	/*	&&	*/
312da2e3ebdSchin #define T_OROR			(N_PP+17)	/*	||	*/
313da2e3ebdSchin #define T_MPYEQ			(N_PP+18)	/*	*=	*/
314da2e3ebdSchin #define T_DIVEQ			(N_PP+19)	/*	/=	*/
315da2e3ebdSchin #define T_MODEQ			(N_PP+20)	/*	%=	*/
316da2e3ebdSchin #define T_ADDEQ			(N_PP+21)	/*	+=	*/
317da2e3ebdSchin #define T_SUBEQ			(N_PP+22)	/*	-=	*/
318da2e3ebdSchin #define T_LSHIFTEQ		(N_PP+23)	/*	<<=	*/
319da2e3ebdSchin #define T_RSHIFTEQ		(N_PP+24)	/*	>>=	*/
320da2e3ebdSchin #define T_ANDEQ			(N_PP+25)	/*	&=	*/
321da2e3ebdSchin #define T_XOREQ			(N_PP+26)	/*	^=	*/
322da2e3ebdSchin #define T_OREQ			(N_PP+27)	/*	|=	*/
323da2e3ebdSchin #define T_TOKCAT		(N_PP+28)	/*	##	*/
324da2e3ebdSchin #define T_VARIADIC		(N_PP+29)	/*	...	*/
325da2e3ebdSchin 
326da2e3ebdSchin /*
327da2e3ebdSchin  * C++ tokens
328da2e3ebdSchin  */
329da2e3ebdSchin 
330da2e3ebdSchin #define T_DOTREF		(N_TOKEN+0)	/*	.*	*/
331da2e3ebdSchin #define T_PTRMEMREF		(N_TOKEN+1)	/*	->*	*/
332da2e3ebdSchin #define T_SCOPE			(N_TOKEN+2)	/*	::	*/
333da2e3ebdSchin 
334da2e3ebdSchin /*
335da2e3ebdSchin  * compiler tokens
336da2e3ebdSchin  */
337da2e3ebdSchin 
338da2e3ebdSchin #define T_UMINUS		(N_TOKEN+3)
339da2e3ebdSchin 
340da2e3ebdSchin #endif
341da2e3ebdSchin 
342da2e3ebdSchin /*
343da2e3ebdSchin  * start of free tokens
344da2e3ebdSchin  */
345da2e3ebdSchin 
346da2e3ebdSchin #define T_TOKEN			(N_TOKEN+4)
347da2e3ebdSchin 
348da2e3ebdSchin struct ppdirs				/* directory list		*/
349da2e3ebdSchin {
350da2e3ebdSchin 	char*		name;		/* directory name		*/
351da2e3ebdSchin 	struct ppdirs*	next;		/* next in list			*/
352da2e3ebdSchin 
353da2e3ebdSchin #ifdef _PP_DIRS_PRIVATE_
354da2e3ebdSchin 	_PP_DIRS_PRIVATE_
355da2e3ebdSchin #endif
356da2e3ebdSchin 
357da2e3ebdSchin };
358da2e3ebdSchin 
359da2e3ebdSchin struct ppkeyword			/* pp keyword info		*/
360da2e3ebdSchin {
361da2e3ebdSchin 	char*		name;		/* keyword name			*/
362da2e3ebdSchin 	int		value;		/* keyword token value		*/
363da2e3ebdSchin };
364da2e3ebdSchin 
365da2e3ebdSchin struct ppmacro				/* pp macro info		*/
366da2e3ebdSchin {
367da2e3ebdSchin 	int		arity;		/* # formal arguments		*/
368da2e3ebdSchin 	char*		value;		/* definition value		*/
369da2e3ebdSchin 
370da2e3ebdSchin #ifdef _PP_MACRO_PRIVATE_
371da2e3ebdSchin 	_PP_MACRO_PRIVATE_
372da2e3ebdSchin #endif
373da2e3ebdSchin 
374da2e3ebdSchin };
375da2e3ebdSchin 
376da2e3ebdSchin struct ppsymbol				/* pp symbol info		*/
377da2e3ebdSchin {
378da2e3ebdSchin 	HASH_HEADER;			/* hash stuff and symbol name	*/
379da2e3ebdSchin 	unsigned long	flags;		/* SYM_* status			*/
380da2e3ebdSchin 	struct ppmacro*	macro;		/* macro info			*/
381da2e3ebdSchin 	void*		value;		/* value (for other passes)	*/
382da2e3ebdSchin 
383da2e3ebdSchin #ifdef _PP_SYMBOL_PRIVATE_
384da2e3ebdSchin 	_PP_SYMBOL_PRIVATE_
385da2e3ebdSchin #endif
386da2e3ebdSchin 
387da2e3ebdSchin };
388da2e3ebdSchin 
389da2e3ebdSchin #define _PP_CONTEXT_BASE_	((char*)&pp.lcldirs)
390da2e3ebdSchin 
391da2e3ebdSchin #define _PP_CONTEXT_PUBLIC_ \
392da2e3ebdSchin 	struct ppdirs*	lcldirs;	/* the "..." dir list		*/ \
393da2e3ebdSchin 	struct ppdirs*	stddirs;	/* next is the <...> dir list	*/ \
394da2e3ebdSchin 	int		flags;		/* PP_[a-z]* flags		*/ \
395da2e3ebdSchin 	Hash_table_t*	symtab;		/* macro and id hash table	*/
396da2e3ebdSchin 
397da2e3ebdSchin struct ppglobals			/* globals accessed by pp.*	*/
398da2e3ebdSchin {
399da2e3ebdSchin 	const char*	version;	/* version stamp		*/
400da2e3ebdSchin 	char*		lineid;		/* line sync directive id	*/
401da2e3ebdSchin 	char*		outfile;	/* output file name		*/
402da2e3ebdSchin 	char*		pass;		/* pass name			*/
403da2e3ebdSchin 	char*		token;		/* pplex() token name		*/
404da2e3ebdSchin 	struct ppsymbol* symbol;	/* last symbol if PP_COMPILE	*/
405da2e3ebdSchin 
406da2e3ebdSchin 	/* exposed for the output macros */
407da2e3ebdSchin 
408da2e3ebdSchin 	char*		outb;		/* output buffer base		*/
409da2e3ebdSchin 	char*		outbuf;		/* output buffer		*/
410da2e3ebdSchin 	char*		outp;	    	/* outbuf pointer		*/
411da2e3ebdSchin 	char*		oute;	    	/* outbuf end			*/
412da2e3ebdSchin 	unsigned long	offset;		/* output offset		*/
413da2e3ebdSchin 
414da2e3ebdSchin #ifdef _PP_CONTEXT_PUBLIC_
415da2e3ebdSchin 	_PP_CONTEXT_PUBLIC_		/* public context		*/
416da2e3ebdSchin #endif
417da2e3ebdSchin 
418da2e3ebdSchin #ifdef _PP_CONTEXT_PRIVATE_
419da2e3ebdSchin 	_PP_CONTEXT_PRIVATE_		/* library private context	*/
420da2e3ebdSchin #endif
421da2e3ebdSchin 
422da2e3ebdSchin #ifdef _PP_GLOBALS_PRIVATE_
423da2e3ebdSchin 	_PP_GLOBALS_PRIVATE_		/* library private additions	*/
424da2e3ebdSchin #endif
425da2e3ebdSchin 
426da2e3ebdSchin };
427da2e3ebdSchin 
428da2e3ebdSchin /*
429da2e3ebdSchin  * library interface globals
430da2e3ebdSchin  */
431da2e3ebdSchin 
432da2e3ebdSchin #define ppctype		_pp_ctype
433da2e3ebdSchin 
434da2e3ebdSchin extern struct ppglobals	pp;
435da2e3ebdSchin extern char		ppctype[];
436da2e3ebdSchin 
437da2e3ebdSchin extern int		ppargs(char**, int);
438da2e3ebdSchin extern void		ppcpp(void);
439da2e3ebdSchin extern void		ppcomment(char*, char*, char*, int);
440da2e3ebdSchin extern void*		ppcontext(void*, int);
441da2e3ebdSchin extern void		pperror(int, ...);
442da2e3ebdSchin extern void		ppincref(char*, char*, int, int);
443da2e3ebdSchin extern void		ppinput(char*, char*, int);
444da2e3ebdSchin extern int		pplex(void);
445da2e3ebdSchin extern void		ppline(int, char*);
446da2e3ebdSchin extern void		ppmacref(struct ppsymbol*, char*, int, int, unsigned long);
447da2e3ebdSchin extern void		ppop(int, ...);
448da2e3ebdSchin extern void		pppragma(char*, char*, char*, char*, int);
449da2e3ebdSchin extern int		ppprintf(char*, ...);
450da2e3ebdSchin extern int		ppsync(void);
451da2e3ebdSchin 
452da2e3ebdSchin #endif
453