typedef struct cpp_reader cpp_reader;
typedef struct cpp_buffer cpp_buffer;
typedef struct cpp_options cpp_options;
+typedef struct cpp_printer cpp_printer;
+typedef struct cpp_token cpp_token;
+typedef struct cpp_toklist cpp_toklist;
+typedef struct cpp_string cpp_string;
+typedef struct cpp_hashnode cpp_hashnode;
+
+/* The first two groups, apart from '=', can appear in preprocessor
+ expressions. This allows a lookup table to be implemented in
+ _cpp_parse_expr.
+
+ The first group, to CPP_LAST_EQ, can be immediately followed by an
+ '='. The lexer needs operators ending in '=', like ">>=", to be in
+ the same order as their counterparts without the '=', like ">>". */
+
+/* Positions in the table. */
+#define CPP_LAST_EQ CPP_LSHIFT
+#define CPP_FIRST_DIGRAPH CPP_HASH
+
+#define TTYPE_TABLE \
+ OP(CPP_EQ = 0, "=") \
+ OP(CPP_NOT, "!") \
+ OP(CPP_GREATER, ">") /* compare */ \
+ OP(CPP_LESS, "<") \
+ OP(CPP_PLUS, "+") /* math */ \
+ OP(CPP_MINUS, "-") \
+ OP(CPP_MULT, "*") \
+ OP(CPP_DIV, "/") \
+ OP(CPP_MOD, "%") \
+ OP(CPP_AND, "&") /* bit ops */ \
+ OP(CPP_OR, "|") \
+ OP(CPP_XOR, "^") \
+ OP(CPP_RSHIFT, ">>") \
+ OP(CPP_LSHIFT, "<<") \
+ OP(CPP_MIN, "<?") /* extension */ \
+ OP(CPP_MAX, ">?") \
+\
+ OP(CPP_COMPL, "~") \
+ OP(CPP_AND_AND, "&&") /* logical */ \
+ OP(CPP_OR_OR, "||") \
+ OP(CPP_QUERY, "?") \
+ OP(CPP_COLON, ":") \
+ OP(CPP_COMMA, ",") /* grouping */ \
+ OP(CPP_OPEN_PAREN, "(") \
+ OP(CPP_CLOSE_PAREN, ")") \
+ OP(CPP_EQ_EQ, "==") /* compare */ \
+ OP(CPP_NOT_EQ, "!=") \
+ OP(CPP_GREATER_EQ, ">=") \
+ OP(CPP_LESS_EQ, "<=") \
+\
+ OP(CPP_PLUS_EQ, "+=") /* math */ \
+ OP(CPP_MINUS_EQ, "-=") \
+ OP(CPP_MULT_EQ, "*=") \
+ OP(CPP_DIV_EQ, "/=") \
+ OP(CPP_MOD_EQ, "%=") \
+ OP(CPP_AND_EQ, "&=") /* bit ops */ \
+ OP(CPP_OR_EQ, "|=") \
+ OP(CPP_XOR_EQ, "^=") \
+ OP(CPP_RSHIFT_EQ, ">>=") \
+ OP(CPP_LSHIFT_EQ, "<<=") \
+ OP(CPP_MIN_EQ, "<?=") /* extension */ \
+ OP(CPP_MAX_EQ, ">?=") \
+ /* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \
+ OP(CPP_HASH, "#") /* digraphs */ \
+ OP(CPP_PASTE, "##") \
+ OP(CPP_OPEN_SQUARE, "[") \
+ OP(CPP_CLOSE_SQUARE, "]") \
+ OP(CPP_OPEN_BRACE, "{") \
+ OP(CPP_CLOSE_BRACE, "}") \
+ /* The remainder of the punctuation. Order is not significant. */ \
+ OP(CPP_SEMICOLON, ";") /* structure */ \
+ OP(CPP_ELLIPSIS, "...") \
+ OP(CPP_BACKSLASH, "\\") \
+ OP(CPP_PLUS_PLUS, "++") /* increment */ \
+ OP(CPP_MINUS_MINUS, "--") \
+ OP(CPP_DEREF, "->") /* accessors */ \
+ OP(CPP_DOT, ".") \
+ OP(CPP_SCOPE, "::") \
+ OP(CPP_DEREF_STAR, "->*") \
+ OP(CPP_DOT_STAR, ".*") \
+ OP(CPP_DEFINED, "defined") /* #if */ \
+\
+ TK(CPP_NAME, SPELL_IDENT) /* word */ \
+ TK(CPP_INT, SPELL_STRING) /* 23 */ \
+ TK(CPP_FLOAT, SPELL_STRING) /* 3.14159 */ \
+ TK(CPP_NUMBER, SPELL_STRING) /* 34_be+ta */ \
+\
+ TK(CPP_CHAR, SPELL_STRING) /* 'char' */ \
+ TK(CPP_WCHAR, SPELL_STRING) /* L'char' */ \
+ TK(CPP_OTHER, SPELL_CHAR) /* stray punctuation */ \
+\
+ TK(CPP_STRING, SPELL_STRING) /* "string" */ \
+ TK(CPP_WSTRING, SPELL_STRING) /* L"string" */ \
+ TK(CPP_HEADER_NAME, SPELL_STRING) /* <stdio.h> in #include */ \
+\
+ TK(CPP_COMMENT, SPELL_STRING) /* Only if output comments. */ \
+ TK(CPP_MACRO_ARG, SPELL_NONE) /* Macro argument. */ \
+ TK(CPP_PLACEMARKER, SPELL_NONE) /* Placemarker token. */ \
+ TK(CPP_EOF, SPELL_NONE) /* End of file. */
+
+#define OP(e, s) e,
+#define TK(e, s) e,
+enum cpp_ttype
+{
+ TTYPE_TABLE
+ N_TTYPES
+};
+#undef OP
+#undef TK
-enum cpp_token
+/* Payload of a NUMBER, FLOAT, STRING, or COMMENT token. */
+struct cpp_string
{
- CPP_EOF = -1,
- CPP_OTHER = 0,
- CPP_COMMENT = 1,
- CPP_HSPACE,
- CPP_VSPACE, /* newlines and #line directives */
- CPP_NAME,
- CPP_NUMBER,
- CPP_CHAR,
- CPP_WCHAR,
- CPP_STRING,
- CPP_WSTRING,
- CPP_DIRECTIVE,
- CPP_ASSERTION, /* #machine(a29k) */
- CPP_STRINGIZE, /* stringize macro argument */
- CPP_TOKPASTE, /* paste macro arg with next/prev token */
- CPP_LPAREN, /* "(" */
- CPP_RPAREN, /* ")" */
- CPP_LBRACE, /* "{" */
- CPP_RBRACE, /* "}" */
- CPP_COMMA, /* "," */
- CPP_SEMICOLON, /* ";" */
- CPP_3DOTS, /* "..." */
- CPP_POP /* We're about to pop the buffer stack. */
+ unsigned int len;
+ const unsigned char *text;
};
-typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader *));
+/* Flags for the cpp_token structure. */
+#define PREV_WHITE (1 << 0) /* If whitespace before this token. */
+#define BOL (1 << 1) /* Beginning of logical line. */
+#define DIGRAPH (1 << 2) /* If it was a digraph. */
+#define STRINGIFY_ARG (1 << 3) /* If macro argument to be stringified. */
+#define PASTE_LEFT (1 << 4) /* If on LHS of a ## operator. */
+#define PASTED (1 << 5) /* The result of a ## operator. */
+#define NAMED_OP (1 << 6) /* C++ named operators, also defined */
+
+/* A preprocessing token. This has been carefully packed and should
+ occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts. */
+struct cpp_token
+{
+ unsigned int line; /* starting line number of this token */
+ unsigned short col; /* starting column of this token */
+ ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT; /* token type */
+ unsigned char flags; /* flags - see above */
+
+ union
+ {
+ HOST_WIDEST_INT integer; /* an integer */
+ struct cpp_hashnode *node; /* an identifier */
+ struct cpp_string str; /* a string, or number */
+ unsigned int aux; /* argument no. for a CPP_MACRO_ARG, or
+ character represented by CPP_OTHER. */
+ } val;
+};
+
+/* cpp_toklist flags. */
+#define LIST_OFFSET (1 << 0)
+#define VAR_ARGS (1 << 1)
+#define GNU_REST_ARGS (1 << 2) /* Set in addition to VAR_ARGS. */
+#define BEG_OF_FILE (1 << 3)
+
+struct directive; /* These are deliberately incomplete. */
+struct answer;
+struct macro_args;
+struct cpp_context;
+
+struct cpp_toklist
+{
+ cpp_token *tokens; /* actual tokens as an array */
+ unsigned int tokens_used; /* tokens used */
+ unsigned int tokens_cap; /* tokens allocated */
+
+ unsigned char *namebuf; /* names buffer */
+ unsigned int name_used; /* _bytes_ used */
+ unsigned int name_cap; /* _bytes_ allocated */
+
+ /* If the list represents a directive, this points to it. */
+ const struct directive *directive;
+
+ const char *file; /* in file name */
+ unsigned int line; /* starting line number */
+
+ unsigned short params_len; /* length of macro parameter names. */
+
+ short int paramc; /* no. of macro params (-1 = obj-like). */
+
+ /* Per-list flags, see above */
+ unsigned short flags;
+};
struct cpp_buffer
{
const unsigned char *cur; /* current position */
const unsigned char *rlimit; /* end of valid data */
const unsigned char *buf; /* entire buffer */
- const unsigned char *alimit; /* end of allocated buffer */
const unsigned char *line_base; /* start of current line */
struct cpp_buffer *prev;
/* Filename specified with #line command. */
const char *nominal_fname;
- /* Last filename specified with #line command. */
- const char *last_nominal_fname;
+
/* Actual directory of this file, used only for "" includes */
struct file_name_list *actual_dir;
- /* Pointer into the include hash table. Used for include_next and
+ /* Pointer into the include table. Used for include_next and
to record control macros. */
- struct ihash *ihash;
-
- long lineno; /* Line number at CPP_LINE_BASE. */
- long colno; /* Column number at CPP_LINE_BASE. */
- long mark; /* Saved position for lengthy backtrack. */
- parse_cleanup_t cleanup;
- void *data;
+ struct include_file *inc;
/* Value of if_stack at start of this file.
Used to prohibit unmatched #endif (etc) in an include file. */
struct if_stack *if_stack;
- /* True if this is a header file included using <FILENAME>. */
- char system_header_p;
- char seen_eof;
-
- /* True if buffer contains escape sequences.
- Currently there are two kinds:
- "\r-" means following identifier should not be macro-expanded.
- "\r " means a token-separator. This turns into " " in final output
- if not stringizing and needed to separate tokens; otherwise nothing.
- Any other two-character sequence beginning with \r is an error.
-
- If this is NOT set, then \r is a one-character escape meaning backslash
- newline. This is guaranteed not to occur in the middle of a token.
- The two interpretations of \r do not conflict, because the two-character
- escapes are used only in macro buffers, and backslash-newline is removed
- from macro expansion text in collect_expansion and/or macarg. */
- char has_escapes;
-
- /* Used by the C++ frontend to implement redirected input (such as for
- default argument and/or template parsing). */
- char manual_pop;
+ /* Line number at line_base (above). */
+ unsigned int lineno;
/* True if we have already warned about C++ comments in this file.
The warning happens only for C89 extended mode with -pedantic on,
- and only once per file (otherwise it would be far too noisy). */
+ or for -Wtraditional, and only once per file (otherwise it would
+ be far too noisy). */
char warned_cplusplus_comments;
+
+ /* True if this buffer's data is mmapped. */
+ char mapped;
};
struct file_name_map_list;
+struct htab;
/* Maximum nesting of cpp_buffers. We use a static limit, partly for
efficiency, and partly to limit runaway recursion. */
#define CPP_STACK_MAX 200
-/* A cpp_reader encapsulates the "state" of a pre-processor run.
- Applying cpp_get_token repeatedly yields a stream of pre-processor
- tokens. Usually, there is only one cpp_reader object active. */
+/* Values for opts.dump_macros.
+ dump_only means inhibit output of the preprocessed text
+ and instead output the definitions of all user-defined
+ macros in a form suitable for use as input to cpp.
+ dump_names means pass #define and the macro name through to output.
+ dump_definitions means pass the whole definition (plus #define) through
+*/
+enum { dump_none = 0, dump_only, dump_names, dump_definitions };
-struct cpp_reader
+/* This structure is nested inside struct cpp_reader, and
+ carries all the options visible to the command line. */
+struct cpp_options
{
- cpp_buffer *buffer;
- cpp_options *opts;
-
- /* A buffer used for both for cpp_get_token's output, and also internally. */
- unsigned char *token_buffer;
- /* Allocated size of token_buffer. CPP_RESERVE allocates space. */
- unsigned int token_buffer_size;
- /* End of the written part of token_buffer. */
- unsigned char *limit;
-
- /* Error counter for exit code */
- int errors;
-
- /* Line where a newline was first seen in a string constant. */
- int multiline_string_line;
+ /* Name of input and output files. */
+ const char *in_fname;
+ const char *out_fname;
- /* Current depth in #include directives that use <...>. */
- int system_include_depth;
+ /* Characters between tab stops. */
+ unsigned int tabstop;
- /* Current depth of buffer stack. */
- int buffer_stack_depth;
+ /* Pending options - -D, -U, -A, -I, -ixxx. */
+ struct cpp_pending *pending;
- /* Hash table of macros and assertions. See cpphash.c */
-#define HASHSIZE 1403
- struct hashnode **hashtab;
+ /* File name which deps are being written to. This is 0 if deps are
+ being written to stdout. */
+ const char *deps_file;
- /* Hash table of other included files. See cppfiles.c */
-#define ALL_INCLUDE_HASHSIZE 71
- struct ihash *all_include_files[ALL_INCLUDE_HASHSIZE];
+ /* Target-name to write with the dependency information. */
+ char *deps_target;
- /* Chain of `actual directory' file_name_list entries,
- for "" inclusion. */
- struct file_name_list *actual_dirs;
+ /* Search paths for include files. */
+ struct file_name_list *quote_include; /* First dir to search for "file" */
+ struct file_name_list *bracket_include;/* First dir to search for <file> */
- /* Current maximum length of directory names in the search path
- for include files. (Altered as we get more of them.) */
- unsigned int max_include_len;
+ /* Map between header names and file names, used only on DOS where
+ file names are limited in length. */
+ struct file_name_map_list *map_list;
- struct if_stack *if_stack;
+ /* Directory prefix that should replace `/usr/lib/gcc-lib/TARGET/VERSION'
+ in the standard include file directories. */
+ const char *include_prefix;
+ unsigned int include_prefix_len;
- /* Nonzero means we have printed (while error reporting) a list of
- containing files that matches the current status. */
- char input_stack_listing_current;
+ /* Non-0 means -v, so print the full set of include dirs. */
+ unsigned char verbose;
- /* If non-zero, macros are not expanded. */
- char no_macro_expand;
+ /* Nonzero means use extra default include directories for C++. */
+ unsigned char cplusplus;
- /* If non-zero, directives cause a hard error. Used when parsing
- macro arguments. */
- char no_directives;
+ /* Nonzero means handle cplusplus style comments */
+ unsigned char cplusplus_comments;
- /* Print column number in error messages. */
- char show_column;
+ /* Nonzero means handle #import, for objective C. */
+ unsigned char objc;
- /* We're printed a warning recommending against using #import. */
- char import_warning;
+ /* Nonzero means this is an assembly file, so ignore unrecognized
+ directives and the "# 33" form of #line, both of which are
+ probably comments. Also, permit unbalanced ' strings (again,
+ likely to be in comments). */
+ unsigned char lang_asm;
- /* If true, character between '<' and '>' are a single (string) token. */
- char parsing_include_directive;
+ /* Nonzero means don't copy comments into the output file. */
+ unsigned char discard_comments;
- /* If true, # introduces an assertion (see do_assert) */
- char parsing_if_directive;
+ /* Nonzero means process the ISO trigraph sequences. */
+ unsigned char trigraphs;
- /* If true, # and ## are the STRINGIZE and TOKPASTE operators */
- char parsing_define_directive;
+ /* Nonzero means process the ISO digraph sequences. */
+ unsigned char digraphs;
- /* True if escape sequences (as described for has_escapes in
- parse_buffer) should be emitted. */
- char output_escapes;
+ /* Nonzero means print the names of included files rather than the
+ preprocessed output. 1 means just the #include "...", 2 means
+ #include <...> as well. */
+ unsigned char print_deps;
- /* 0: Have seen non-white-space on this line.
- 1: Only seen white space so far on this line.
- 2: Only seen white space so far in this file. */
- char only_seen_white;
+ /* Nonzero if missing .h files in -M output are assumed to be
+ generated files and not errors. */
+ unsigned char print_deps_missing_files;
- long lineno;
+ /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
+ unsigned char print_deps_append;
- struct tm *timebuf;
+ /* Nonzero means print names of header files (-H). */
+ unsigned char print_include_names;
- /* Buffer of -M output. */
- struct deps *deps;
+ /* Nonzero means cpp_pedwarn causes a hard error. */
+ unsigned char pedantic_errors;
- /* A buffer and a table, used only by read_and_prescan (in cppfiles.c)
- which are allocated once per cpp_reader object to keep them off the
- stack and avoid setup costs. */
- unsigned char *input_buffer;
- unsigned char *input_speccase;
- size_t input_buffer_len;
-};
+ /* Nonzero means don't print warning messages. */
+ unsigned char inhibit_warnings;
-#define CPP_FATAL_LIMIT 1000
-/* True if we have seen a "fatal" error. */
-#define CPP_FATAL_ERRORS(READER) ((READER)->errors >= CPP_FATAL_LIMIT)
+ /* Nonzero means don't print error messages. Has no option to
+ select it, but can be set by a user of cpplib (e.g. fix-header). */
+ unsigned char inhibit_errors;
-/* Macros for manipulating the token_buffer. */
+ /* Nonzero means warn if slash-star appears in a comment. */
+ unsigned char warn_comments;
-/* Number of characters currently in PFILE's output buffer. */
-#define CPP_WRITTEN(PFILE) ((size_t)((PFILE)->limit - (PFILE)->token_buffer))
-#define CPP_PWRITTEN(PFILE) ((PFILE)->limit)
-#define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))
-#define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))
+ /* Nonzero means warn if there are any trigraphs. */
+ unsigned char warn_trigraphs;
-/* Make sure PFILE->token_buffer has space for at least N more characters. */
-#define CPP_RESERVE(PFILE, N) \
- (CPP_WRITTEN (PFILE) + (size_t)(N) > (PFILE)->token_buffer_size \
- && (cpp_grow_buffer (PFILE, N), 0))
+ /* Nonzero means warn if #import is used. */
+ unsigned char warn_import;
-#define CPP_OPTIONS(PFILE) ((PFILE)->opts)
-#define CPP_BUFFER(PFILE) ((PFILE)->buffer)
+ /* Nonzero means warn about various incompatibilities with
+ traditional C. */
+ unsigned char warn_traditional;
-/* Pointed to by cpp_reader.opts. */
-struct cpp_options
-{
- const char *in_fname;
+ /* Nonzero means warn if ## is applied to two tokens that cannot be
+ pasted together. */
+ unsigned char warn_paste;
- /* Name of output file, for error messages. */
- const char *out_fname;
+ /* Nonzero means turn warnings into errors. */
+ unsigned char warnings_are_errors;
- struct file_name_map_list *map_list;
+ /* Nonzero causes output not to be done, but directives such as
+ #define that have side effects are still obeyed. */
+ unsigned char no_output;
- /* Non-0 means -v, so print the full set of include dirs. */
- char verbose;
+ /* Nonzero means we should look for header.gcc files that remap file
+ names. */
+ unsigned char remap;
- /* Nonzero means use extra default include directories for C++. */
+ /* Nonzero means don't output line number information. */
+ unsigned char no_line_commands;
- char cplusplus;
+ /* Nonzero means -I- has been seen, so don't look for #include "foo"
+ the source-file directory. */
+ unsigned char ignore_srcdir;
- /* Nonzero means handle cplusplus style comments */
+ /* Zero means dollar signs are punctuation. */
+ unsigned char dollars_in_ident;
- char cplusplus_comments;
-
- /* Nonzero means handle #import, for objective C. */
+ /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
+ unsigned char warn_undef;
- char objc;
+ /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
+ unsigned char c89;
- /* Nonzero means this is an assembly file, so ignore unrecognized
- directives and the "# 33" form of #line, both of which are
- probably comments. Also, permit unbalanced ' strings (again,
- likely to be in comments). */
+ /* Nonzero for the 1999 C Standard, including corrigenda and amendments. */
+ unsigned char c99;
- char lang_asm;
+ /* Nonzero means give all the error messages the ANSI standard requires. */
+ unsigned char pedantic;
- /* Nonzero means this is Fortran, and we don't know where the
- comments are, so permit unbalanced ' strings. Unlike lang_asm,
- this does not ignore unrecognized directives. */
+ /* Nonzero means we're looking at already preprocessed code, so don't
+ bother trying to do macro expansion and whatnot. */
+ unsigned char preprocessed;
- char lang_fortran;
+ /* Nonzero disables all the standard directories for headers. */
+ unsigned char no_standard_includes;
- /* Nonzero means handle CHILL comment syntax
- and output CHILL string delimiter for __DATE___ etc. */
+ /* Nonzero disables the C++-specific standard directories for headers. */
+ unsigned char no_standard_cplusplus_includes;
- char chill;
+ /* Nonzero means dump macros in some fashion - see above. */
+ unsigned char dump_macros;
- /* Nonzero means don't copy comments into the output file. */
+ /* Nonzero means pass all #define and #undef directives which we
+ actually process through to the output stream. This feature is
+ used primarily to allow cc1 to record the #defines and #undefs
+ for the sake of debuggers which understand about preprocessor
+ macros, but it may also be useful with -E to figure out how
+ symbols are defined, and where they are defined. */
+ unsigned char debug_output;
- char discard_comments;
+ /* Nonzero means pass #include lines through to the output. */
+ unsigned char dump_includes;
- /* Nonzero means process the ANSI trigraph sequences. */
+ /* Print column number in error messages. */
+ unsigned char show_column;
+};
- char trigraphs;
+/* A cpp_reader encapsulates the "state" of a pre-processor run.
+ Applying cpp_get_token repeatedly yields a stream of pre-processor
+ tokens. Usually, there is only one cpp_reader object active. */
- /* Nonzero means print the names of included files rather than
- the preprocessed output. 1 means just the #include "...",
- 2 means #include <...> as well. */
+struct cpp_reader
+{
+ /* HACK FIXME. Maybe make into cpp_printer printer later. */
+ cpp_printer *printer;
- char print_deps;
+ /* Top of buffer stack. */
+ cpp_buffer *buffer;
- /* Nonzero if missing .h files in -M output are assumed to be generated
- files and not errors. */
+ /* A buffer used for both for cpp_get_token's output, and also internally. */
+ unsigned char *token_buffer;
+ /* Allocated size of token_buffer. CPP_RESERVE allocates space. */
+ unsigned int token_buffer_size;
+ /* End of the written part of token_buffer. */
+ unsigned char *limit;
- char print_deps_missing_files;
+ /* Error counter for exit code */
+ unsigned int errors;
- /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
- char print_deps_append;
+ /* Line and column where a newline was first seen in a string constant. */
+ unsigned int multiline_string_line;
+ unsigned int multiline_string_column;
- /* Nonzero means print names of header files (-H). */
+ /* Current depth in #include directives that use <...>. */
+ unsigned int system_include_depth;
- char print_include_names;
+ /* Current depth of buffer stack. */
+ unsigned int buffer_stack_depth;
- /* Nonzero means try to make failure to fit ANSI C an error. */
+ /* Current depth in #include directives. */
+ unsigned int include_depth;
- char pedantic_errors;
+ /* Hash table of macros and assertions. See cpphash.c */
+ struct htab *hashtab;
- /* Nonzero means don't print warning messages. */
+ /* Tree of other included files. See cppfiles.c */
+ struct splay_tree_s *all_include_files;
- char inhibit_warnings;
+ /* Chain of `actual directory' file_name_list entries,
+ for "" inclusion. */
+ struct file_name_list *actual_dirs;
- /* Nonzero means don't print error messages. Has no option to select it,
- but can be set by a user of cpplib (e.g. fix-header). */
+ /* Current maximum length of directory names in the search path
+ for include files. (Altered as we get more of them.) */
+ unsigned int max_include_len;
- char inhibit_errors;
+ /* Potential controlling macro for the current buffer. This is only
+ live between the #endif and the end of file, and there can only
+ be one at a time, so it is per-reader not per-buffer. */
+ const cpp_hashnode *potential_control_macro;
- /* Nonzero means warn if slash-star appears in a comment. */
+ /* Token column position adjustment owing to tabs in whitespace. */
+ unsigned int col_adjust;
- char warn_comments;
+ /* Token list used to store logical lines with new lexer. */
+ cpp_toklist token_list;
- /* Nonzero means warn if there are any trigraphs. */
+ /* Temporary token store. */
+ cpp_token **temp_tokens;
+ unsigned int temp_cap;
+ unsigned int temp_alloced;
+ unsigned int temp_used;
- char warn_trigraphs;
+ /* Date and time tokens. Calculated together if either is requested. */
+ cpp_token *date;
+ cpp_token *time;
- /* Nonzero means warn if #import is used. */
+ /* The # of a the current directive. It may not be first in line if
+ we append, and finding it is tedious. */
+ const cpp_token *first_directive_token;
- char warn_import;
+ /* Context stack. Used for macro expansion and for determining
+ which macros are disabled. */
+ unsigned int context_cap;
+ unsigned int cur_context;
+ unsigned int no_expand_level;
+ unsigned int paste_level;
+ struct cpp_context *contexts;
- /* Nonzero means warn if a macro argument is (or would be)
- stringified with -traditional. */
+ /* Current arguments when scanning arguments. Used for pointer
+ fix-up. */
+ struct macro_args *args;
- char warn_stringify;
+ /* Buffer of -M output. */
+ struct deps *deps;
- /* Nonzero means turn warnings into errors. */
+ /* Obstack holding all macro hash nodes. This never shrinks.
+ See cpphash.c */
+ struct obstack *hash_ob;
- char warnings_are_errors;
+ /* Obstack holding buffer and conditional structures. This is a
+ real stack. See cpplib.c */
+ struct obstack *buffer_ob;
- /* Nonzero causes output not to be done,
- but directives such as #define that have side effects
- are still obeyed. */
+ /* User visible options. */
+ struct cpp_options opts;
- char no_output;
+ /* Nonzero means we have printed (while error reporting) a list of
+ containing files that matches the current status. */
+ unsigned char input_stack_listing_current;
- /* Nonzero means we should look for header.gcc files that remap file
- names. */
- char remap;
+ /* We're printed a warning recommending against using #import. */
+ unsigned char import_warning;
- /* Nonzero means don't output line number information. */
- char no_line_commands;
+ /* True after cpp_start_read completes. Used to inhibit some
+ warnings while parsing the command line. */
+ unsigned char done_initializing;
- /* Nonzero means -I- has been seen,
- so don't look for #include "foo" the source-file directory. */
- char ignore_srcdir;
+ /* True if we are skipping a failed conditional group. */
+ unsigned char skipping;
- /* Zero means dollar signs are punctuation.
- This used to be needed for conformance to the C Standard,
- before the C Standard was corrected. */
- char dollars_in_ident;
+ /* True if we need to save parameter spellings - only if -pedantic,
+ or we might need to write out definitions. */
+ unsigned char save_parameter_spellings;
- /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
- char traditional;
+ /* If we're in lex_line. */
+ unsigned char in_lex_line;
- /* Nonzero means warn if undefined identifiers are evaluated in an #if. */
- char warn_undef;
+ /* True if output_line_command needs to output a newline. */
+ unsigned char need_newline;
- /* Nonzero for the 1989 C Standard, including corrigenda and amendments. */
- char c89;
+ /* Special nodes - identifiers with predefined significance to the
+ preprocessor. */
+ struct spec_nodes *spec_nodes;
+};
- /* Nonzero for the 1999 C Standard, including corrigenda and amendments. */
- char c99;
+/* struct cpp_printer encapsulates state used to convert the stream of
+ tokens coming from cpp_get_token back into a text file. Not
+ everyone wants to do that, hence we separate the function. */
- /* Nonzero means give all the error messages the ANSI standard requires. */
- char pedantic;
+struct cpp_printer
+{
+ FILE *outf; /* stream to write to */
+ const char *last_fname; /* previous file name */
+ unsigned int last_id; /* did we just push? */
+ unsigned int lineno; /* line currently being written */
+ unsigned int written; /* low water mark in token buffer */
+};
- /* Nonzero means we're looking at already preprocessed code, so don't
- bother trying to do macro expansion and whatnot. */
- char preprocessed;
+#define CPP_FATAL_LIMIT 1000
+/* True if we have seen a "fatal" error. */
+#define CPP_FATAL_ERRORS(READER) ((READER)->errors >= CPP_FATAL_LIMIT)
- char done_initializing;
+/* Macros for manipulating the token_buffer. */
- /* Search paths for include files. */
- struct file_name_list *quote_include; /* First dir to search for "file" */
- struct file_name_list *bracket_include;/* First dir to search for <file> */
+/* Number of characters currently in PFILE's output buffer. */
+#define CPP_WRITTEN(PFILE) ((size_t)((PFILE)->limit - (PFILE)->token_buffer))
+#define CPP_PWRITTEN(PFILE) ((PFILE)->limit)
+#define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))
+#define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))
- /* Directory prefix that should replace `/usr/lib/gcc-lib/TARGET/VERSION'
- in the standard include file directories. */
- const char *include_prefix;
- int include_prefix_len;
+#define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION)
+#define CPP_BUFFER(PFILE) ((PFILE)->buffer)
+#define CPP_BUF_LINE(BUF) ((BUF)->lineno)
+#define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base + pfile->col_adjust)
+#define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur)
- char no_standard_includes;
- char no_standard_cplusplus_includes;
+/* Name under which this program was invoked. */
+extern const char *progname;
-/* dump_only means inhibit output of the preprocessed text
- and instead output the definitions of all user-defined
- macros in a form suitable for use as input to cccp.
- dump_names means pass #define and the macro name through to output.
- dump_definitions means pass the whole definition (plus #define) through
-*/
+/* The structure of a node in the hash table. The hash table
+ has entries for all tokens defined by #define commands (type T_MACRO),
+ plus some special tokens like __LINE__ (these each have their own
+ type, and the appropriate code is run when that type of node is seen.
+ It does not contain control words like "#define", which are recognized
+ by a separate piece of code. */
- enum {dump_none = 0, dump_only, dump_names, dump_definitions}
- dump_macros;
+/* different flavors of hash nodes */
+enum node_type
+{
+ T_VOID = 0, /* no definition yet */
+ T_SPECLINE, /* `__LINE__' */
+ T_DATE, /* `__DATE__' */
+ T_FILE, /* `__FILE__' */
+ T_BASE_FILE, /* `__BASE_FILE__' */
+ T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
+ T_TIME, /* `__TIME__' */
+ T_STDC, /* `__STDC__' */
+ T_OPERATOR, /* operator with a name; val.code is token type */
+ T_POISON, /* poisoned identifier */
+ T_MACRO, /* a macro, either object-like or function-like */
+ T_ASSERTION /* predicate for #assert */
+};
-/* Nonzero means pass all #define and #undef directives which we actually
- process through to the output stream. This feature is used primarily
- to allow cc1 to record the #defines and #undefs for the sake of
- debuggers which understand about preprocessor macros, but it may
- also be useful with -E to figure out how symbols are defined, and
- where they are defined. */
- int debug_output;
+/* There is a slot in the hashnode for use by front ends when integrated
+ with cpplib. It holds a tree (see tree.h) but we mustn't drag that
+ header into every user of cpplib.h. cpplib does not do anything with
+ this slot except clear it when a new node is created. */
+union tree_node;
- /* Nonzero means pass #include lines through to the output,
- even if they are ifdefed out. */
- int dump_includes;
+struct cpp_hashnode
+{
+ unsigned int hash; /* cached hash value */
+ unsigned short length; /* length of name */
+ ENUM_BITFIELD(node_type) type : 8; /* node type */
- /* Pending options - -D, -U, -A, -I, -ixxx. */
- struct cpp_pending *pending;
+ union
+ {
+ const cpp_toklist *expansion; /* a macro's replacement list. */
+ struct answer *answers; /* answers to an assertion. */
+ enum cpp_ttype code; /* code for a named operator. */
+ } value;
- /* File name which deps are being written to.
- This is 0 if deps are being written to stdout. */
- const char *deps_file;
+ union tree_node *fe_value; /* front end value */
- /* Target-name to write with the dependency information. */
- char *deps_target;
+ const unsigned char name[1]; /* name[length] */
};
-/* Name under which this program was invoked. */
-extern const char *progname;
-
extern int cpp_handle_options PARAMS ((cpp_reader *, int, char **));
-extern enum cpp_token cpp_get_token PARAMS ((cpp_reader *));
-extern enum cpp_token cpp_get_non_space_token PARAMS ((cpp_reader *));
-extern enum cpp_token get_directive_token PARAMS ((cpp_reader *));
-
+extern int cpp_handle_option PARAMS ((cpp_reader *, int, char **));
extern void cpp_reader_init PARAMS ((cpp_reader *));
-extern void cpp_options_init PARAMS ((cpp_options *));
-extern int cpp_start_read PARAMS ((cpp_reader *, const char *));
-extern void cpp_finish PARAMS ((cpp_reader *));
-extern void cpp_cleanup PARAMS ((cpp_reader *PFILE));
+extern cpp_printer *cpp_printer_init PARAMS ((cpp_reader *, cpp_printer *));
+extern int cpp_start_read PARAMS ((cpp_reader *, cpp_printer *, const char *));
+extern void cpp_output_tokens PARAMS ((cpp_reader *, cpp_printer *,
+ unsigned int));
+extern void cpp_finish PARAMS ((cpp_reader *, cpp_printer *));
+extern void cpp_cleanup PARAMS ((cpp_reader *));
+
+extern const cpp_token *cpp_get_token PARAMS ((cpp_reader *));
-extern void cpp_buf_line_and_col PARAMS((cpp_buffer *, long *, long *));
-extern cpp_buffer *cpp_file_buffer PARAMS((cpp_reader *));
extern void cpp_define PARAMS ((cpp_reader *, const char *));
extern void cpp_assert PARAMS ((cpp_reader *, const char *));
extern void cpp_undef PARAMS ((cpp_reader *, const char *));
extern void cpp_unassert PARAMS ((cpp_reader *, const char *));
+extern void cpp_free_token_list PARAMS ((cpp_toklist *));
+extern cpp_buffer *cpp_push_buffer PARAMS ((cpp_reader *,
+ const unsigned char *, long));
+extern cpp_buffer *cpp_pop_buffer PARAMS ((cpp_reader *));
+extern int cpp_defined PARAMS ((cpp_reader *, const unsigned char *, int));
+
/* N.B. The error-message-printer prototypes have not been nicely
formatted because exgettext needs to see 'msgid' on the same line
as the name of the function in order to work properly. Only the
extern void cpp_error_from_errno PARAMS ((cpp_reader *, const char *));
extern void cpp_notice_from_errno PARAMS ((cpp_reader *, const char *));
-extern void cpp_grow_buffer PARAMS ((cpp_reader *, long));
-extern cpp_buffer *cpp_push_buffer PARAMS ((cpp_reader *,
- const unsigned char *, long));
-extern cpp_buffer *cpp_pop_buffer PARAMS ((cpp_reader *));
-extern int cpp_defined PARAMS ((cpp_reader *, const unsigned char *, int));
-
-extern void quote_string PARAMS ((cpp_reader *, const char *));
-extern void cpp_expand_to_buffer PARAMS ((cpp_reader *,
- const unsigned char *, int));
-extern void cpp_scan_buffer PARAMS ((cpp_reader *));
-
-/* Last arg to output_line_command. */
-enum file_change_code {same_file, rename_file, enter_file, leave_file};
-extern void output_line_command PARAMS ((cpp_reader *,
- enum file_change_code));
+/* In cpplex.c */
+extern cpp_buffer *cpp_push_buffer PARAMS ((cpp_reader *,
+ const unsigned char *, long));
+extern cpp_buffer *cpp_pop_buffer PARAMS ((cpp_reader *));
+extern void cpp_scan_buffer PARAMS ((cpp_reader *, cpp_printer *));
+extern void cpp_scan_buffer_nooutput PARAMS ((cpp_reader *));
+extern int cpp_scan_line PARAMS ((cpp_reader *));
+extern int cpp_ideq PARAMS ((const cpp_token *,
+ const char *));
+
+/* In cpphash.c */
+extern cpp_hashnode *cpp_lookup PARAMS ((cpp_reader *,
+ const unsigned char *, size_t));
+extern void cpp_forall_identifiers PARAMS ((cpp_reader *,
+ int (*) PARAMS ((cpp_reader *,
+ cpp_hashnode *))));
/* In cppfiles.c */
-extern int cpp_included PARAMS ((cpp_reader *, const char *));
-extern int cpp_read_file PARAMS ((cpp_reader *, const char *));
-
+extern int cpp_included PARAMS ((cpp_reader *, const char *));
+extern int cpp_read_file PARAMS ((cpp_reader *, const char *));
+extern void cpp_make_system_header PARAMS ((cpp_reader *, cpp_buffer *, int));
#ifdef __cplusplus
}