xref: /dflybsd-src/contrib/gcc-4.7/libcpp/include/cpplib.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Definitions for CPP library.
2*e4b17023SJohn Marino    Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3*e4b17023SJohn Marino    2004, 2005, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino    Free Software Foundation, Inc.
5*e4b17023SJohn Marino    Written by Per Bothner, 1994-95.
6*e4b17023SJohn Marino 
7*e4b17023SJohn Marino This program is free software; you can redistribute it and/or modify it
8*e4b17023SJohn Marino under the terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino Free Software Foundation; either version 3, or (at your option) any
10*e4b17023SJohn Marino later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino This program is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
18*e4b17023SJohn Marino along with this program; see the file COPYING3.  If not see
19*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino  In other words, you are welcome to use, share and improve this program.
22*e4b17023SJohn Marino  You are forbidden to forbid anyone else to use, share and improve
23*e4b17023SJohn Marino  what you give them.   Help stamp out software-hoarding!  */
24*e4b17023SJohn Marino #ifndef LIBCPP_CPPLIB_H
25*e4b17023SJohn Marino #define LIBCPP_CPPLIB_H
26*e4b17023SJohn Marino 
27*e4b17023SJohn Marino #include <sys/types.h>
28*e4b17023SJohn Marino #include "symtab.h"
29*e4b17023SJohn Marino #include "line-map.h"
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino typedef struct cpp_reader cpp_reader;
32*e4b17023SJohn Marino typedef struct cpp_buffer cpp_buffer;
33*e4b17023SJohn Marino typedef struct cpp_options cpp_options;
34*e4b17023SJohn Marino typedef struct cpp_token cpp_token;
35*e4b17023SJohn Marino typedef struct cpp_string cpp_string;
36*e4b17023SJohn Marino typedef struct cpp_hashnode cpp_hashnode;
37*e4b17023SJohn Marino typedef struct cpp_macro cpp_macro;
38*e4b17023SJohn Marino typedef struct cpp_callbacks cpp_callbacks;
39*e4b17023SJohn Marino typedef struct cpp_dir cpp_dir;
40*e4b17023SJohn Marino 
41*e4b17023SJohn Marino struct answer;
42*e4b17023SJohn Marino struct _cpp_file;
43*e4b17023SJohn Marino 
44*e4b17023SJohn Marino /* The first three groups, apart from '=', can appear in preprocessor
45*e4b17023SJohn Marino    expressions (+= and -= are used to indicate unary + and - resp.).
46*e4b17023SJohn Marino    This allows a lookup table to be implemented in _cpp_parse_expr.
47*e4b17023SJohn Marino 
48*e4b17023SJohn Marino    The first group, to CPP_LAST_EQ, can be immediately followed by an
49*e4b17023SJohn Marino    '='.  The lexer needs operators ending in '=', like ">>=", to be in
50*e4b17023SJohn Marino    the same order as their counterparts without the '=', like ">>".
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino    See the cpp_operator table optab in expr.c if you change the order or
53*e4b17023SJohn Marino    add or remove anything in the first group.  */
54*e4b17023SJohn Marino 
55*e4b17023SJohn Marino #define TTYPE_TABLE							\
56*e4b17023SJohn Marino   OP(EQ,		"=")						\
57*e4b17023SJohn Marino   OP(NOT,		"!")						\
58*e4b17023SJohn Marino   OP(GREATER,		">")	/* compare */				\
59*e4b17023SJohn Marino   OP(LESS,		"<")						\
60*e4b17023SJohn Marino   OP(PLUS,		"+")	/* math */				\
61*e4b17023SJohn Marino   OP(MINUS,		"-")						\
62*e4b17023SJohn Marino   OP(MULT,		"*")						\
63*e4b17023SJohn Marino   OP(DIV,		"/")						\
64*e4b17023SJohn Marino   OP(MOD,		"%")						\
65*e4b17023SJohn Marino   OP(AND,		"&")	/* bit ops */				\
66*e4b17023SJohn Marino   OP(OR,		"|")						\
67*e4b17023SJohn Marino   OP(XOR,		"^")						\
68*e4b17023SJohn Marino   OP(RSHIFT,		">>")						\
69*e4b17023SJohn Marino   OP(LSHIFT,		"<<")						\
70*e4b17023SJohn Marino 									\
71*e4b17023SJohn Marino   OP(COMPL,		"~")						\
72*e4b17023SJohn Marino   OP(AND_AND,		"&&")	/* logical */				\
73*e4b17023SJohn Marino   OP(OR_OR,		"||")						\
74*e4b17023SJohn Marino   OP(QUERY,		"?")						\
75*e4b17023SJohn Marino   OP(COLON,		":")						\
76*e4b17023SJohn Marino   OP(COMMA,		",")	/* grouping */				\
77*e4b17023SJohn Marino   OP(OPEN_PAREN,	"(")						\
78*e4b17023SJohn Marino   OP(CLOSE_PAREN,	")")						\
79*e4b17023SJohn Marino   TK(EOF,		NONE)						\
80*e4b17023SJohn Marino   OP(EQ_EQ,		"==")	/* compare */				\
81*e4b17023SJohn Marino   OP(NOT_EQ,		"!=")						\
82*e4b17023SJohn Marino   OP(GREATER_EQ,	">=")						\
83*e4b17023SJohn Marino   OP(LESS_EQ,		"<=")						\
84*e4b17023SJohn Marino 									\
85*e4b17023SJohn Marino   /* These two are unary + / - in preprocessor expressions.  */		\
86*e4b17023SJohn Marino   OP(PLUS_EQ,		"+=")	/* math */				\
87*e4b17023SJohn Marino   OP(MINUS_EQ,		"-=")						\
88*e4b17023SJohn Marino 									\
89*e4b17023SJohn Marino   OP(MULT_EQ,		"*=")						\
90*e4b17023SJohn Marino   OP(DIV_EQ,		"/=")						\
91*e4b17023SJohn Marino   OP(MOD_EQ,		"%=")						\
92*e4b17023SJohn Marino   OP(AND_EQ,		"&=")	/* bit ops */				\
93*e4b17023SJohn Marino   OP(OR_EQ,		"|=")						\
94*e4b17023SJohn Marino   OP(XOR_EQ,		"^=")						\
95*e4b17023SJohn Marino   OP(RSHIFT_EQ,		">>=")						\
96*e4b17023SJohn Marino   OP(LSHIFT_EQ,		"<<=")						\
97*e4b17023SJohn Marino   /* Digraphs together, beginning with CPP_FIRST_DIGRAPH.  */		\
98*e4b17023SJohn Marino   OP(HASH,		"#")	/* digraphs */				\
99*e4b17023SJohn Marino   OP(PASTE,		"##")						\
100*e4b17023SJohn Marino   OP(OPEN_SQUARE,	"[")						\
101*e4b17023SJohn Marino   OP(CLOSE_SQUARE,	"]")						\
102*e4b17023SJohn Marino   OP(OPEN_BRACE,	"{")						\
103*e4b17023SJohn Marino   OP(CLOSE_BRACE,	"}")						\
104*e4b17023SJohn Marino   /* The remainder of the punctuation.	Order is not significant.  */	\
105*e4b17023SJohn Marino   OP(SEMICOLON,		";")	/* structure */				\
106*e4b17023SJohn Marino   OP(ELLIPSIS,		"...")						\
107*e4b17023SJohn Marino   OP(PLUS_PLUS,		"++")	/* increment */				\
108*e4b17023SJohn Marino   OP(MINUS_MINUS,	"--")						\
109*e4b17023SJohn Marino   OP(DEREF,		"->")	/* accessors */				\
110*e4b17023SJohn Marino   OP(DOT,		".")						\
111*e4b17023SJohn Marino   OP(SCOPE,		"::")						\
112*e4b17023SJohn Marino   OP(DEREF_STAR,	"->*")						\
113*e4b17023SJohn Marino   OP(DOT_STAR,		".*")						\
114*e4b17023SJohn Marino   OP(ATSIGN,		"@")  /* used in Objective-C */			\
115*e4b17023SJohn Marino 									\
116*e4b17023SJohn Marino   TK(NAME,		IDENT)	 /* word */				\
117*e4b17023SJohn Marino   TK(AT_NAME,		IDENT)	 /* @word - Objective-C */		\
118*e4b17023SJohn Marino   TK(NUMBER,		LITERAL) /* 34_be+ta  */			\
119*e4b17023SJohn Marino 									\
120*e4b17023SJohn Marino   TK(CHAR,		LITERAL) /* 'char' */				\
121*e4b17023SJohn Marino   TK(WCHAR,		LITERAL) /* L'char' */				\
122*e4b17023SJohn Marino   TK(CHAR16,		LITERAL) /* u'char' */				\
123*e4b17023SJohn Marino   TK(CHAR32,		LITERAL) /* U'char' */				\
124*e4b17023SJohn Marino   TK(OTHER,		LITERAL) /* stray punctuation */		\
125*e4b17023SJohn Marino 									\
126*e4b17023SJohn Marino   TK(STRING,		LITERAL) /* "string" */				\
127*e4b17023SJohn Marino   TK(WSTRING,		LITERAL) /* L"string" */			\
128*e4b17023SJohn Marino   TK(STRING16,		LITERAL) /* u"string" */			\
129*e4b17023SJohn Marino   TK(STRING32,		LITERAL) /* U"string" */			\
130*e4b17023SJohn Marino   TK(UTF8STRING,	LITERAL) /* u8"string" */			\
131*e4b17023SJohn Marino   TK(OBJC_STRING,	LITERAL) /* @"string" - Objective-C */		\
132*e4b17023SJohn Marino   TK(HEADER_NAME,	LITERAL) /* <stdio.h> in #include */		\
133*e4b17023SJohn Marino 									\
134*e4b17023SJohn Marino   TK(CHAR_USERDEF,	LITERAL) /* 'char'_suffix - C++-0x */		\
135*e4b17023SJohn Marino   TK(WCHAR_USERDEF,	LITERAL) /* L'char'_suffix - C++-0x */		\
136*e4b17023SJohn Marino   TK(CHAR16_USERDEF,	LITERAL) /* u'char'_suffix - C++-0x */		\
137*e4b17023SJohn Marino   TK(CHAR32_USERDEF,	LITERAL) /* U'char'_suffix - C++-0x */		\
138*e4b17023SJohn Marino   TK(STRING_USERDEF,	LITERAL) /* "string"_suffix - C++-0x */		\
139*e4b17023SJohn Marino   TK(WSTRING_USERDEF,	LITERAL) /* L"string"_suffix - C++-0x */	\
140*e4b17023SJohn Marino   TK(STRING16_USERDEF,	LITERAL) /* u"string"_suffix - C++-0x */	\
141*e4b17023SJohn Marino   TK(STRING32_USERDEF,	LITERAL) /* U"string"_suffix - C++-0x */	\
142*e4b17023SJohn Marino   TK(UTF8STRING_USERDEF,LITERAL) /* u8"string"_suffix - C++-0x */	\
143*e4b17023SJohn Marino 									\
144*e4b17023SJohn Marino   TK(COMMENT,		LITERAL) /* Only if output comments.  */	\
145*e4b17023SJohn Marino 				 /* SPELL_LITERAL happens to DTRT.  */	\
146*e4b17023SJohn Marino   TK(MACRO_ARG,		NONE)	 /* Macro argument.  */			\
147*e4b17023SJohn Marino   TK(PRAGMA,		NONE)	 /* Only for deferred pragmas.  */	\
148*e4b17023SJohn Marino   TK(PRAGMA_EOL,	NONE)	 /* End-of-line for deferred pragmas.  */ \
149*e4b17023SJohn Marino   TK(PADDING,		NONE)	 /* Whitespace for -E.	*/
150*e4b17023SJohn Marino 
151*e4b17023SJohn Marino #define OP(e, s) CPP_ ## e,
152*e4b17023SJohn Marino #define TK(e, s) CPP_ ## e,
153*e4b17023SJohn Marino enum cpp_ttype
154*e4b17023SJohn Marino {
155*e4b17023SJohn Marino   TTYPE_TABLE
156*e4b17023SJohn Marino   N_TTYPES,
157*e4b17023SJohn Marino 
158*e4b17023SJohn Marino   /* Positions in the table.  */
159*e4b17023SJohn Marino   CPP_LAST_EQ        = CPP_LSHIFT,
160*e4b17023SJohn Marino   CPP_FIRST_DIGRAPH  = CPP_HASH,
161*e4b17023SJohn Marino   CPP_LAST_PUNCTUATOR= CPP_ATSIGN,
162*e4b17023SJohn Marino   CPP_LAST_CPP_OP    = CPP_LESS_EQ
163*e4b17023SJohn Marino };
164*e4b17023SJohn Marino #undef OP
165*e4b17023SJohn Marino #undef TK
166*e4b17023SJohn Marino 
167*e4b17023SJohn Marino /* C language kind, used when calling cpp_create_reader.  */
168*e4b17023SJohn Marino enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC11,
169*e4b17023SJohn Marino 	     CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC11,
170*e4b17023SJohn Marino 	     CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX11, CLK_CXX11, CLK_ASM};
171*e4b17023SJohn Marino 
172*e4b17023SJohn Marino /* Payload of a NUMBER, STRING, CHAR or COMMENT token.  */
173*e4b17023SJohn Marino struct GTY(()) cpp_string {
174*e4b17023SJohn Marino   unsigned int len;
175*e4b17023SJohn Marino   const unsigned char *text;
176*e4b17023SJohn Marino };
177*e4b17023SJohn Marino 
178*e4b17023SJohn Marino /* Flags for the cpp_token structure.  */
179*e4b17023SJohn Marino #define PREV_WHITE	(1 << 0) /* If whitespace before this token.  */
180*e4b17023SJohn Marino #define DIGRAPH		(1 << 1) /* If it was a digraph.  */
181*e4b17023SJohn Marino #define STRINGIFY_ARG	(1 << 2) /* If macro argument to be stringified.  */
182*e4b17023SJohn Marino #define PASTE_LEFT	(1 << 3) /* If on LHS of a ## operator.  */
183*e4b17023SJohn Marino #define NAMED_OP	(1 << 4) /* C++ named operators.  */
184*e4b17023SJohn Marino #define NO_EXPAND	(1 << 5) /* Do not macro-expand this token.  */
185*e4b17023SJohn Marino #define BOL		(1 << 6) /* Token at beginning of line.  */
186*e4b17023SJohn Marino #define PURE_ZERO	(1 << 7) /* Single 0 digit, used by the C++ frontend,
187*e4b17023SJohn Marino 				    set in c-lex.c.  */
188*e4b17023SJohn Marino #define SP_DIGRAPH	(1 << 8) /* # or ## token was a digraph.  */
189*e4b17023SJohn Marino #define SP_PREV_WHITE	(1 << 9) /* If whitespace before a ##
190*e4b17023SJohn Marino 				    operator, or before this token
191*e4b17023SJohn Marino 				    after a # operator.  */
192*e4b17023SJohn Marino 
193*e4b17023SJohn Marino /* Specify which field, if any, of the cpp_token union is used.  */
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino enum cpp_token_fld_kind {
196*e4b17023SJohn Marino   CPP_TOKEN_FLD_NODE,
197*e4b17023SJohn Marino   CPP_TOKEN_FLD_SOURCE,
198*e4b17023SJohn Marino   CPP_TOKEN_FLD_STR,
199*e4b17023SJohn Marino   CPP_TOKEN_FLD_ARG_NO,
200*e4b17023SJohn Marino   CPP_TOKEN_FLD_TOKEN_NO,
201*e4b17023SJohn Marino   CPP_TOKEN_FLD_PRAGMA,
202*e4b17023SJohn Marino   CPP_TOKEN_FLD_NONE
203*e4b17023SJohn Marino };
204*e4b17023SJohn Marino 
205*e4b17023SJohn Marino /* A macro argument in the cpp_token union.  */
206*e4b17023SJohn Marino struct GTY(()) cpp_macro_arg {
207*e4b17023SJohn Marino   /* Argument number.  */
208*e4b17023SJohn Marino   unsigned int arg_no;
209*e4b17023SJohn Marino };
210*e4b17023SJohn Marino 
211*e4b17023SJohn Marino /* An identifier in the cpp_token union.  */
212*e4b17023SJohn Marino struct GTY(()) cpp_identifier {
213*e4b17023SJohn Marino   /* The canonical (UTF-8) spelling of the identifier.  */
214*e4b17023SJohn Marino   cpp_hashnode *
215*e4b17023SJohn Marino     GTY ((nested_ptr (union tree_node,
216*e4b17023SJohn Marino 		"%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
217*e4b17023SJohn Marino 			"%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
218*e4b17023SJohn Marino        node;
219*e4b17023SJohn Marino };
220*e4b17023SJohn Marino 
221*e4b17023SJohn Marino /* A preprocessing token.  This has been carefully packed and should
222*e4b17023SJohn Marino    occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts.  */
223*e4b17023SJohn Marino struct GTY(()) cpp_token {
224*e4b17023SJohn Marino   source_location src_loc;	/* Location of first char of token.  */
225*e4b17023SJohn Marino   ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT;  /* token type */
226*e4b17023SJohn Marino   unsigned short flags;		/* flags - see above */
227*e4b17023SJohn Marino 
228*e4b17023SJohn Marino   union cpp_token_u
229*e4b17023SJohn Marino   {
230*e4b17023SJohn Marino     /* An identifier.  */
231*e4b17023SJohn Marino     struct cpp_identifier GTY ((tag ("CPP_TOKEN_FLD_NODE"))) node;
232*e4b17023SJohn Marino 
233*e4b17023SJohn Marino     /* Inherit padding from this token.  */
234*e4b17023SJohn Marino     cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source;
235*e4b17023SJohn Marino 
236*e4b17023SJohn Marino     /* A string, or number.  */
237*e4b17023SJohn Marino     struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str;
238*e4b17023SJohn Marino 
239*e4b17023SJohn Marino     /* Argument no. for a CPP_MACRO_ARG.  */
240*e4b17023SJohn Marino     struct cpp_macro_arg GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) macro_arg;
241*e4b17023SJohn Marino 
242*e4b17023SJohn Marino     /* Original token no. for a CPP_PASTE (from a sequence of
243*e4b17023SJohn Marino        consecutive paste tokens in a macro expansion).  */
244*e4b17023SJohn Marino     unsigned int GTY ((tag ("CPP_TOKEN_FLD_TOKEN_NO"))) token_no;
245*e4b17023SJohn Marino 
246*e4b17023SJohn Marino     /* Caller-supplied identifier for a CPP_PRAGMA.  */
247*e4b17023SJohn Marino     unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma;
248*e4b17023SJohn Marino   } GTY ((desc ("cpp_token_val_index (&%1)"))) val;
249*e4b17023SJohn Marino };
250*e4b17023SJohn Marino 
251*e4b17023SJohn Marino /* Say which field is in use.  */
252*e4b17023SJohn Marino extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok);
253*e4b17023SJohn Marino 
254*e4b17023SJohn Marino /* A type wide enough to hold any multibyte source character.
255*e4b17023SJohn Marino    cpplib's character constant interpreter requires an unsigned type.
256*e4b17023SJohn Marino    Also, a typedef for the signed equivalent.
257*e4b17023SJohn Marino    The width of this type is capped at 32 bits; there do exist targets
258*e4b17023SJohn Marino    where wchar_t is 64 bits, but only in a non-default mode, and there
259*e4b17023SJohn Marino    would be no meaningful interpretation for a wchar_t value greater
260*e4b17023SJohn Marino    than 2^32 anyway -- the widest wide-character encoding around is
261*e4b17023SJohn Marino    ISO 10646, which stops at 2^31.  */
262*e4b17023SJohn Marino #if CHAR_BIT * SIZEOF_INT >= 32
263*e4b17023SJohn Marino # define CPPCHAR_SIGNED_T int
264*e4b17023SJohn Marino #elif CHAR_BIT * SIZEOF_LONG >= 32
265*e4b17023SJohn Marino # define CPPCHAR_SIGNED_T long
266*e4b17023SJohn Marino #else
267*e4b17023SJohn Marino # error "Cannot find a least-32-bit signed integer type"
268*e4b17023SJohn Marino #endif
269*e4b17023SJohn Marino typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
270*e4b17023SJohn Marino typedef CPPCHAR_SIGNED_T cppchar_signed_t;
271*e4b17023SJohn Marino 
272*e4b17023SJohn Marino /* Style of header dependencies to generate.  */
273*e4b17023SJohn Marino enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
274*e4b17023SJohn Marino 
275*e4b17023SJohn Marino /* The possible normalization levels, from most restrictive to least.  */
276*e4b17023SJohn Marino enum cpp_normalize_level {
277*e4b17023SJohn Marino   /* In NFKC.  */
278*e4b17023SJohn Marino   normalized_KC = 0,
279*e4b17023SJohn Marino   /* In NFC.  */
280*e4b17023SJohn Marino   normalized_C,
281*e4b17023SJohn Marino   /* In NFC, except for subsequences where being in NFC would make
282*e4b17023SJohn Marino      the identifier invalid.  */
283*e4b17023SJohn Marino   normalized_identifier_C,
284*e4b17023SJohn Marino   /* Not normalized at all.  */
285*e4b17023SJohn Marino   normalized_none
286*e4b17023SJohn Marino };
287*e4b17023SJohn Marino 
288*e4b17023SJohn Marino /* This structure is nested inside struct cpp_reader, and
289*e4b17023SJohn Marino    carries all the options visible to the command line.  */
290*e4b17023SJohn Marino struct cpp_options
291*e4b17023SJohn Marino {
292*e4b17023SJohn Marino   /* Characters between tab stops.  */
293*e4b17023SJohn Marino   unsigned int tabstop;
294*e4b17023SJohn Marino 
295*e4b17023SJohn Marino   /* The language we're preprocessing.  */
296*e4b17023SJohn Marino   enum c_lang lang;
297*e4b17023SJohn Marino 
298*e4b17023SJohn Marino   /* Nonzero means use extra default include directories for C++.  */
299*e4b17023SJohn Marino   unsigned char cplusplus;
300*e4b17023SJohn Marino 
301*e4b17023SJohn Marino   /* Nonzero means handle cplusplus style comments.  */
302*e4b17023SJohn Marino   unsigned char cplusplus_comments;
303*e4b17023SJohn Marino 
304*e4b17023SJohn Marino   /* Nonzero means define __OBJC__, treat @ as a special token, use
305*e4b17023SJohn Marino      the OBJC[PLUS]_INCLUDE_PATH environment variable, and allow
306*e4b17023SJohn Marino      "#import".  */
307*e4b17023SJohn Marino   unsigned char objc;
308*e4b17023SJohn Marino 
309*e4b17023SJohn Marino   /* Nonzero means don't copy comments into the output file.  */
310*e4b17023SJohn Marino   unsigned char discard_comments;
311*e4b17023SJohn Marino 
312*e4b17023SJohn Marino   /* Nonzero means don't copy comments into the output file during
313*e4b17023SJohn Marino      macro expansion.  */
314*e4b17023SJohn Marino   unsigned char discard_comments_in_macro_exp;
315*e4b17023SJohn Marino 
316*e4b17023SJohn Marino   /* Nonzero means process the ISO trigraph sequences.  */
317*e4b17023SJohn Marino   unsigned char trigraphs;
318*e4b17023SJohn Marino 
319*e4b17023SJohn Marino   /* Nonzero means process the ISO digraph sequences.  */
320*e4b17023SJohn Marino   unsigned char digraphs;
321*e4b17023SJohn Marino 
322*e4b17023SJohn Marino   /* Nonzero means to allow hexadecimal floats and LL suffixes.  */
323*e4b17023SJohn Marino   unsigned char extended_numbers;
324*e4b17023SJohn Marino 
325*e4b17023SJohn Marino   /* Nonzero means process u/U prefix literals (UTF-16/32).  */
326*e4b17023SJohn Marino   unsigned char uliterals;
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino   /* Nonzero means process r/R raw strings.  If this is set, uliterals
329*e4b17023SJohn Marino      must be set as well.  */
330*e4b17023SJohn Marino   unsigned char rliterals;
331*e4b17023SJohn Marino 
332*e4b17023SJohn Marino   /* Nonzero means print names of header files (-H).  */
333*e4b17023SJohn Marino   unsigned char print_include_names;
334*e4b17023SJohn Marino 
335*e4b17023SJohn Marino   /* Nonzero means complain about deprecated features.  */
336*e4b17023SJohn Marino   unsigned char cpp_warn_deprecated;
337*e4b17023SJohn Marino 
338*e4b17023SJohn Marino   /* Nonzero means warn if slash-star appears in a comment.  */
339*e4b17023SJohn Marino   unsigned char warn_comments;
340*e4b17023SJohn Marino 
341*e4b17023SJohn Marino   /* Nonzero means warn if a user-supplied include directory does not
342*e4b17023SJohn Marino      exist.  */
343*e4b17023SJohn Marino   unsigned char warn_missing_include_dirs;
344*e4b17023SJohn Marino 
345*e4b17023SJohn Marino   /* Nonzero means warn if there are any trigraphs.  */
346*e4b17023SJohn Marino   unsigned char warn_trigraphs;
347*e4b17023SJohn Marino 
348*e4b17023SJohn Marino   /* Nonzero means warn about multicharacter charconsts.  */
349*e4b17023SJohn Marino   unsigned char warn_multichar;
350*e4b17023SJohn Marino 
351*e4b17023SJohn Marino   /* Nonzero means warn about various incompatibilities with
352*e4b17023SJohn Marino      traditional C.  */
353*e4b17023SJohn Marino   unsigned char cpp_warn_traditional;
354*e4b17023SJohn Marino 
355*e4b17023SJohn Marino   /* Nonzero means warn about long long numeric constants.  */
356*e4b17023SJohn Marino   unsigned char cpp_warn_long_long;
357*e4b17023SJohn Marino 
358*e4b17023SJohn Marino   /* Nonzero means warn about text after an #endif (or #else).  */
359*e4b17023SJohn Marino   unsigned char warn_endif_labels;
360*e4b17023SJohn Marino 
361*e4b17023SJohn Marino   /* Nonzero means warn about implicit sign changes owing to integer
362*e4b17023SJohn Marino      promotions.  */
363*e4b17023SJohn Marino   unsigned char warn_num_sign_change;
364*e4b17023SJohn Marino 
365*e4b17023SJohn Marino   /* Zero means don't warn about __VA_ARGS__ usage in c89 pedantic mode.
366*e4b17023SJohn Marino      Presumably the usage is protected by the appropriate #ifdef.  */
367*e4b17023SJohn Marino   unsigned char warn_variadic_macros;
368*e4b17023SJohn Marino 
369*e4b17023SJohn Marino   /* Nonzero means warn about builtin macros that are redefined or
370*e4b17023SJohn Marino      explicitly undefined.  */
371*e4b17023SJohn Marino   unsigned char warn_builtin_macro_redefined;
372*e4b17023SJohn Marino 
373*e4b17023SJohn Marino   /* Nonzero means we should look for header.gcc files that remap file
374*e4b17023SJohn Marino      names.  */
375*e4b17023SJohn Marino   unsigned char remap;
376*e4b17023SJohn Marino 
377*e4b17023SJohn Marino   /* Zero means dollar signs are punctuation.  */
378*e4b17023SJohn Marino   unsigned char dollars_in_ident;
379*e4b17023SJohn Marino 
380*e4b17023SJohn Marino   /* Nonzero means UCNs are accepted in identifiers.  */
381*e4b17023SJohn Marino   unsigned char extended_identifiers;
382*e4b17023SJohn Marino 
383*e4b17023SJohn Marino   /* True if we should warn about dollars in identifiers or numbers
384*e4b17023SJohn Marino      for this translation unit.  */
385*e4b17023SJohn Marino   unsigned char warn_dollars;
386*e4b17023SJohn Marino 
387*e4b17023SJohn Marino   /* Nonzero means warn if undefined identifiers are evaluated in an #if.  */
388*e4b17023SJohn Marino   unsigned char warn_undef;
389*e4b17023SJohn Marino 
390*e4b17023SJohn Marino   /* Nonzero means warn of unused macros from the main file.  */
391*e4b17023SJohn Marino   unsigned char warn_unused_macros;
392*e4b17023SJohn Marino 
393*e4b17023SJohn Marino   /* Nonzero for the 1999 C Standard, including corrigenda and amendments.  */
394*e4b17023SJohn Marino   unsigned char c99;
395*e4b17023SJohn Marino 
396*e4b17023SJohn Marino   /* Nonzero if we are conforming to a specific C or C++ standard.  */
397*e4b17023SJohn Marino   unsigned char std;
398*e4b17023SJohn Marino 
399*e4b17023SJohn Marino   /* Nonzero means give all the error messages the ANSI standard requires.  */
400*e4b17023SJohn Marino   unsigned char cpp_pedantic;
401*e4b17023SJohn Marino 
402*e4b17023SJohn Marino   /* Nonzero means we're looking at already preprocessed code, so don't
403*e4b17023SJohn Marino      bother trying to do macro expansion and whatnot.  */
404*e4b17023SJohn Marino   unsigned char preprocessed;
405*e4b17023SJohn Marino 
406*e4b17023SJohn Marino   /* Nonzero means we are going to emit debugging logs during
407*e4b17023SJohn Marino      preprocessing.  */
408*e4b17023SJohn Marino   unsigned char debug;
409*e4b17023SJohn Marino 
410*e4b17023SJohn Marino   /* Nonzero means we are tracking locations of tokens involved in
411*e4b17023SJohn Marino      macro expansion. 1 Means we track the location in degraded mode
412*e4b17023SJohn Marino      where we do not track locations of tokens resulting from the
413*e4b17023SJohn Marino      expansion of arguments of function-like macro.  2 Means we do
414*e4b17023SJohn Marino      track all macro expansions. This last option is the one that
415*e4b17023SJohn Marino      consumes the highest amount of memory.  */
416*e4b17023SJohn Marino   unsigned char track_macro_expansion;
417*e4b17023SJohn Marino 
418*e4b17023SJohn Marino   /* Nonzero means handle C++ alternate operator names.  */
419*e4b17023SJohn Marino   unsigned char operator_names;
420*e4b17023SJohn Marino 
421*e4b17023SJohn Marino   /* Nonzero means warn about use of C++ alternate operator names.  */
422*e4b17023SJohn Marino   unsigned char warn_cxx_operator_names;
423*e4b17023SJohn Marino 
424*e4b17023SJohn Marino   /* True for traditional preprocessing.  */
425*e4b17023SJohn Marino   unsigned char traditional;
426*e4b17023SJohn Marino 
427*e4b17023SJohn Marino   /* Nonzero for C++ 2011 Standard user-defnied literals.  */
428*e4b17023SJohn Marino   unsigned char user_literals;
429*e4b17023SJohn Marino 
430*e4b17023SJohn Marino   /* Holds the name of the target (execution) character set.  */
431*e4b17023SJohn Marino   const char *narrow_charset;
432*e4b17023SJohn Marino 
433*e4b17023SJohn Marino   /* Holds the name of the target wide character set.  */
434*e4b17023SJohn Marino   const char *wide_charset;
435*e4b17023SJohn Marino 
436*e4b17023SJohn Marino   /* Holds the name of the input character set.  */
437*e4b17023SJohn Marino   const char *input_charset;
438*e4b17023SJohn Marino 
439*e4b17023SJohn Marino   /* The minimum permitted level of normalization before a warning
440*e4b17023SJohn Marino      is generated.  */
441*e4b17023SJohn Marino   enum cpp_normalize_level warn_normalize;
442*e4b17023SJohn Marino 
443*e4b17023SJohn Marino   /* True to warn about precompiled header files we couldn't use.  */
444*e4b17023SJohn Marino   bool warn_invalid_pch;
445*e4b17023SJohn Marino 
446*e4b17023SJohn Marino   /* True if dependencies should be restored from a precompiled header.  */
447*e4b17023SJohn Marino   bool restore_pch_deps;
448*e4b17023SJohn Marino 
449*e4b17023SJohn Marino   /* Dependency generation.  */
450*e4b17023SJohn Marino   struct
451*e4b17023SJohn Marino   {
452*e4b17023SJohn Marino     /* Style of header dependencies to generate.  */
453*e4b17023SJohn Marino     enum cpp_deps_style style;
454*e4b17023SJohn Marino 
455*e4b17023SJohn Marino     /* Assume missing files are generated files.  */
456*e4b17023SJohn Marino     bool missing_files;
457*e4b17023SJohn Marino 
458*e4b17023SJohn Marino     /* Generate phony targets for each dependency apart from the first
459*e4b17023SJohn Marino        one.  */
460*e4b17023SJohn Marino     bool phony_targets;
461*e4b17023SJohn Marino 
462*e4b17023SJohn Marino     /* If true, no dependency is generated on the main file.  */
463*e4b17023SJohn Marino     bool ignore_main_file;
464*e4b17023SJohn Marino 
465*e4b17023SJohn Marino     /* If true, intend to use the preprocessor output (e.g., for compilation)
466*e4b17023SJohn Marino        in addition to the dependency info.  */
467*e4b17023SJohn Marino     bool need_preprocessor_output;
468*e4b17023SJohn Marino   } deps;
469*e4b17023SJohn Marino 
470*e4b17023SJohn Marino   /* Target-specific features set by the front end or client.  */
471*e4b17023SJohn Marino 
472*e4b17023SJohn Marino   /* Precision for target CPP arithmetic, target characters, target
473*e4b17023SJohn Marino      ints and target wide characters, respectively.  */
474*e4b17023SJohn Marino   size_t precision, char_precision, int_precision, wchar_precision;
475*e4b17023SJohn Marino 
476*e4b17023SJohn Marino   /* True means chars (wide chars) are unsigned.  */
477*e4b17023SJohn Marino   bool unsigned_char, unsigned_wchar;
478*e4b17023SJohn Marino 
479*e4b17023SJohn Marino   /* True if the most significant byte in a word has the lowest
480*e4b17023SJohn Marino      address in memory.  */
481*e4b17023SJohn Marino   bool bytes_big_endian;
482*e4b17023SJohn Marino 
483*e4b17023SJohn Marino   /* Nonzero means __STDC__ should have the value 0 in system headers.  */
484*e4b17023SJohn Marino   unsigned char stdc_0_in_system_headers;
485*e4b17023SJohn Marino 
486*e4b17023SJohn Marino   /* True disables tokenization outside of preprocessing directives. */
487*e4b17023SJohn Marino   bool directives_only;
488*e4b17023SJohn Marino };
489*e4b17023SJohn Marino 
490*e4b17023SJohn Marino /* Callback for header lookup for HEADER, which is the name of a
491*e4b17023SJohn Marino    source file.  It is used as a method of last resort to find headers
492*e4b17023SJohn Marino    that are not otherwise found during the normal include processing.
493*e4b17023SJohn Marino    The return value is the malloced name of a header to try and open,
494*e4b17023SJohn Marino    if any, or NULL otherwise.  This callback is called only if the
495*e4b17023SJohn Marino    header is otherwise unfound.  */
496*e4b17023SJohn Marino typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **);
497*e4b17023SJohn Marino 
498*e4b17023SJohn Marino /* Call backs to cpplib client.  */
499*e4b17023SJohn Marino struct cpp_callbacks
500*e4b17023SJohn Marino {
501*e4b17023SJohn Marino   /* Called when a new line of preprocessed output is started.  */
502*e4b17023SJohn Marino   void (*line_change) (cpp_reader *, const cpp_token *, int);
503*e4b17023SJohn Marino 
504*e4b17023SJohn Marino   /* Called when switching to/from a new file.
505*e4b17023SJohn Marino      The line_map is for the new file.  It is NULL if there is no new file.
506*e4b17023SJohn Marino      (In C this happens when done with <built-in>+<command line> and also
507*e4b17023SJohn Marino      when done with a main file.)  This can be used for resource cleanup.  */
508*e4b17023SJohn Marino   void (*file_change) (cpp_reader *, const struct line_map *);
509*e4b17023SJohn Marino 
510*e4b17023SJohn Marino   void (*dir_change) (cpp_reader *, const char *);
511*e4b17023SJohn Marino   void (*include) (cpp_reader *, source_location, const unsigned char *,
512*e4b17023SJohn Marino 		   const char *, int, const cpp_token **);
513*e4b17023SJohn Marino   void (*define) (cpp_reader *, source_location, cpp_hashnode *);
514*e4b17023SJohn Marino   void (*undef) (cpp_reader *, source_location, cpp_hashnode *);
515*e4b17023SJohn Marino   void (*ident) (cpp_reader *, source_location, const cpp_string *);
516*e4b17023SJohn Marino   void (*def_pragma) (cpp_reader *, source_location);
517*e4b17023SJohn Marino   int (*valid_pch) (cpp_reader *, const char *, int);
518*e4b17023SJohn Marino   void (*read_pch) (cpp_reader *, const char *, int, const char *);
519*e4b17023SJohn Marino   missing_header_cb missing_header;
520*e4b17023SJohn Marino 
521*e4b17023SJohn Marino   /* Context-sensitive macro support.  Returns macro (if any) that should
522*e4b17023SJohn Marino      be expanded.  */
523*e4b17023SJohn Marino   cpp_hashnode * (*macro_to_expand) (cpp_reader *, const cpp_token *);
524*e4b17023SJohn Marino 
525*e4b17023SJohn Marino   /* Called to emit a diagnostic.  This callback receives the
526*e4b17023SJohn Marino      translated message.  */
527*e4b17023SJohn Marino   bool (*error) (cpp_reader *, int, int, source_location, unsigned int,
528*e4b17023SJohn Marino 		 const char *, va_list *)
529*e4b17023SJohn Marino        ATTRIBUTE_FPTR_PRINTF(6,0);
530*e4b17023SJohn Marino 
531*e4b17023SJohn Marino   /* Callbacks for when a macro is expanded, or tested (whether
532*e4b17023SJohn Marino      defined or not at the time) in #ifdef, #ifndef or "defined".  */
533*e4b17023SJohn Marino   void (*used_define) (cpp_reader *, source_location, cpp_hashnode *);
534*e4b17023SJohn Marino   void (*used_undef) (cpp_reader *, source_location, cpp_hashnode *);
535*e4b17023SJohn Marino   /* Called before #define and #undef or other macro definition
536*e4b17023SJohn Marino      changes are processed.  */
537*e4b17023SJohn Marino   void (*before_define) (cpp_reader *);
538*e4b17023SJohn Marino   /* Called whenever a macro is expanded or tested.
539*e4b17023SJohn Marino      Second argument is the location of the start of the current expansion.  */
540*e4b17023SJohn Marino   void (*used) (cpp_reader *, source_location, cpp_hashnode *);
541*e4b17023SJohn Marino 
542*e4b17023SJohn Marino   /* Callback that can change a user builtin into normal macro.  */
543*e4b17023SJohn Marino   bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *);
544*e4b17023SJohn Marino };
545*e4b17023SJohn Marino 
546*e4b17023SJohn Marino #ifdef VMS
547*e4b17023SJohn Marino #define INO_T_CPP ino_t ino[3]
548*e4b17023SJohn Marino #else
549*e4b17023SJohn Marino #define INO_T_CPP ino_t ino
550*e4b17023SJohn Marino #endif
551*e4b17023SJohn Marino 
552*e4b17023SJohn Marino /* Chain of directories to look for include files in.  */
553*e4b17023SJohn Marino struct cpp_dir
554*e4b17023SJohn Marino {
555*e4b17023SJohn Marino   /* NULL-terminated singly-linked list.  */
556*e4b17023SJohn Marino   struct cpp_dir *next;
557*e4b17023SJohn Marino 
558*e4b17023SJohn Marino   /* NAME of the directory, NUL-terminated.  */
559*e4b17023SJohn Marino   char *name;
560*e4b17023SJohn Marino   unsigned int len;
561*e4b17023SJohn Marino 
562*e4b17023SJohn Marino   /* One if a system header, two if a system header that has extern
563*e4b17023SJohn Marino      "C" guards for C++.  */
564*e4b17023SJohn Marino   unsigned char sysp;
565*e4b17023SJohn Marino 
566*e4b17023SJohn Marino   /* Is this a user-supplied directory? */
567*e4b17023SJohn Marino   bool user_supplied_p;
568*e4b17023SJohn Marino 
569*e4b17023SJohn Marino   /* The canonicalized NAME as determined by lrealpath.  This field
570*e4b17023SJohn Marino      is only used by hosts that lack reliable inode numbers.  */
571*e4b17023SJohn Marino   char *canonical_name;
572*e4b17023SJohn Marino 
573*e4b17023SJohn Marino   /* Mapping of file names for this directory for MS-DOS and related
574*e4b17023SJohn Marino      platforms.  A NULL-terminated array of (from, to) pairs.  */
575*e4b17023SJohn Marino   const char **name_map;
576*e4b17023SJohn Marino 
577*e4b17023SJohn Marino   /* Routine to construct pathname, given the search path name and the
578*e4b17023SJohn Marino      HEADER we are trying to find, return a constructed pathname to
579*e4b17023SJohn Marino      try and open.  If this is NULL, the constructed pathname is as
580*e4b17023SJohn Marino      constructed by append_file_to_dir.  */
581*e4b17023SJohn Marino   char *(*construct) (const char *header, cpp_dir *dir);
582*e4b17023SJohn Marino 
583*e4b17023SJohn Marino   /* The C front end uses these to recognize duplicated
584*e4b17023SJohn Marino      directories in the search path.  */
585*e4b17023SJohn Marino   INO_T_CPP;
586*e4b17023SJohn Marino   dev_t dev;
587*e4b17023SJohn Marino };
588*e4b17023SJohn Marino 
589*e4b17023SJohn Marino /* The structure of a node in the hash table.  The hash table has
590*e4b17023SJohn Marino    entries for all identifiers: either macros defined by #define
591*e4b17023SJohn Marino    commands (type NT_MACRO), assertions created with #assert
592*e4b17023SJohn Marino    (NT_ASSERTION), or neither of the above (NT_VOID).  Builtin macros
593*e4b17023SJohn Marino    like __LINE__ are flagged NODE_BUILTIN.  Poisoned identifiers are
594*e4b17023SJohn Marino    flagged NODE_POISONED.  NODE_OPERATOR (C++ only) indicates an
595*e4b17023SJohn Marino    identifier that behaves like an operator such as "xor".
596*e4b17023SJohn Marino    NODE_DIAGNOSTIC is for speed in lex_token: it indicates a
597*e4b17023SJohn Marino    diagnostic may be required for this node.  Currently this only
598*e4b17023SJohn Marino    applies to __VA_ARGS__, poisoned identifiers, and -Wc++-compat
599*e4b17023SJohn Marino    warnings about NODE_OPERATOR.  */
600*e4b17023SJohn Marino 
601*e4b17023SJohn Marino /* Hash node flags.  */
602*e4b17023SJohn Marino #define NODE_OPERATOR	(1 << 0)	/* C++ named operator.  */
603*e4b17023SJohn Marino #define NODE_POISONED	(1 << 1)	/* Poisoned identifier.  */
604*e4b17023SJohn Marino #define NODE_BUILTIN	(1 << 2)	/* Builtin macro.  */
605*e4b17023SJohn Marino #define NODE_DIAGNOSTIC (1 << 3)	/* Possible diagnostic when lexed.  */
606*e4b17023SJohn Marino #define NODE_WARN	(1 << 4)	/* Warn if redefined or undefined.  */
607*e4b17023SJohn Marino #define NODE_DISABLED	(1 << 5)	/* A disabled macro.  */
608*e4b17023SJohn Marino #define NODE_MACRO_ARG	(1 << 6)	/* Used during #define processing.  */
609*e4b17023SJohn Marino #define NODE_USED	(1 << 7)	/* Dumped with -dU.  */
610*e4b17023SJohn Marino #define NODE_CONDITIONAL (1 << 8)	/* Conditional macro */
611*e4b17023SJohn Marino #define NODE_WARN_OPERATOR (1 << 9)	/* Warn about C++ named operator.  */
612*e4b17023SJohn Marino 
613*e4b17023SJohn Marino /* Different flavors of hash node.  */
614*e4b17023SJohn Marino enum node_type
615*e4b17023SJohn Marino {
616*e4b17023SJohn Marino   NT_VOID = 0,	   /* No definition yet.  */
617*e4b17023SJohn Marino   NT_MACRO,	   /* A macro of some form.  */
618*e4b17023SJohn Marino   NT_ASSERTION	   /* Predicate for #assert.  */
619*e4b17023SJohn Marino };
620*e4b17023SJohn Marino 
621*e4b17023SJohn Marino /* Different flavors of builtin macro.  _Pragma is an operator, but we
622*e4b17023SJohn Marino    handle it with the builtin code for efficiency reasons.  */
623*e4b17023SJohn Marino enum cpp_builtin_type
624*e4b17023SJohn Marino {
625*e4b17023SJohn Marino   BT_SPECLINE = 0,		/* `__LINE__' */
626*e4b17023SJohn Marino   BT_DATE,			/* `__DATE__' */
627*e4b17023SJohn Marino   BT_FILE,			/* `__FILE__' */
628*e4b17023SJohn Marino   BT_BASE_FILE,			/* `__BASE_FILE__' */
629*e4b17023SJohn Marino   BT_INCLUDE_LEVEL,		/* `__INCLUDE_LEVEL__' */
630*e4b17023SJohn Marino   BT_TIME,			/* `__TIME__' */
631*e4b17023SJohn Marino   BT_STDC,			/* `__STDC__' */
632*e4b17023SJohn Marino   BT_PRAGMA,			/* `_Pragma' operator */
633*e4b17023SJohn Marino   BT_TIMESTAMP,			/* `__TIMESTAMP__' */
634*e4b17023SJohn Marino   BT_COUNTER,			/* `__COUNTER__' */
635*e4b17023SJohn Marino   BT_FIRST_USER,		/* User defined builtin macros.  */
636*e4b17023SJohn Marino   BT_LAST_USER = BT_FIRST_USER + 31
637*e4b17023SJohn Marino };
638*e4b17023SJohn Marino 
639*e4b17023SJohn Marino #define CPP_HASHNODE(HNODE)	((cpp_hashnode *) (HNODE))
640*e4b17023SJohn Marino #define HT_NODE(NODE)		((ht_identifier *) (NODE))
641*e4b17023SJohn Marino #define NODE_LEN(NODE)		HT_LEN (&(NODE)->ident)
642*e4b17023SJohn Marino #define NODE_NAME(NODE)		HT_STR (&(NODE)->ident)
643*e4b17023SJohn Marino 
644*e4b17023SJohn Marino /* Specify which field, if any, of the union is used.  */
645*e4b17023SJohn Marino 
646*e4b17023SJohn Marino enum {
647*e4b17023SJohn Marino   NTV_MACRO,
648*e4b17023SJohn Marino   NTV_ANSWER,
649*e4b17023SJohn Marino   NTV_BUILTIN,
650*e4b17023SJohn Marino   NTV_ARGUMENT,
651*e4b17023SJohn Marino   NTV_NONE
652*e4b17023SJohn Marino };
653*e4b17023SJohn Marino 
654*e4b17023SJohn Marino #define CPP_HASHNODE_VALUE_IDX(HNODE)				\
655*e4b17023SJohn Marino   ((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT		\
656*e4b17023SJohn Marino    : HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) 	\
657*e4b17023SJohn Marino 			       ? NTV_BUILTIN : NTV_MACRO)	\
658*e4b17023SJohn Marino    : HNODE.type == NT_ASSERTION ? NTV_ANSWER			\
659*e4b17023SJohn Marino    : NTV_NONE)
660*e4b17023SJohn Marino 
661*e4b17023SJohn Marino /* The common part of an identifier node shared amongst all 3 C front
662*e4b17023SJohn Marino    ends.  Also used to store CPP identifiers, which are a superset of
663*e4b17023SJohn Marino    identifiers in the grammatical sense.  */
664*e4b17023SJohn Marino 
665*e4b17023SJohn Marino union GTY(()) _cpp_hashnode_value {
666*e4b17023SJohn Marino   /* If a macro.  */
667*e4b17023SJohn Marino   cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
668*e4b17023SJohn Marino   /* Answers to an assertion.  */
669*e4b17023SJohn Marino   struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
670*e4b17023SJohn Marino   /* Code for a builtin macro.  */
671*e4b17023SJohn Marino   enum cpp_builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
672*e4b17023SJohn Marino   /* Macro argument index.  */
673*e4b17023SJohn Marino   unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
674*e4b17023SJohn Marino };
675*e4b17023SJohn Marino 
676*e4b17023SJohn Marino struct GTY(()) cpp_hashnode {
677*e4b17023SJohn Marino   struct ht_identifier ident;
678*e4b17023SJohn Marino   unsigned int is_directive : 1;
679*e4b17023SJohn Marino   unsigned int directive_index : 7;	/* If is_directive,
680*e4b17023SJohn Marino 					   then index into directive table.
681*e4b17023SJohn Marino 					   Otherwise, a NODE_OPERATOR.  */
682*e4b17023SJohn Marino   unsigned char rid_code;		/* Rid code - for front ends.  */
683*e4b17023SJohn Marino   ENUM_BITFIELD(node_type) type : 6;	/* CPP node type.  */
684*e4b17023SJohn Marino   unsigned int flags : 10;		/* CPP flags.  */
685*e4b17023SJohn Marino 
686*e4b17023SJohn Marino   union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
687*e4b17023SJohn Marino };
688*e4b17023SJohn Marino 
689*e4b17023SJohn Marino /* Call this first to get a handle to pass to other functions.
690*e4b17023SJohn Marino 
691*e4b17023SJohn Marino    If you want cpplib to manage its own hashtable, pass in a NULL
692*e4b17023SJohn Marino    pointer.  Otherwise you should pass in an initialized hash table
693*e4b17023SJohn Marino    that cpplib will share; this technique is used by the C front
694*e4b17023SJohn Marino    ends.  */
695*e4b17023SJohn Marino extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *,
696*e4b17023SJohn Marino 				      struct line_maps *);
697*e4b17023SJohn Marino 
698*e4b17023SJohn Marino /* Reset the cpp_reader's line_map.  This is only used after reading a
699*e4b17023SJohn Marino    PCH file.  */
700*e4b17023SJohn Marino extern void cpp_set_line_map (cpp_reader *, struct line_maps *);
701*e4b17023SJohn Marino 
702*e4b17023SJohn Marino /* Call this to change the selected language standard (e.g. because of
703*e4b17023SJohn Marino    command line options).  */
704*e4b17023SJohn Marino extern void cpp_set_lang (cpp_reader *, enum c_lang);
705*e4b17023SJohn Marino 
706*e4b17023SJohn Marino /* Set the include paths.  */
707*e4b17023SJohn Marino extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
708*e4b17023SJohn Marino 
709*e4b17023SJohn Marino /* Call these to get pointers to the options, callback, and deps
710*e4b17023SJohn Marino    structures for a given reader.  These pointers are good until you
711*e4b17023SJohn Marino    call cpp_finish on that reader.  You can either edit the callbacks
712*e4b17023SJohn Marino    through the pointer returned from cpp_get_callbacks, or set them
713*e4b17023SJohn Marino    with cpp_set_callbacks.  */
714*e4b17023SJohn Marino extern cpp_options *cpp_get_options (cpp_reader *);
715*e4b17023SJohn Marino extern cpp_callbacks *cpp_get_callbacks (cpp_reader *);
716*e4b17023SJohn Marino extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *);
717*e4b17023SJohn Marino extern struct deps *cpp_get_deps (cpp_reader *);
718*e4b17023SJohn Marino 
719*e4b17023SJohn Marino /* This function reads the file, but does not start preprocessing.  It
720*e4b17023SJohn Marino    returns the name of the original file; this is the same as the
721*e4b17023SJohn Marino    input file, except for preprocessed input.  This will generate at
722*e4b17023SJohn Marino    least one file change callback, and possibly a line change callback
723*e4b17023SJohn Marino    too.  If there was an error opening the file, it returns NULL.  */
724*e4b17023SJohn Marino extern const char *cpp_read_main_file (cpp_reader *, const char *);
725*e4b17023SJohn Marino 
726*e4b17023SJohn Marino /* Set up built-ins with special behavior.  Use cpp_init_builtins()
727*e4b17023SJohn Marino    instead unless your know what you are doing.  */
728*e4b17023SJohn Marino extern void cpp_init_special_builtins (cpp_reader *);
729*e4b17023SJohn Marino 
730*e4b17023SJohn Marino /* Set up built-ins like __FILE__.  */
731*e4b17023SJohn Marino extern void cpp_init_builtins (cpp_reader *, int);
732*e4b17023SJohn Marino 
733*e4b17023SJohn Marino /* This is called after options have been parsed, and partially
734*e4b17023SJohn Marino    processed.  */
735*e4b17023SJohn Marino extern void cpp_post_options (cpp_reader *);
736*e4b17023SJohn Marino 
737*e4b17023SJohn Marino /* Set up translation to the target character set.  */
738*e4b17023SJohn Marino extern void cpp_init_iconv (cpp_reader *);
739*e4b17023SJohn Marino 
740*e4b17023SJohn Marino /* Call this to finish preprocessing.  If you requested dependency
741*e4b17023SJohn Marino    generation, pass an open stream to write the information to,
742*e4b17023SJohn Marino    otherwise NULL.  It is your responsibility to close the stream.  */
743*e4b17023SJohn Marino extern void cpp_finish (cpp_reader *, FILE *deps_stream);
744*e4b17023SJohn Marino 
745*e4b17023SJohn Marino /* Call this to release the handle at the end of preprocessing.  Any
746*e4b17023SJohn Marino    use of the handle after this function returns is invalid.  */
747*e4b17023SJohn Marino extern void cpp_destroy (cpp_reader *);
748*e4b17023SJohn Marino 
749*e4b17023SJohn Marino extern unsigned int cpp_token_len (const cpp_token *);
750*e4b17023SJohn Marino extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
751*e4b17023SJohn Marino extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
752*e4b17023SJohn Marino 				       unsigned char *, bool);
753*e4b17023SJohn Marino extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
754*e4b17023SJohn Marino 				 void (*) (cpp_reader *), bool);
755*e4b17023SJohn Marino extern void cpp_register_deferred_pragma (cpp_reader *, const char *,
756*e4b17023SJohn Marino 					  const char *, unsigned, bool, bool);
757*e4b17023SJohn Marino extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
758*e4b17023SJohn Marino 			    const cpp_token *);
759*e4b17023SJohn Marino extern const cpp_token *cpp_get_token (cpp_reader *);
760*e4b17023SJohn Marino extern const cpp_token *cpp_get_token_with_location (cpp_reader *,
761*e4b17023SJohn Marino 						     source_location *);
762*e4b17023SJohn Marino extern const unsigned char *cpp_macro_definition (cpp_reader *,
763*e4b17023SJohn Marino 						  cpp_hashnode *);
764*e4b17023SJohn Marino extern void _cpp_backup_tokens (cpp_reader *, unsigned int);
765*e4b17023SJohn Marino extern const cpp_token *cpp_peek_token (cpp_reader *, int);
766*e4b17023SJohn Marino 
767*e4b17023SJohn Marino /* Evaluate a CPP_*CHAR* token.  */
768*e4b17023SJohn Marino extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *,
769*e4b17023SJohn Marino 					  unsigned int *, int *);
770*e4b17023SJohn Marino /* Evaluate a vector of CPP_*STRING* tokens.  */
771*e4b17023SJohn Marino extern bool cpp_interpret_string (cpp_reader *,
772*e4b17023SJohn Marino 				  const cpp_string *, size_t,
773*e4b17023SJohn Marino 				  cpp_string *, enum cpp_ttype);
774*e4b17023SJohn Marino extern bool cpp_interpret_string_notranslate (cpp_reader *,
775*e4b17023SJohn Marino 					      const cpp_string *, size_t,
776*e4b17023SJohn Marino 					      cpp_string *, enum cpp_ttype);
777*e4b17023SJohn Marino 
778*e4b17023SJohn Marino /* Convert a host character constant to the execution character set.  */
779*e4b17023SJohn Marino extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
780*e4b17023SJohn Marino 
781*e4b17023SJohn Marino /* Used to register macros and assertions, perhaps from the command line.
782*e4b17023SJohn Marino    The text is the same as the command line argument.  */
783*e4b17023SJohn Marino extern void cpp_define (cpp_reader *, const char *);
784*e4b17023SJohn Marino extern void cpp_define_formatted (cpp_reader *pfile,
785*e4b17023SJohn Marino 				  const char *fmt, ...) ATTRIBUTE_PRINTF_2;
786*e4b17023SJohn Marino extern void cpp_assert (cpp_reader *, const char *);
787*e4b17023SJohn Marino extern void cpp_undef (cpp_reader *, const char *);
788*e4b17023SJohn Marino extern void cpp_unassert (cpp_reader *, const char *);
789*e4b17023SJohn Marino 
790*e4b17023SJohn Marino /* Undefine all macros and assertions.  */
791*e4b17023SJohn Marino extern void cpp_undef_all (cpp_reader *);
792*e4b17023SJohn Marino 
793*e4b17023SJohn Marino extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *,
794*e4b17023SJohn Marino 				    size_t, int);
795*e4b17023SJohn Marino extern int cpp_defined (cpp_reader *, const unsigned char *, int);
796*e4b17023SJohn Marino 
797*e4b17023SJohn Marino /* A preprocessing number.  Code assumes that any unused high bits of
798*e4b17023SJohn Marino    the double integer are set to zero.  */
799*e4b17023SJohn Marino typedef unsigned HOST_WIDE_INT cpp_num_part;
800*e4b17023SJohn Marino typedef struct cpp_num cpp_num;
801*e4b17023SJohn Marino struct cpp_num
802*e4b17023SJohn Marino {
803*e4b17023SJohn Marino   cpp_num_part high;
804*e4b17023SJohn Marino   cpp_num_part low;
805*e4b17023SJohn Marino   bool unsignedp;  /* True if value should be treated as unsigned.  */
806*e4b17023SJohn Marino   bool overflow;   /* True if the most recent calculation overflowed.  */
807*e4b17023SJohn Marino };
808*e4b17023SJohn Marino 
809*e4b17023SJohn Marino /* cpplib provides two interfaces for interpretation of preprocessing
810*e4b17023SJohn Marino    numbers.
811*e4b17023SJohn Marino 
812*e4b17023SJohn Marino    cpp_classify_number categorizes numeric constants according to
813*e4b17023SJohn Marino    their field (integer, floating point, or invalid), radix (decimal,
814*e4b17023SJohn Marino    octal, hexadecimal), and type suffixes.  */
815*e4b17023SJohn Marino 
816*e4b17023SJohn Marino #define CPP_N_CATEGORY  0x000F
817*e4b17023SJohn Marino #define CPP_N_INVALID	0x0000
818*e4b17023SJohn Marino #define CPP_N_INTEGER	0x0001
819*e4b17023SJohn Marino #define CPP_N_FLOATING	0x0002
820*e4b17023SJohn Marino 
821*e4b17023SJohn Marino #define CPP_N_WIDTH	0x00F0
822*e4b17023SJohn Marino #define CPP_N_SMALL	0x0010	/* int, float, shrot _Fract/Accum  */
823*e4b17023SJohn Marino #define CPP_N_MEDIUM	0x0020	/* long, double, long _Fract/_Accum.  */
824*e4b17023SJohn Marino #define CPP_N_LARGE	0x0040	/* long long, long double,
825*e4b17023SJohn Marino 				   long long _Fract/Accum.  */
826*e4b17023SJohn Marino 
827*e4b17023SJohn Marino #define CPP_N_WIDTH_MD	0xF0000	/* machine defined.  */
828*e4b17023SJohn Marino #define CPP_N_MD_W	0x10000
829*e4b17023SJohn Marino #define CPP_N_MD_Q	0x20000
830*e4b17023SJohn Marino 
831*e4b17023SJohn Marino #define CPP_N_RADIX	0x0F00
832*e4b17023SJohn Marino #define CPP_N_DECIMAL	0x0100
833*e4b17023SJohn Marino #define CPP_N_HEX	0x0200
834*e4b17023SJohn Marino #define CPP_N_OCTAL	0x0400
835*e4b17023SJohn Marino #define CPP_N_BINARY	0x0800
836*e4b17023SJohn Marino 
837*e4b17023SJohn Marino #define CPP_N_UNSIGNED	0x1000	/* Properties.  */
838*e4b17023SJohn Marino #define CPP_N_IMAGINARY	0x2000
839*e4b17023SJohn Marino #define CPP_N_DFLOAT	0x4000
840*e4b17023SJohn Marino #define CPP_N_DEFAULT	0x8000
841*e4b17023SJohn Marino 
842*e4b17023SJohn Marino #define CPP_N_FRACT	0x100000 /* Fract types.  */
843*e4b17023SJohn Marino #define CPP_N_ACCUM	0x200000 /* Accum types.  */
844*e4b17023SJohn Marino 
845*e4b17023SJohn Marino #define CPP_N_USERDEF	0x1000000 /* C++0x user-defined literal.  */
846*e4b17023SJohn Marino 
847*e4b17023SJohn Marino /* Classify a CPP_NUMBER token.  The return value is a combination of
848*e4b17023SJohn Marino    the flags from the above sets.  */
849*e4b17023SJohn Marino extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *,
850*e4b17023SJohn Marino 				     const char **);
851*e4b17023SJohn Marino 
852*e4b17023SJohn Marino /* Return the classification flags for a float suffix.  */
853*e4b17023SJohn Marino extern unsigned int cpp_interpret_float_suffix (const char *, size_t);
854*e4b17023SJohn Marino 
855*e4b17023SJohn Marino /* Return the classification flags for an int suffix.  */
856*e4b17023SJohn Marino extern unsigned int cpp_interpret_int_suffix (const char *, size_t);
857*e4b17023SJohn Marino 
858*e4b17023SJohn Marino /* Evaluate a token classified as category CPP_N_INTEGER.  */
859*e4b17023SJohn Marino extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
860*e4b17023SJohn Marino 				      unsigned int);
861*e4b17023SJohn Marino 
862*e4b17023SJohn Marino /* Sign extend a number, with PRECISION significant bits and all
863*e4b17023SJohn Marino    others assumed clear, to fill out a cpp_num structure.  */
864*e4b17023SJohn Marino cpp_num cpp_num_sign_extend (cpp_num, size_t);
865*e4b17023SJohn Marino 
866*e4b17023SJohn Marino /* Diagnostic levels.  To get a diagnostic without associating a
867*e4b17023SJohn Marino    position in the translation unit with it, use cpp_error_with_line
868*e4b17023SJohn Marino    with a line number of zero.  */
869*e4b17023SJohn Marino 
870*e4b17023SJohn Marino enum {
871*e4b17023SJohn Marino   /* Warning, an error with -Werror.  */
872*e4b17023SJohn Marino   CPP_DL_WARNING = 0,
873*e4b17023SJohn Marino   /* Same as CPP_DL_WARNING, except it is not suppressed in system headers.  */
874*e4b17023SJohn Marino   CPP_DL_WARNING_SYSHDR,
875*e4b17023SJohn Marino   /* Warning, an error with -pedantic-errors or -Werror.  */
876*e4b17023SJohn Marino   CPP_DL_PEDWARN,
877*e4b17023SJohn Marino   /* An error.  */
878*e4b17023SJohn Marino   CPP_DL_ERROR,
879*e4b17023SJohn Marino   /* An internal consistency check failed.  Prints "internal error: ",
880*e4b17023SJohn Marino      otherwise the same as CPP_DL_ERROR.  */
881*e4b17023SJohn Marino   CPP_DL_ICE,
882*e4b17023SJohn Marino   /* An informative note following a warning.  */
883*e4b17023SJohn Marino   CPP_DL_NOTE,
884*e4b17023SJohn Marino   /* A fatal error.  */
885*e4b17023SJohn Marino   CPP_DL_FATAL
886*e4b17023SJohn Marino };
887*e4b17023SJohn Marino 
888*e4b17023SJohn Marino /* Warning reason codes. Use a reason code of zero for unclassified warnings
889*e4b17023SJohn Marino    and errors that are not warnings.  */
890*e4b17023SJohn Marino enum {
891*e4b17023SJohn Marino   CPP_W_NONE = 0,
892*e4b17023SJohn Marino   CPP_W_DEPRECATED,
893*e4b17023SJohn Marino   CPP_W_COMMENTS,
894*e4b17023SJohn Marino   CPP_W_MISSING_INCLUDE_DIRS,
895*e4b17023SJohn Marino   CPP_W_TRIGRAPHS,
896*e4b17023SJohn Marino   CPP_W_MULTICHAR,
897*e4b17023SJohn Marino   CPP_W_TRADITIONAL,
898*e4b17023SJohn Marino   CPP_W_LONG_LONG,
899*e4b17023SJohn Marino   CPP_W_ENDIF_LABELS,
900*e4b17023SJohn Marino   CPP_W_NUM_SIGN_CHANGE,
901*e4b17023SJohn Marino   CPP_W_VARIADIC_MACROS,
902*e4b17023SJohn Marino   CPP_W_BUILTIN_MACRO_REDEFINED,
903*e4b17023SJohn Marino   CPP_W_DOLLARS,
904*e4b17023SJohn Marino   CPP_W_UNDEF,
905*e4b17023SJohn Marino   CPP_W_UNUSED_MACROS,
906*e4b17023SJohn Marino   CPP_W_CXX_OPERATOR_NAMES,
907*e4b17023SJohn Marino   CPP_W_NORMALIZE,
908*e4b17023SJohn Marino   CPP_W_INVALID_PCH,
909*e4b17023SJohn Marino   CPP_W_WARNING_DIRECTIVE
910*e4b17023SJohn Marino };
911*e4b17023SJohn Marino 
912*e4b17023SJohn Marino /* Output a diagnostic of some kind.  */
913*e4b17023SJohn Marino extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)
914*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_3;
915*e4b17023SJohn Marino extern bool cpp_warning (cpp_reader *, int, const char *msgid, ...)
916*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_3;
917*e4b17023SJohn Marino extern bool cpp_pedwarning (cpp_reader *, int, const char *msgid, ...)
918*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_3;
919*e4b17023SJohn Marino extern bool cpp_warning_syshdr (cpp_reader *, int, const char *msgid, ...)
920*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_3;
921*e4b17023SJohn Marino 
922*e4b17023SJohn Marino /* Output a diagnostic with "MSGID: " preceding the
923*e4b17023SJohn Marino    error string of errno.  No location is printed.  */
924*e4b17023SJohn Marino extern bool cpp_errno (cpp_reader *, int, const char *msgid);
925*e4b17023SJohn Marino 
926*e4b17023SJohn Marino /* Same as cpp_error, except additionally specifies a position as a
927*e4b17023SJohn Marino    (translation unit) physical line and physical column.  If the line is
928*e4b17023SJohn Marino    zero, then no location is printed.  */
929*e4b17023SJohn Marino extern bool cpp_error_with_line (cpp_reader *, int, source_location,
930*e4b17023SJohn Marino                                  unsigned, const char *msgid, ...)
931*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_5;
932*e4b17023SJohn Marino extern bool cpp_warning_with_line (cpp_reader *, int, source_location,
933*e4b17023SJohn Marino                                    unsigned, const char *msgid, ...)
934*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_5;
935*e4b17023SJohn Marino extern bool cpp_pedwarning_with_line (cpp_reader *, int, source_location,
936*e4b17023SJohn Marino                                       unsigned, const char *msgid, ...)
937*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_5;
938*e4b17023SJohn Marino extern bool cpp_warning_with_line_syshdr (cpp_reader *, int, source_location,
939*e4b17023SJohn Marino                                           unsigned, const char *msgid, ...)
940*e4b17023SJohn Marino   ATTRIBUTE_PRINTF_5;
941*e4b17023SJohn Marino 
942*e4b17023SJohn Marino /* In lex.c */
943*e4b17023SJohn Marino extern int cpp_ideq (const cpp_token *, const char *);
944*e4b17023SJohn Marino extern void cpp_output_line (cpp_reader *, FILE *);
945*e4b17023SJohn Marino extern unsigned char *cpp_output_line_to_string (cpp_reader *,
946*e4b17023SJohn Marino 						 const unsigned char *);
947*e4b17023SJohn Marino extern void cpp_output_token (const cpp_token *, FILE *);
948*e4b17023SJohn Marino extern const char *cpp_type2name (enum cpp_ttype, unsigned char flags);
949*e4b17023SJohn Marino /* Returns the value of an escape sequence, truncated to the correct
950*e4b17023SJohn Marino    target precision.  PSTR points to the input pointer, which is just
951*e4b17023SJohn Marino    after the backslash.  LIMIT is how much text we have.  WIDE is true
952*e4b17023SJohn Marino    if the escape sequence is part of a wide character constant or
953*e4b17023SJohn Marino    string literal.  Handles all relevant diagnostics.  */
954*e4b17023SJohn Marino extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr,
955*e4b17023SJohn Marino 				   const unsigned char *limit, int wide);
956*e4b17023SJohn Marino 
957*e4b17023SJohn Marino /* Structure used to hold a comment block at a given location in the
958*e4b17023SJohn Marino    source code.  */
959*e4b17023SJohn Marino 
960*e4b17023SJohn Marino typedef struct
961*e4b17023SJohn Marino {
962*e4b17023SJohn Marino   /* Text of the comment including the terminators.  */
963*e4b17023SJohn Marino   char *comment;
964*e4b17023SJohn Marino 
965*e4b17023SJohn Marino   /* source location for the given comment.  */
966*e4b17023SJohn Marino   source_location sloc;
967*e4b17023SJohn Marino } cpp_comment;
968*e4b17023SJohn Marino 
969*e4b17023SJohn Marino /* Structure holding all comments for a given cpp_reader.  */
970*e4b17023SJohn Marino 
971*e4b17023SJohn Marino typedef struct
972*e4b17023SJohn Marino {
973*e4b17023SJohn Marino   /* table of comment entries.  */
974*e4b17023SJohn Marino   cpp_comment *entries;
975*e4b17023SJohn Marino 
976*e4b17023SJohn Marino   /* number of actual entries entered in the table.  */
977*e4b17023SJohn Marino   int count;
978*e4b17023SJohn Marino 
979*e4b17023SJohn Marino   /* number of entries allocated currently.  */
980*e4b17023SJohn Marino   int allocated;
981*e4b17023SJohn Marino } cpp_comment_table;
982*e4b17023SJohn Marino 
983*e4b17023SJohn Marino /* Returns the table of comments encountered by the preprocessor. This
984*e4b17023SJohn Marino    table is only populated when pfile->state.save_comments is true. */
985*e4b17023SJohn Marino extern cpp_comment_table *cpp_get_comments (cpp_reader *);
986*e4b17023SJohn Marino 
987*e4b17023SJohn Marino /* In hash.c */
988*e4b17023SJohn Marino 
989*e4b17023SJohn Marino /* Lookup an identifier in the hashtable.  Puts the identifier in the
990*e4b17023SJohn Marino    table if it is not already there.  */
991*e4b17023SJohn Marino extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
992*e4b17023SJohn Marino 				 unsigned int);
993*e4b17023SJohn Marino 
994*e4b17023SJohn Marino typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *);
995*e4b17023SJohn Marino extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *);
996*e4b17023SJohn Marino 
997*e4b17023SJohn Marino /* In macro.c */
998*e4b17023SJohn Marino extern void cpp_scan_nooutput (cpp_reader *);
999*e4b17023SJohn Marino extern int  cpp_sys_macro_p (cpp_reader *);
1000*e4b17023SJohn Marino extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
1001*e4b17023SJohn Marino 					unsigned int);
1002*e4b17023SJohn Marino 
1003*e4b17023SJohn Marino /* In files.c */
1004*e4b17023SJohn Marino extern bool cpp_included (cpp_reader *, const char *);
1005*e4b17023SJohn Marino extern bool cpp_included_before (cpp_reader *, const char *, source_location);
1006*e4b17023SJohn Marino extern void cpp_make_system_header (cpp_reader *, int, int);
1007*e4b17023SJohn Marino extern bool cpp_push_include (cpp_reader *, const char *);
1008*e4b17023SJohn Marino extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
1009*e4b17023SJohn Marino extern const char *cpp_get_path (struct _cpp_file *);
1010*e4b17023SJohn Marino extern cpp_dir *cpp_get_dir (struct _cpp_file *);
1011*e4b17023SJohn Marino extern cpp_buffer *cpp_get_buffer (cpp_reader *);
1012*e4b17023SJohn Marino extern struct _cpp_file *cpp_get_file (cpp_buffer *);
1013*e4b17023SJohn Marino extern cpp_buffer *cpp_get_prev (cpp_buffer *);
1014*e4b17023SJohn Marino extern void cpp_clear_file_cache (cpp_reader *);
1015*e4b17023SJohn Marino 
1016*e4b17023SJohn Marino /* In pch.c */
1017*e4b17023SJohn Marino struct save_macro_data;
1018*e4b17023SJohn Marino extern int cpp_save_state (cpp_reader *, FILE *);
1019*e4b17023SJohn Marino extern int cpp_write_pch_deps (cpp_reader *, FILE *);
1020*e4b17023SJohn Marino extern int cpp_write_pch_state (cpp_reader *, FILE *);
1021*e4b17023SJohn Marino extern int cpp_valid_state (cpp_reader *, const char *, int);
1022*e4b17023SJohn Marino extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
1023*e4b17023SJohn Marino extern int cpp_read_state (cpp_reader *, const char *, FILE *,
1024*e4b17023SJohn Marino 			   struct save_macro_data *);
1025*e4b17023SJohn Marino 
1026*e4b17023SJohn Marino /* In lex.c */
1027*e4b17023SJohn Marino extern void cpp_force_token_locations (cpp_reader *, source_location *);
1028*e4b17023SJohn Marino extern void cpp_stop_forcing_token_locations (cpp_reader *);
1029*e4b17023SJohn Marino 
1030*e4b17023SJohn Marino /* In expr.c */
1031*e4b17023SJohn Marino extern enum cpp_ttype cpp_userdef_string_remove_type
1032*e4b17023SJohn Marino   (enum cpp_ttype type);
1033*e4b17023SJohn Marino extern enum cpp_ttype cpp_userdef_string_add_type
1034*e4b17023SJohn Marino   (enum cpp_ttype type);
1035*e4b17023SJohn Marino extern enum cpp_ttype cpp_userdef_char_remove_type
1036*e4b17023SJohn Marino   (enum cpp_ttype type);
1037*e4b17023SJohn Marino extern enum cpp_ttype cpp_userdef_char_add_type
1038*e4b17023SJohn Marino   (enum cpp_ttype type);
1039*e4b17023SJohn Marino extern bool cpp_userdef_string_p
1040*e4b17023SJohn Marino   (enum cpp_ttype type);
1041*e4b17023SJohn Marino extern bool cpp_userdef_char_p
1042*e4b17023SJohn Marino   (enum cpp_ttype type);
1043*e4b17023SJohn Marino extern const char * cpp_get_userdef_suffix
1044*e4b17023SJohn Marino   (const cpp_token *);
1045*e4b17023SJohn Marino 
1046*e4b17023SJohn Marino #endif /* ! LIBCPP_CPPLIB_H */
1047