1 /* Definitions for CPP library.
2 Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
3 Written by Per Bothner, 1994-95.
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
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.
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
17 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 In other words, you are welcome to use, share and improve this program.
20 You are forbidden to forbid anyone else to use, share and improve
21 what you give them. Help stamp out software-hoarding! */
23 #include <sys/types.h>
30 typedef enum cpp_token (*parseUnderflow) (cppReader *);
31 typedef void (*parseCleanup) (cppBuffer *, cppReader *);
33 /* Structure returned by create_definition */
34 typedef struct s_macrodef macroDef;
36 /* A parse_marker indicates a previous position,
37 which we can backtrack to. */
40 /*@dependent@*/ cppBuffer *buf;
41 /*@dependent@*/ /*@null@*/ struct parse_marker *next;
45 /* The arglist structure is built by do_define to tell
46 collect_definition where the argument names begin. That
47 is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
48 would contain pointers to the strings x, y, and z.
49 Collect_definition would then build a DEFINITION node,
50 with reflist nodes pointing to the places x, y, and z had
51 appeared. So the arglist is just convenience data passed
52 between these two routines. It is not kept around after
53 the current #define has been processed and entered into the
57 /*@null@*/ struct arglist *next;
58 /*@dependent@*/ char *name;
64 extern enum cpp_token cpplib_getToken (cppReader *);
65 extern enum cpp_token cpplib_getTokenForceExpand (cppReader *);
66 extern enum cpp_token cpplib_getTokenAux (cppReader *, bool p_forceExpand);
67 extern int /*@alt void@*/ cppSkipHspace (cppReader *);
69 /* This frees resources used by PFILE. */
70 extern /*@unused@*/ void cppCleanup (cppReader *p_pfile);
73 /*@null@*/ /*@only@*/ char *buf;
74 /*@null@*/ /*@exposed@*/ char *cur;
75 /*@null@*/ /*@exposed@*/ char *rlimit; /* end of valid data */
76 /*@null@*/ /*@exposed@*/ char *alimit; /* end of allocated buffer */
77 /*@null@*/ /*@exposed@*/ char *prev;
79 /*@dependent@*/ cstring fname;
81 /* Filename specified with #line command. */
82 /*@exposed@*/ cstring nominal_fname;
84 /* Record where in the search path this file was found.
87 /*@dependent@*/ /*@null@*/ struct file_name_list *dir;
90 int lineno; /* Line number at CPP_LINE_BASE. */
91 int colno; /* Column number at CPP_LINE_BASE. */
92 parseUnderflow underflow;
95 /*@dependent@*/ hashNode hnode;
96 /*@dependent@*/ /*@null@*/ struct parse_marker *marks;
97 /* Value of if_stack at start of this file.
98 Used to prohibit unmatched #endif (etc) in an include file. */
99 /*@null@*/ /*@exposed@*/ struct if_stack *if_stack;
101 /* True if this is a header file included using <FILENAME>. */
102 char system_header_p;
105 /* True if buffer contains escape sequences.
106 Currently there are three kinds:
107 "@-" means following identifier should not be macro-expanded.
108 "@ " means a token-separator. This turns into " " in final output
109 if not stringizing and needed to separate tokens; otherwise nothing.
110 "@@" means a normal '@'.
111 (An '@' inside a string stands for itself and is never an escape.) */
115 struct cpp_pending; /* Forward declaration - for C++. */
116 struct file_name_map_list;
118 /* Maximum nesting of cppBuffers. We use a static limit, partly for
119 efficiency, and partly to limit runaway recursion. */
121 /*@constant int CPP_STACK_MAX; @*/
122 # define CPP_STACK_MAX 200
124 /* A cppReader encapsulates the "state" of a pre-processor run.
125 Applying cppGetToken repeatedly yields a stream of pre-processor
126 tokens. Usually, there is only one cppReader object active. */
129 parseUnderflow get_token;
130 /*@dependent@*/ /*@null@*/ cppBuffer *buffer;
131 cppBuffer buffer_stack[CPP_STACK_MAX];
133 int errors; /* Error counter for exit code */
137 /* A buffer used for both for cppGetToken's output, and also internally. */
138 /*@relnull@*/ char *token_buffer;
140 /* Alocated size of token_buffer. cppReader_reserve allocates space. */
141 size_t token_buffer_size;
142 /* End of the written part of token_buffer. */
143 /*@exposed@*/ char *limit;
145 /* Line where a newline was first seen in a string constant. */
146 int multiline_string_line;
148 /* Current depth in #include directives that use <...>. */
149 int system_include_depth;
151 /* List of other included files.
152 If ->control_macro if nonzero, the file had a #ifndef
153 around the entire contents, and ->control_macro gives the macro name. */
154 /*@owned@*/ /*@null@*/ struct file_name_list *all_include_files;
156 /* Current maximum length of directory names in the search path
157 for include files. (Altered as we get more of them.) */
158 size_t max_include_len;
160 /*@null@*/ struct if_stack *if_stack;
162 /* Nonzero means we are inside an IF during a -pcp run. In this mode
163 macro expansion is done, and preconditions are output for all macro
164 uses requiring them. */
167 /* Nonzero means we have printed (while error reporting) a list of
168 containing files that matches the current status. */
169 char input_stack_listing_current;
171 /* If non-zero, macros are not expanded. */
172 bool no_macro_expand;
174 /* Print column number in error messages. */
177 /* If true, character between '<' and '>' are a single (string) token. */
178 char parsing_include_directive;
180 /* True if escape sequences (as described for has_escapes in
181 parse_buffer) should be emitted. */
184 /* 0: Have seen non-white-space on this line.
185 1: Only seen white space so far on this line.
186 2: Only seen white space so far in this file. */
187 char only_seen_white;
191 /*@null@*/ /*@observer@*/ struct tm *timebuf;
194 /*@constant int cppReader_fatalErrorLimit; @*/
195 #define cppReader_fatalErrorLimit 1000
197 /* True if we have seen a "fatal" error. */
198 extern bool cpplib_fatalErrors (cppReader *) /*@*/ ;
199 #define cpplib_fatalErrors(READER) ((READER)->errors >= cppReader_fatalErrorLimit)
201 extern int cpplib_bufPeek (cppBuffer *) /*@*/ ;
203 /* Macros for manipulating the token_buffer. */
206 #define CPP_OUT_BUFFER(PFILE) ((PFILE)->token_buffer)
208 /* Number of characters currently in PFILE's output buffer. */
210 extern size_t cpplib_getWritten (/*@sef@*/ cppReader *) /*@*/ ;
211 # define cpplib_getWritten(PFILE) \
212 (size_fromInt ((PFILE)->limit - (PFILE)->token_buffer))
214 extern /*@exposed@*/ char *cpplib_getPWritten (cppReader *) /*@*/ ;
215 # define cpplib_getPWritten(PFILE) ((PFILE)->limit)
217 extern /*@null@*/ macroDef
218 cpplib_createDefinition (/*@dependent@*/ cstring p_def, fileloc p_loc,
219 bool p_predefinition, bool p_noExpand) ;
221 /* Make sure PFILE->token_buffer has space for at least N more characters. */
223 extern void cpplib_reserve (/*@sef@*/ cppReader *, /*@sef@*/ size_t);
224 #define cpplib_reserve(PFILE, N) \
225 (((cpplib_getWritten (PFILE) + (N) > (PFILE)->token_buffer_size)) ? cppReader_growBuffer (PFILE, (N)) : (void) 0)
227 /* Append string STR (of length N) to PFILE's output buffer.
228 Assume there is enough space. */
230 extern void cppReader_putStrN (/*@sef@*/ cppReader *p_file,
231 /*@unique@*/ char *p_str, /*@sef@*/ size_t p_n)
232 /*@modifies *p_file; @*/;
234 #define cppReader_putStrN(PFILE, STR, N) \
235 (memcpy ((PFILE)->limit, STR, (N)), (PFILE)->limit += (N))
237 extern void cppReader_setWritten (/*@sef@*/ /*@special@*/ cppReader *p_file, size_t)
238 /*@uses p_file, *p_file, p_file->token_buffer;@*/
239 /*@sets p_file->limit;@*/
240 /*@modifies *p_file@*/ ;
242 # define cppReader_setWritten(PFILE,N) \
243 ((PFILE)->limit = (PFILE)->token_buffer + (N))
245 extern /*@dependent@*/ /*@exposed@*/ cppOptions *CPPOPTIONS (/*@special@*/ cppReader *p_pfile)
246 /*@uses p_pfile->opts@*/ ;
247 #define CPPOPTIONS(PFILE) ((PFILE)->opts)
250 #define CPPBUFFER(PFILE) ((PFILE)->buffer)
252 /* Checks for null */
253 extern /*@exposed@*/ cppBuffer *
254 cppReader_getBufferSafe (/*@special@*/ cppReader *p_pfile)
255 /*@uses p_pfile->buffer@*/
256 /*@modifies nothing@*/ ;
258 extern /*@exposed@*/ cppBuffer *cppBuffer_prevBuffer (cppBuffer *) /*@*/ ;
260 /* The bottom of the buffer stack. */
261 extern /*@exposed@*/ cppBuffer *cppReader_nullBuffer (/*@special@*/ cppReader *p_pfile) /*@uses p_pfile->buffer_stack@*/ /*@*/ ;
262 # define cppReader_nullBuffer(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX])
264 /* Pointed to by cppReader::data. */
266 /*@dependent@*/ cstring in_fname;
268 /* Name of output file, for error messages. */
269 /*@dependent@*/ cstring out_fname;
271 /*@only@*/ struct file_name_map_list *map_list;
273 /* Non-0 means -v, so print the full set of include dirs. */
276 /* Nonzero means use extra default include directories for C++. */
280 /* Nonzero means handle cplusplus style comments */
282 bool cplusplus_comments;
284 /* Nonzero means this is an assembly file, and allow
285 unknown directives, which could be comments. */
289 /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
293 /* Nonzero means handle CHILL comment syntax
294 and output CHILL string delimiter for __DATE___ etc. */
298 /* Nonzero means copy comments into the output file. */
300 bool put_out_comments;
302 /* Nonzero means don't process the ANSI trigraph sequences. */
306 /* Nonzero means print names of header files (-H). */
308 bool print_include_names;
310 /* Nonzero means try to make failure to fit ANSI C an error. */
312 bool pedantic_errors;
314 /* Nonzero means don't print warning messages. -w. */
315 /* bool inhibit_warnings; -- removed evans 2001-07-19 */
317 /* Nonzero means warn if slash-star appears in a comment. */
320 /* Nonzero means warn if a macro argument is (or would be)
321 stringified with -traditional. */
324 bool warnings_are_errors;
327 /* Nonzero means don't output line number information. */
329 bool no_line_commands;
331 /* Nonzero means output the text in failing conditionals,
332 inside #failed ... #endfailed. */
334 char output_conditionals;
338 /* Zero means dollar signs are punctuation.
339 This used to be needed for conformance to the C Standard,
340 before the C Standard was corrected. */
341 bool dollars_in_ident;
343 /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
346 /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
349 /* Nonzero means give all the error messages the ANSI standard requires. */
352 bool done_initializing;
354 /* First dir to search */
355 /*@owned@*/ struct file_name_list *include;
357 /* First dir to search for <file> */
358 /* This is the first element to use for #include <...>.
359 If it is 0, use the entire chain for such includes. */
360 /*@dependent@*/ struct file_name_list *first_bracket_include;
361 /* This is the first element in the chain that corresponds to
362 a directory of system header files. */
363 /*@dependent@*/ struct file_name_list *first_system_include;
364 /*@exposed@*/ struct file_name_list *last_include; /* Last in chain */
366 /* Chain of include directories to put at the end of the other chain. */
367 struct file_name_list *after_include;
368 /*@exposed@*/ struct file_name_list *last_after_include; /* Last in chain */
370 /* Chain to put at the start of the system include files. */
371 struct file_name_list *before_system;
372 /*@exposed@*/ struct file_name_list *last_before_system; /* Last in chain */
374 /* Directory prefix that should replace `/usr' in the standard
375 include file directories. */
376 char *include_prefix;
378 char inhibit_predefs;
379 char no_standard_includes;
380 char no_standard_cplusplus_includes;
383 ** DUMP_NAMES means pass #define and the macro name through to output.
384 ** DUMP_DEFINITIONS means pass the whole definition (plus #define) through
388 enum { DUMP_NONE = 0, DUMP_NAMES, DUMP_DEFINITIONS }
392 /* Nonzero means pass all #define and #undef directives which we actually
393 process through to the output stream. This feature is used primarily
394 to allow cc1 to record the #defines and #undefs for the sake of
395 debuggers which understand about preprocessor macros, but it may
396 also be useful with -E to figure out how symbols are defined, and
397 where they are defined. */
401 extern bool cppReader_isTraditional (/*@special@*/ cppReader *p_pfile)
402 /*@uses p_pfile->opts@*/
403 /*@modifies nothing@*/ ;
405 #define cppReader_isTraditional(PFILE) (CPPOPTIONS(PFILE)-> traditional)
407 extern bool cppReader_isPedantic (cppReader *) /*@*/;
408 #define cppReader_isPedantic(PFILE) (CPPOPTIONS (PFILE)->pedantic)
410 /* The structure of a node in the hash table. The hash table
411 has entries for all tokens defined by #define commands (type T_MACRO),
412 plus some special tokens like __LINE__ (these each have their own
413 type, and the appropriate code is run when that type of node is seen.
414 It does not contain control words like "#define", which are recognized
415 by a separate piece of code. */
417 /* different flavors of hash nodes --- also used in keyword table */
420 T_DEFINE = 1, /* the `#define' keyword */
421 T_INCLUDE, /* the `#include' keyword */
422 T_INCLUDE_NEXT, /* the `#include_next' keyword */
423 T_IFDEF, /* the `#ifdef' keyword */
424 T_IFNDEF, /* the `#ifndef' keyword */
425 T_IF, /* the `#if' keyword */
426 T_ELSE, /* `#else' */
427 T_PRAGMA, /* `#pragma' */
428 T_ELIF, /* `#elif' */
429 T_UNDEF, /* `#undef' */
430 T_LINE, /* `#line' */
431 T_ERROR, /* `#error' */
432 T_WARNING, /* `#warning' */
433 T_ENDIF, /* `#endif' */
434 T_IDENT, /* `#ident', used on system V. */
435 T_SPECLINE, /* special symbol `__LINE__' */
436 T_DATE, /* `__DATE__' */
437 T_FILE, /* `__FILE__' */
438 T_BASE_FILE, /* `__BASE_FILE__' */
439 T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
440 T_VERSION, /* `__VERSION__' */
441 T_SIZE_TYPE, /* `__SIZE_TYPE__' */
442 T_PTRDIFF_TYPE, /* `__PTRDIFF_TYPE__' */
443 T_WCHAR_TYPE, /* `__WCHAR_TYPE__' */
444 T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */
445 T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */
446 T_TIME, /* `__TIME__' */
447 T_CONST, /* Constant value, used by `__STDC__' */
448 T_MACRO, /* macro defined by `#define' */
449 T_DISABLED, /* macro temporarily turned off for rescan */
450 T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
451 T_PCSTRING, /* precompiled string (hashval is KEYDEF *) */
452 T_UNUSED /* Used for something not defined. */
457 /*@null@*/ struct definition *defn;
458 /*@exposed@*/ /*@relnull@*/ char *symnam; /* null if defn is null */
462 /* Structure allocated for every #define. For a simple replacement
465 nargs = -1, the `pattern' list is null, and the expansion is just
466 the replacement text. Nargs = 0 means a functionlike macro with no args,
468 #define getchar() getc (stdin) .
469 When there are args, the expansion is the replacement text with the
470 args squashed out, and the reflist is a list describing how to
471 build the output from the input: e.g., "3 chars, then the 1st arg,
472 then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
473 The chars here come from the expansion. Whatever is left of the
474 expansion after the last arg-occurrence is copied after that arg.
475 Note that the reflist can be arbitrarily long---
476 its length depends on the number of times the arguments appear in
477 the replacement text, not how many args there are. Example:
478 #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
480 { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
481 where (x, y) means (nchars, argno). */
483 typedef struct definition DEFINITION;
487 size_t length; /* length of expansion string */
488 bool predefined; /* True if the macro was builtin or */
489 /* came from the command line */
490 /*@dependent@*/ char *expansion;
491 long line; /* Line number of definition */
492 /*@exposed@*/ cstring file; /* File of definition */
494 bool noExpand; /* True if macro should not be expanded in code. */
495 bool rest_args; /* Nonzero if last arg. absorbs the rest */
497 /*@null@*/ struct reflist {
498 /*@null@*/ /*@dependent@*/ struct reflist *next;
499 bool stringify; /* nonzero if this arg was preceded by a
501 bool raw_before; /* Nonzero if a ## operator before arg. */
502 bool raw_after; /* Nonzero if a ## operator after arg. */
503 bool rest_args; /* Nonzero if this arg. absorbs the rest */
504 int nchars; /* Number of literal chars to copy before
505 this arg occurrence. */
506 int argno; /* Number of arg to substitute (origin-0) */
510 /* Names of macro args, concatenated in reverse order
511 with comma-space between them.
512 The only use of this is that we warn on redefinition
513 if this differs between the old and new definitions. */
514 /*@null@*/ char *argnames;
518 /* Stack of conditionals currently in progress
519 (including both successful and failing conditionals). */
522 /*@null@*/ struct if_stack *next; /* for chaining to the next stack frame */
523 /*@observer@*/ cstring fname; /* copied from input when frame is made */
524 int lineno; /* similarly */
525 int if_succeeded; /* true if a leg of this if-group
526 has been passed through rescan */
528 /* For #ifndef at start of file, this is the macro name tested. */
529 /*@null@*/ /*@dependent@*/ char *control_macro;
532 enum node_type type; /* type of last directive seen in this group */
534 typedef struct if_stack cppIfStackFrame;
536 extern void cppBuffer_getLineAndColumn (/*@null@*/ cppBuffer *, /*@out@*/ int *,
537 /*@out@*/ /*@null@*/ int *);
538 extern /*@exposed@*/ /*@null@*/ cppBuffer *cppReader_fileBuffer (cppReader *);
540 extern void cppReader_growBuffer (cppReader *, size_t);
541 extern int cppReader_parseEscape (cppReader *, char **);
543 extern /*@exposed@*/ cppBuffer *cppReader_popBuffer (cppReader *p_pfile)
544 /*@modifies p_pfile@*/ ;
550 extern void cppReader_skipRestOfLine (cppReader *p_pfile);
554 /*@constant observer char *GCC_INCLUDE_DIR;@*/
555 /* This is defined by config.h now. */
557 /*@constant observer char *GCC_INCLUDE_DIR2@*/
558 /* This is defined by config.h now. */
560 struct file_name_list
562 /*@owned@*/ /*@null@*/ struct file_name_list *next;
563 /*@dependent@*/ cstring fname;
565 /* If the following is nonzero, it is a macro name.
566 Don't include the file again if that macro is defined. */
568 /*@dependent@*/ /*@null@*/ char *control_macro;
569 /* If the following is nonzero, it is a C-language system include
572 bool c_system_include_path;
574 /* Mapping of file names for this directory. */
575 /*@exposed@*/ /*@relnull@*/ /*@reldef@*/ struct file_name_map *name_map;
577 /* Non-zero if name_map is valid. */
581 extern void cppReader_addIncludeChain (/*@special@*/ cppReader *p_pfile,
582 /*@only@*/ struct file_name_list *p_dir)
583 /*@uses p_pfile->opts, p_pfile->max_include_len@*/
584 /*@modifies p_pfile, p_dir@*/ ;
586 extern void cppReader_define (cppReader *p_pfile, char *p_str);
587 extern void cppReader_finish (cppReader *p_pfile);
588 extern void cpplib_init (/*@out@*/ cppReader *p_pfile) ;
589 extern void cppOptions_init (/*@out@*/ cppOptions *p_opts);
590 extern void cpplib_initializeReader (cppReader *p_pfile) /*@modifies p_pfile@*/ ;
592 extern int cppReader_startProcess (cppReader *p_pfile, cstring p_fname);
594 extern bool isIdentifierChar (char) /*@*/ ;
596 /* Find the largest host integer type and set its size and type. */
598 #ifndef HOST_BITS_PER_WIDE_INT
600 #if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
602 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
604 #define HOST_WIDE_INT long
607 #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
609 #define HOST_WIDE_INT long
617 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
623 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
627 #ifndef INCLUDE_LEN_FUDGE
628 /*@constant int INCLUDE_LEN_FUDGE@*/
629 #define INCLUDE_LEN_FUDGE 0
632 extern size_t cppReader_checkMacroName (cppReader *p_pfile, char *p_symname,
635 extern struct operation cppReader_parseNumber (cppReader * p_pfile, char * p_start, int p_olen) /*@requires maxRead(p_start) >= (p_olen - 1) @*/;