]>
Commit | Line | Data |
---|---|---|
88ae23e7 | 1 | /* Part of CPP library. |
5793b276 | 2 | Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 |
5d8ebbd8 | 3 | Free Software Foundation, Inc. |
4283012f JL |
4 | |
5 | This program is free software; you can redistribute it and/or modify it | |
6 | under the terms of the GNU General Public License as published by the | |
7 | Free Software Foundation; either version 2, or (at your option) any | |
8 | later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program; if not, write to the Free Software | |
42b17236 | 17 | Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
4283012f | 18 | |
88ae23e7 ZW |
19 | /* This header defines all the internal data structures and functions |
20 | that need to be visible across files. It's called cpphash.h for | |
21 | historical reasons. */ | |
22 | ||
2a967f3d NB |
23 | #ifndef GCC_CPPHASH_H |
24 | #define GCC_CPPHASH_H | |
bb52fa7f | 25 | |
2a967f3d NB |
26 | #include "hashtable.h" |
27 | ||
e6cc3a24 ZW |
28 | #ifdef HAVE_ICONV |
29 | #include <iconv.h> | |
30 | #else | |
31 | #define HAVE_ICONV 0 | |
32 | typedef int iconv_t; /* dummy */ | |
33 | #endif | |
34 | ||
2a967f3d | 35 | struct directive; /* Deliberately incomplete. */ |
af0d16cd | 36 | struct pending_option; |
87ed109f | 37 | struct op; |
6b88314c ZW |
38 | struct strbuf; |
39 | ||
40 | typedef bool (*convert_f) (iconv_t, const unsigned char *, size_t, | |
41 | struct strbuf *); | |
42 | struct cset_converter | |
43 | { | |
44 | convert_f func; | |
45 | iconv_t cd; | |
46 | }; | |
8121d2c3 | 47 | |
a12b5bd9 | 48 | #ifndef HAVE_UCHAR |
601328bb | 49 | typedef unsigned char uchar; |
a12b5bd9 | 50 | #endif |
601328bb NB |
51 | #define U (const uchar *) /* Intended use: U"string" */ |
52 | ||
4268e8bb NB |
53 | #define BITS_PER_CPPCHAR_T (CHAR_BIT * sizeof (cppchar_t)) |
54 | ||
93c80368 NB |
55 | /* Test if a sign is valid within a preprocessing number. */ |
56 | #define VALID_SIGN(c, prevc) \ | |
57 | (((c) == '+' || (c) == '-') && \ | |
58 | ((prevc) == 'e' || (prevc) == 'E' \ | |
bdb05a7b NB |
59 | || (((prevc) == 'p' || (prevc) == 'P') \ |
60 | && CPP_OPTION (pfile, extended_numbers)))) | |
93c80368 | 61 | |
8121d2c3 NB |
62 | #define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION) |
63 | #define CPP_BUFFER(PFILE) ((PFILE)->buffer) | |
26aea073 | 64 | #define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base) |
8121d2c3 NB |
65 | #define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur) |
66 | ||
67 | /* Maximum nesting of cpp_buffers. We use a static limit, partly for | |
68 | efficiency, and partly to limit runaway recursion. */ | |
69 | #define CPP_STACK_MAX 200 | |
70 | ||
c70f6ed3 NB |
71 | /* Host alignment handling. */ |
72 | struct dummy | |
73 | { | |
74 | char c; | |
75 | union | |
76 | { | |
77 | double d; | |
78 | int *p; | |
79 | } u; | |
80 | }; | |
81 | ||
82 | #define DEFAULT_ALIGNMENT offsetof (struct dummy, u) | |
83 | #define CPP_ALIGN2(size, align) (((size) + ((align) - 1)) & ~((align) - 1)) | |
84 | #define CPP_ALIGN(size) CPP_ALIGN2 (size, DEFAULT_ALIGNMENT) | |
85 | ||
601328bb NB |
86 | /* Each macro definition is recorded in a cpp_macro structure. |
87 | Variadic macros cannot occur with traditional cpp. */ | |
88 | struct cpp_macro | |
89 | { | |
6618c5d4 NB |
90 | /* Parameters, if any. */ |
91 | cpp_hashnode **params; | |
92 | ||
93 | /* Replacement tokens (ISO) or replacement text (traditional). See | |
94 | comment at top of cpptrad.c for how traditional function-like | |
95 | macros are encoded. */ | |
601328bb NB |
96 | union |
97 | { | |
6618c5d4 NB |
98 | cpp_token *tokens; |
99 | const uchar *text; | |
601328bb | 100 | } exp; |
6618c5d4 NB |
101 | |
102 | /* Definition line number. */ | |
103 | unsigned int line; | |
104 | ||
105 | /* Number of tokens in expansion, or bytes for traditional macros. */ | |
106 | unsigned int count; | |
107 | ||
108 | /* Number of parameters. */ | |
109 | unsigned short paramc; | |
110 | ||
111 | /* If a function-like macro. */ | |
112 | unsigned int fun_like : 1; | |
113 | ||
114 | /* If a variadic macro. */ | |
115 | unsigned int variadic : 1; | |
116 | ||
117 | /* If macro defined in system header. */ | |
118 | unsigned int syshdr : 1; | |
a69cbaac | 119 | |
da7d8304 | 120 | /* Nonzero if it has been expanded or had its existence tested. */ |
a69cbaac | 121 | unsigned int used : 1; |
601328bb NB |
122 | }; |
123 | ||
a69cbaac NB |
124 | #define _cpp_mark_macro_used(NODE) do { \ |
125 | if ((NODE)->type == NT_MACRO && !((NODE)->flags & NODE_BUILTIN)) \ | |
126 | (NODE)->value.macro->used = 1; } while (0) | |
127 | ||
644eddaa | 128 | /* A generic memory buffer, and operations on it. */ |
b8af0ca5 NB |
129 | typedef struct _cpp_buff _cpp_buff; |
130 | struct _cpp_buff | |
131 | { | |
132 | struct _cpp_buff *next; | |
ece54d54 | 133 | unsigned char *base, *cur, *limit; |
b8af0ca5 NB |
134 | }; |
135 | ||
6cf87ca4 ZW |
136 | extern _cpp_buff *_cpp_get_buff (cpp_reader *, size_t); |
137 | extern void _cpp_release_buff (cpp_reader *, _cpp_buff *); | |
138 | extern void _cpp_extend_buff (cpp_reader *, _cpp_buff **, size_t); | |
139 | extern _cpp_buff *_cpp_append_extend_buff (cpp_reader *, _cpp_buff *, size_t); | |
140 | extern void _cpp_free_buff (_cpp_buff *); | |
141 | extern unsigned char *_cpp_aligned_alloc (cpp_reader *, size_t); | |
142 | extern unsigned char *_cpp_unaligned_alloc (cpp_reader *, size_t); | |
644eddaa | 143 | |
8c3b2693 | 144 | #define BUFF_ROOM(BUFF) (size_t) ((BUFF)->limit - (BUFF)->cur) |
ece54d54 NB |
145 | #define BUFF_FRONT(BUFF) ((BUFF)->cur) |
146 | #define BUFF_LIMIT(BUFF) ((BUFF)->limit) | |
b8af0ca5 | 147 | |
ba133c96 NB |
148 | /* #include types. */ |
149 | enum include_type {IT_INCLUDE, IT_INCLUDE_NEXT, IT_IMPORT, IT_CMDLINE}; | |
150 | ||
4ed5bcfb | 151 | union utoken |
8121d2c3 | 152 | { |
4ed5bcfb NB |
153 | const cpp_token *token; |
154 | const cpp_token **ptoken; | |
8121d2c3 NB |
155 | }; |
156 | ||
5d8ebbd8 | 157 | /* A "run" of tokens; part of a chain of runs. */ |
5fddcffc NB |
158 | typedef struct tokenrun tokenrun; |
159 | struct tokenrun | |
160 | { | |
bdcbe496 | 161 | tokenrun *next, *prev; |
5fddcffc NB |
162 | cpp_token *base, *limit; |
163 | }; | |
164 | ||
82eda77e | 165 | /* Accessor macros for struct cpp_context. */ |
79ba5e3b NB |
166 | #define FIRST(c) ((c)->u.iso.first) |
167 | #define LAST(c) ((c)->u.iso.last) | |
168 | #define CUR(c) ((c)->u.trad.cur) | |
169 | #define RLIMIT(c) ((c)->u.trad.rlimit) | |
82eda77e | 170 | |
8121d2c3 NB |
171 | typedef struct cpp_context cpp_context; |
172 | struct cpp_context | |
173 | { | |
174 | /* Doubly-linked list. */ | |
175 | cpp_context *next, *prev; | |
176 | ||
82eda77e NB |
177 | union |
178 | { | |
179 | /* For ISO macro expansion. Contexts other than the base context | |
180 | are contiguous tokens. e.g. macro expansions, expanded | |
181 | argument tokens. */ | |
182 | struct | |
183 | { | |
184 | union utoken first; | |
185 | union utoken last; | |
186 | } iso; | |
187 | ||
188 | /* For traditional macro expansion. */ | |
189 | struct | |
190 | { | |
191 | const uchar *cur; | |
192 | const uchar *rlimit; | |
193 | } trad; | |
194 | } u; | |
8121d2c3 | 195 | |
1e013d2e | 196 | /* If non-NULL, a buffer used for storage related to this context. |
c9e7a609 | 197 | When the context is popped, the buffer is released. */ |
1e013d2e NB |
198 | _cpp_buff *buff; |
199 | ||
644eddaa NB |
200 | /* For a macro context, the macro node, otherwise NULL. */ |
201 | cpp_hashnode *macro; | |
4ed5bcfb NB |
202 | |
203 | /* True if utoken element is token, else ptoken. */ | |
204 | bool direct_p; | |
8121d2c3 NB |
205 | }; |
206 | ||
207 | struct lexer_state | |
208 | { | |
209 | /* Nonzero if first token on line is CPP_HASH. */ | |
210 | unsigned char in_directive; | |
211 | ||
a8d0ddaf ZW |
212 | /* Nonzero if in a directive that will handle padding tokens itself. |
213 | #include needs this to avoid problems with computed include and | |
214 | spacing between tokens. */ | |
215 | unsigned char directive_wants_padding; | |
216 | ||
cef0d199 NB |
217 | /* True if we are skipping a failed conditional group. */ |
218 | unsigned char skipping; | |
219 | ||
8121d2c3 NB |
220 | /* Nonzero if in a directive that takes angle-bracketed headers. */ |
221 | unsigned char angled_headers; | |
222 | ||
d97371e0 NB |
223 | /* Nonzero if in a #if or #elif directive. */ |
224 | unsigned char in_expression; | |
225 | ||
8121d2c3 NB |
226 | /* Nonzero to save comments. Turned off if discard_comments, and in |
227 | all directives apart from #define. */ | |
228 | unsigned char save_comments; | |
229 | ||
8121d2c3 NB |
230 | /* Nonzero if lexing __VA_ARGS__ is valid. */ |
231 | unsigned char va_args_ok; | |
232 | ||
233 | /* Nonzero if lexing poisoned identifiers is valid. */ | |
234 | unsigned char poisoned_ok; | |
235 | ||
236 | /* Nonzero to prevent macro expansion. */ | |
df383483 | 237 | unsigned char prevent_expansion; |
8121d2c3 NB |
238 | |
239 | /* Nonzero when parsing arguments to a function-like macro. */ | |
240 | unsigned char parsing_args; | |
87ed109f NB |
241 | |
242 | /* Nonzero to skip evaluating part of an expression. */ | |
243 | unsigned int skip_eval; | |
8121d2c3 NB |
244 | }; |
245 | ||
246 | /* Special nodes - identifiers with predefined significance. */ | |
247 | struct spec_nodes | |
248 | { | |
8121d2c3 | 249 | cpp_hashnode *n_defined; /* defined operator */ |
037313ae ZW |
250 | cpp_hashnode *n_true; /* C++ keyword true */ |
251 | cpp_hashnode *n_false; /* C++ keyword false */ | |
8121d2c3 NB |
252 | cpp_hashnode *n__VA_ARGS__; /* C99 vararg macros */ |
253 | }; | |
254 | ||
26aea073 NB |
255 | typedef struct _cpp_line_note _cpp_line_note; |
256 | struct _cpp_line_note | |
257 | { | |
258 | /* Location in the clean line the note refers to. */ | |
259 | const uchar *pos; | |
260 | ||
41c32c98 NB |
261 | /* Type of note. The 9 'from' trigraph characters represent those |
262 | trigraphs, '\\' an escaped newline, ' ' an escaped newline with | |
263 | intervening space, and anything else is invalid. */ | |
264 | unsigned int type; | |
26aea073 NB |
265 | }; |
266 | ||
5d8ebbd8 | 267 | /* Represents the contents of a file cpplib has read in. */ |
27e2564a NB |
268 | struct cpp_buffer |
269 | { | |
26aea073 NB |
270 | const uchar *cur; /* Current location. */ |
271 | const uchar *line_base; /* Start of current physical line. */ | |
272 | const uchar *next_line; /* Start of to-be-cleaned logical line. */ | |
273 | ||
274 | const uchar *buf; /* Entire character buffer. */ | |
275 | const uchar *rlimit; /* Writable byte at end of file. */ | |
276 | ||
277 | _cpp_line_note *notes; /* Array of notes. */ | |
278 | unsigned int cur_note; /* Next note to process. */ | |
279 | unsigned int notes_used; /* Number of notes. */ | |
280 | unsigned int notes_cap; /* Size of allocated array. */ | |
27e2564a | 281 | |
27e2564a NB |
282 | struct cpp_buffer *prev; |
283 | ||
29401c30 NB |
284 | /* Pointer into the include table; non-NULL if this is a file |
285 | buffer. Used for include_next and to record control macros. */ | |
27e2564a NB |
286 | struct include_file *inc; |
287 | ||
288 | /* Value of if_stack at start of this file. | |
289 | Used to prohibit unmatched #endif (etc) in an include file. */ | |
290 | struct if_stack *if_stack; | |
291 | ||
26aea073 NB |
292 | /* True if we need to get the next clean line. */ |
293 | bool need_line; | |
27e2564a NB |
294 | |
295 | /* True if we have already warned about C++ comments in this file. | |
296 | The warning happens only for C89 extended mode with -pedantic on, | |
297 | or for -Wtraditional, and only once per file (otherwise it would | |
298 | be far too noisy). */ | |
299 | unsigned char warned_cplusplus_comments; | |
300 | ||
301 | /* True if we don't process trigraphs and escaped newlines. True | |
302 | for preprocessed input, command line directives, and _Pragma | |
303 | buffers. */ | |
304 | unsigned char from_stage3; | |
305 | ||
ba133c96 NB |
306 | /* Nonzero means that the directory to start searching for "" |
307 | include files has been calculated and stored in "dir" below. */ | |
308 | unsigned char search_cached; | |
309 | ||
ef6e958a NB |
310 | /* At EOF, a buffer is automatically popped. If RETURN_AT_EOF is |
311 | true, a CPP_EOF token is then returned. Otherwise, the next | |
312 | token from the enclosing buffer is returned. */ | |
313 | bool return_at_eof; | |
314 | ||
591e15a1 NB |
315 | /* The directory of the this buffer's file. Its NAME member is not |
316 | allocated, so we don't need to worry about freeing it. */ | |
5793b276 | 317 | struct cpp_path dir; |
004cb263 NB |
318 | |
319 | /* Used for buffer overlays by cpptrad.c. */ | |
bf9d5852 | 320 | const uchar *saved_cur, *saved_rlimit; |
27e2564a NB |
321 | }; |
322 | ||
8121d2c3 NB |
323 | /* A cpp_reader encapsulates the "state" of a pre-processor run. |
324 | Applying cpp_get_token repeatedly yields a stream of pre-processor | |
325 | tokens. Usually, there is only one cpp_reader object active. */ | |
8121d2c3 NB |
326 | struct cpp_reader |
327 | { | |
328 | /* Top of buffer stack. */ | |
329 | cpp_buffer *buffer; | |
330 | ||
d97371e0 NB |
331 | /* Overlaid buffer (can be different after processing #include). */ |
332 | cpp_buffer *overlaid_buffer; | |
333 | ||
8121d2c3 NB |
334 | /* Lexer state. */ |
335 | struct lexer_state state; | |
336 | ||
67821e3a | 337 | /* Source line tracking. */ |
d82fc108 | 338 | struct line_maps line_maps; |
47d89cf3 | 339 | const struct line_map *map; |
1444f2ed | 340 | unsigned int line; |
1444f2ed | 341 | |
50410426 | 342 | /* The line of the '#' of the current directive. */ |
8bbbef34 | 343 | unsigned int directive_line; |
8121d2c3 | 344 | |
b8af0ca5 | 345 | /* Memory buffers. */ |
8c3b2693 | 346 | _cpp_buff *a_buff; /* Aligned permanent storage. */ |
ece54d54 NB |
347 | _cpp_buff *u_buff; /* Unaligned permanent storage. */ |
348 | _cpp_buff *free_buffs; /* Free buffer chain. */ | |
b8af0ca5 | 349 | |
8121d2c3 NB |
350 | /* Context stack. */ |
351 | struct cpp_context base_context; | |
352 | struct cpp_context *context; | |
353 | ||
354 | /* If in_directive, the directive if known. */ | |
355 | const struct directive *directive; | |
356 | ||
5793b276 NB |
357 | /* Search paths for include files. */ |
358 | struct cpp_path *quote_include; /* "" */ | |
359 | struct cpp_path *bracket_include; /* <> */ | |
360 | ||
6356f892 | 361 | /* Multiple include optimization. */ |
8121d2c3 NB |
362 | const cpp_hashnode *mi_cmacro; |
363 | const cpp_hashnode *mi_ind_cmacro; | |
6d18adbc | 364 | bool mi_valid; |
8121d2c3 | 365 | |
5fddcffc NB |
366 | /* Lexing. */ |
367 | cpp_token *cur_token; | |
368 | tokenrun base_run, *cur_run; | |
bdcbe496 | 369 | unsigned int lookaheads; |
5fddcffc | 370 | |
da7d8304 | 371 | /* Nonzero prevents the lexer from re-using the token runs. */ |
5fddcffc NB |
372 | unsigned int keep_tokens; |
373 | ||
8121d2c3 NB |
374 | /* Error counter for exit code. */ |
375 | unsigned int errors; | |
376 | ||
8121d2c3 NB |
377 | /* Buffer to hold macro definition string. */ |
378 | unsigned char *macro_buffer; | |
379 | unsigned int macro_buffer_len; | |
380 | ||
6b88314c ZW |
381 | /* Descriptor for converting from the source character set to the |
382 | execution character set. */ | |
383 | struct cset_converter narrow_cset_desc; | |
e6cc3a24 | 384 | |
6b88314c ZW |
385 | /* Descriptor for converting from the source character set to the |
386 | wide execution character set. */ | |
387 | struct cset_converter wide_cset_desc; | |
e6cc3a24 | 388 | |
8121d2c3 NB |
389 | /* Tree of other included files. See cppfiles.c. */ |
390 | struct splay_tree_s *all_include_files; | |
391 | ||
8121d2c3 NB |
392 | /* Current maximum length of directory names in the search path |
393 | for include files. (Altered as we get more of them.) */ | |
394 | unsigned int max_include_len; | |
395 | ||
278c4662 NB |
396 | /* Date and time text. Calculated together if either is requested. */ |
397 | const uchar *date; | |
398 | const uchar *time; | |
8121d2c3 | 399 | |
4ed5bcfb NB |
400 | /* EOF token, and a token forcing paste avoidance. */ |
401 | cpp_token avoid_paste; | |
402 | cpp_token eof; | |
403 | ||
f4ff5a69 | 404 | /* Opaque handle to the dependencies of mkdeps.c. */ |
8121d2c3 NB |
405 | struct deps *deps; |
406 | ||
407 | /* Obstack holding all macro hash nodes. This never shrinks. | |
408 | See cpphash.c */ | |
2a967f3d | 409 | struct obstack hash_ob; |
8121d2c3 NB |
410 | |
411 | /* Obstack holding buffer and conditional structures. This is a | |
2a967f3d NB |
412 | real stack. See cpplib.c. */ |
413 | struct obstack buffer_ob; | |
8121d2c3 NB |
414 | |
415 | /* Pragma table - dynamic, because a library user can add to the | |
416 | list of recognized pragmas. */ | |
417 | struct pragma_entry *pragmas; | |
418 | ||
48c4721e | 419 | /* Call backs to cpplib client. */ |
8121d2c3 NB |
420 | struct cpp_callbacks cb; |
421 | ||
df383483 | 422 | /* Identifier hash table. */ |
2a967f3d NB |
423 | struct ht *hash_table; |
424 | ||
87ed109f NB |
425 | /* Expression parser stack. */ |
426 | struct op *op_stack, *op_limit; | |
427 | ||
8121d2c3 NB |
428 | /* User visible options. */ |
429 | struct cpp_options opts; | |
430 | ||
431 | /* Special nodes - identifiers with predefined significance to the | |
432 | preprocessor. */ | |
433 | struct spec_nodes spec_nodes; | |
434 | ||
5793b276 NB |
435 | /* Nonzero means don't look for #include "foo" the source-file |
436 | directory. */ | |
437 | unsigned char quote_ignores_source_dir; | |
438 | ||
2a967f3d NB |
439 | /* Whether cpplib owns the hashtable. */ |
440 | unsigned char our_hashtable; | |
004cb263 | 441 | |
1a76916c NB |
442 | /* Traditional preprocessing output buffer (a logical line). */ |
443 | struct | |
444 | { | |
445 | uchar *base; | |
446 | uchar *limit; | |
447 | uchar *cur; | |
448 | unsigned int first_line; | |
449 | } out; | |
450 | ||
451 | /* Used to save the original line number during traditional | |
452 | preprocessing. */ | |
453 | unsigned int saved_line; | |
17211ab5 GK |
454 | |
455 | /* A saved list of the defined macros, for dependency checking | |
456 | of precompiled headers. */ | |
457 | struct cpp_savedstate *savedstate; | |
8121d2c3 NB |
458 | }; |
459 | ||
f6bbde28 | 460 | /* Character classes. Based on the more primitive macros in safe-ctype.h. |
88ae23e7 | 461 | If the definition of `numchar' looks odd to you, please look up the |
91fcd158 NB |
462 | definition of a pp-number in the C standard [section 6.4.8 of C99]. |
463 | ||
464 | In the unlikely event that characters other than \r and \n enter | |
465 | the set is_vspace, the macro handle_newline() in cpplex.c must be | |
466 | updated. */ | |
ae79697b | 467 | #define _dollar_ok(x) ((x) == '$' && CPP_OPTION (pfile, dollars_in_ident)) |
88ae23e7 | 468 | |
f6bbde28 ZW |
469 | #define is_idchar(x) (ISIDNUM(x) || _dollar_ok(x)) |
470 | #define is_numchar(x) ISIDNUM(x) | |
471 | #define is_idstart(x) (ISIDST(x) || _dollar_ok(x)) | |
472 | #define is_numstart(x) ISDIGIT(x) | |
473 | #define is_hspace(x) ISBLANK(x) | |
474 | #define is_vspace(x) IS_VSPACE(x) | |
475 | #define is_nvspace(x) IS_NVSPACE(x) | |
476 | #define is_space(x) IS_SPACE_OR_NUL(x) | |
88ae23e7 | 477 | |
f6bbde28 | 478 | /* This table is constant if it can be initialized at compile time, |
88ae23e7 ZW |
479 | which is the case if cpp was compiled with GCC >=2.7, or another |
480 | compiler that supports C99. */ | |
61d0346d | 481 | #if HAVE_DESIGNATED_INITIALIZERS |
61d0346d | 482 | extern const unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; |
88ae23e7 | 483 | #else |
61d0346d | 484 | extern unsigned char _cpp_trigraph_map[UCHAR_MAX + 1]; |
88ae23e7 ZW |
485 | #endif |
486 | ||
487 | /* Macros. */ | |
488 | ||
bef985f3 | 489 | #define CPP_IN_SYSTEM_HEADER(PFILE) ((PFILE)->map && (PFILE)->map->sysp) |
28e0f040 NB |
490 | #define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic) |
491 | #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional) | |
88ae23e7 | 492 | |
58fea6af | 493 | /* In cpperror.c */ |
6cf87ca4 | 494 | extern int _cpp_begin_message (cpp_reader *, int, unsigned int, unsigned int); |
58fea6af | 495 | |
711b8824 | 496 | /* In cppmacro.c */ |
6cf87ca4 ZW |
497 | extern void _cpp_free_definition (cpp_hashnode *); |
498 | extern bool _cpp_create_definition (cpp_reader *, cpp_hashnode *); | |
499 | extern void _cpp_pop_context (cpp_reader *); | |
500 | extern void _cpp_push_text_context (cpp_reader *, cpp_hashnode *, | |
501 | const uchar *, size_t); | |
502 | extern bool _cpp_save_parameter (cpp_reader *, cpp_macro *, cpp_hashnode *); | |
503 | extern bool _cpp_arguments_ok (cpp_reader *, cpp_macro *, const cpp_hashnode *, | |
504 | unsigned int); | |
505 | extern const uchar *_cpp_builtin_macro_text (cpp_reader *, cpp_hashnode *); | |
506 | int _cpp_warn_if_unused_macro (cpp_reader *, cpp_hashnode *, void *); | |
711b8824 | 507 | /* In cpphash.c */ |
6cf87ca4 ZW |
508 | extern void _cpp_init_hashtable (cpp_reader *, hash_table *); |
509 | extern void _cpp_destroy_hashtable (cpp_reader *); | |
bb52fa7f | 510 | |
88ae23e7 | 511 | /* In cppfiles.c */ |
6cf87ca4 ZW |
512 | extern void _cpp_fake_include (cpp_reader *, const char *); |
513 | extern void _cpp_never_reread (struct include_file *); | |
514 | extern bool _cpp_read_file (cpp_reader *, const char *); | |
515 | extern bool _cpp_execute_include (cpp_reader *, const char *, int, | |
516 | enum include_type); | |
517 | extern int _cpp_compare_file_date (cpp_reader *, const char *, int); | |
518 | extern void _cpp_report_missing_guards (cpp_reader *); | |
519 | extern void _cpp_init_includes (cpp_reader *); | |
520 | extern void _cpp_cleanup_includes (cpp_reader *); | |
521 | extern void _cpp_pop_file_buffer (cpp_reader *, struct include_file *); | |
88ae23e7 ZW |
522 | |
523 | /* In cppexp.c */ | |
6cf87ca4 ZW |
524 | extern bool _cpp_parse_expr (cpp_reader *); |
525 | extern struct op *_cpp_expand_op_stack (cpp_reader *); | |
88ae23e7 | 526 | |
45b966db | 527 | /* In cpplex.c */ |
6cf87ca4 ZW |
528 | extern void _cpp_process_line_notes (cpp_reader *, int); |
529 | extern void _cpp_clean_line (cpp_reader *); | |
530 | extern bool _cpp_get_fresh_line (cpp_reader *); | |
531 | extern bool _cpp_skip_block_comment (cpp_reader *); | |
532 | extern cpp_token *_cpp_temp_token (cpp_reader *); | |
533 | extern const cpp_token *_cpp_lex_token (cpp_reader *); | |
534 | extern cpp_token *_cpp_lex_direct (cpp_reader *); | |
535 | extern int _cpp_equiv_tokens (const cpp_token *, const cpp_token *); | |
536 | extern void _cpp_init_tokenrun (tokenrun *, unsigned int); | |
45b966db | 537 | |
d7bc7a98 | 538 | /* In cppinit.c. */ |
6cf87ca4 | 539 | extern void _cpp_maybe_push_include_file (cpp_reader *); |
d7bc7a98 | 540 | |
45b966db | 541 | /* In cpplib.c */ |
6cf87ca4 ZW |
542 | extern int _cpp_test_assertion (cpp_reader *, unsigned int *); |
543 | extern int _cpp_handle_directive (cpp_reader *, int); | |
544 | extern void _cpp_define_builtin (cpp_reader *, const char *); | |
545 | extern char ** _cpp_save_pragma_names (cpp_reader *); | |
546 | extern void _cpp_restore_pragma_names (cpp_reader *, char **); | |
547 | extern void _cpp_do__Pragma (cpp_reader *); | |
548 | extern void _cpp_init_directives (cpp_reader *); | |
549 | extern void _cpp_init_internal_pragmas (cpp_reader *); | |
550 | extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *, | |
551 | unsigned int, unsigned int); | |
552 | extern void _cpp_pop_buffer (cpp_reader *); | |
12cf91fe | 553 | |
004cb263 | 554 | /* In cpptrad.c. */ |
43839642 | 555 | extern bool _cpp_scan_out_logical_line (cpp_reader *, cpp_macro *); |
6cf87ca4 ZW |
556 | extern bool _cpp_read_logical_line_trad (cpp_reader *); |
557 | extern void _cpp_overlay_buffer (cpp_reader *pfile, const uchar *, size_t); | |
558 | extern void _cpp_remove_overlay (cpp_reader *); | |
559 | extern bool _cpp_create_trad_definition (cpp_reader *, cpp_macro *); | |
560 | extern bool _cpp_expansions_different_trad (const cpp_macro *, | |
561 | const cpp_macro *); | |
562 | extern uchar *_cpp_copy_replacement_text (const cpp_macro *, uchar *); | |
563 | extern size_t _cpp_replacement_text_len (const cpp_macro *); | |
004cb263 | 564 | |
1613e52b | 565 | /* In cppcharset.c. */ |
6b88314c ZW |
566 | extern cppchar_t _cpp_valid_ucn (cpp_reader *, const uchar **, |
567 | const uchar *, int); | |
568 | extern void _cpp_destroy_iconv (cpp_reader *); | |
569 | extern bool _cpp_interpret_string_notranslate (cpp_reader *, const cpp_string *, | |
570 | cpp_string *); | |
1613e52b | 571 | |
c31a6508 | 572 | /* Utility routines and macros. */ |
562a5c27 | 573 | #define DSC(str) (const uchar *)str, sizeof str - 1 |
c31a6508 | 574 | #define xnew(T) (T *) xmalloc (sizeof(T)) |
a58d32c2 | 575 | #define xcnew(T) (T *) xcalloc (1, sizeof(T)) |
c31a6508 | 576 | #define xnewvec(T, N) (T *) xmalloc (sizeof(T) * (N)) |
711b8824 | 577 | #define xcnewvec(T, N) (T *) xcalloc (N, sizeof(T)) |
c71f835b | 578 | #define xobnew(O, T) (T *) obstack_alloc (O, sizeof(T)) |
c31a6508 | 579 | |
8121d2c3 NB |
580 | /* These are inline functions instead of macros so we can get type |
581 | checking. */ | |
6cf87ca4 ZW |
582 | static inline int ustrcmp (const uchar *, const uchar *); |
583 | static inline int ustrncmp (const uchar *, const uchar *, size_t); | |
584 | static inline size_t ustrlen (const uchar *); | |
585 | static inline uchar *uxstrdup (const uchar *); | |
586 | static inline uchar *ustrchr (const uchar *, int); | |
587 | static inline int ufputs (const uchar *, FILE *); | |
8121d2c3 NB |
588 | |
589 | static inline int | |
6cf87ca4 | 590 | ustrcmp (const uchar *s1, const uchar *s2) |
8121d2c3 NB |
591 | { |
592 | return strcmp ((const char *)s1, (const char *)s2); | |
593 | } | |
594 | ||
595 | static inline int | |
6cf87ca4 | 596 | ustrncmp (const uchar *s1, const uchar *s2, size_t n) |
8121d2c3 NB |
597 | { |
598 | return strncmp ((const char *)s1, (const char *)s2, n); | |
599 | } | |
600 | ||
601 | static inline size_t | |
6cf87ca4 | 602 | ustrlen (const uchar *s1) |
8121d2c3 NB |
603 | { |
604 | return strlen ((const char *)s1); | |
605 | } | |
606 | ||
562a5c27 | 607 | static inline uchar * |
6cf87ca4 | 608 | uxstrdup (const uchar *s1) |
8121d2c3 | 609 | { |
562a5c27 | 610 | return (uchar *) xstrdup ((const char *)s1); |
8121d2c3 NB |
611 | } |
612 | ||
562a5c27 | 613 | static inline uchar * |
6cf87ca4 | 614 | ustrchr (const uchar *s1, int c) |
8121d2c3 | 615 | { |
562a5c27 | 616 | return (uchar *) strchr ((const char *)s1, c); |
8121d2c3 NB |
617 | } |
618 | ||
619 | static inline int | |
6cf87ca4 | 620 | ufputs (const uchar *s, FILE *f) |
8121d2c3 NB |
621 | { |
622 | return fputs ((const char *)s, f); | |
623 | } | |
624 | ||
88657302 | 625 | #endif /* ! GCC_CPPHASH_H */ |