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
+
+/* Payload of a NUMBER, FLOAT, STRING, or COMMENT token. */
+struct cpp_string
+{
+ unsigned int len;
+ const unsigned char *text;
+};
-enum cpp_token
+/* 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
{
- CPP_EOF = -1,
- CPP_OTHER = 0,
- CPP_COMMENT = 1,
- CPP_HSPACE,
- CPP_VSPACE, /* newlines and #line directives */
- CPP_NAME,
- CPP_MACRO,
- 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 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;
};
-typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader *));
+/* 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;
/* 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 cccp.
+ 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
*/
const char *in_fname;
const char *out_fname;
+ /* Characters between tab stops. */
+ unsigned int tabstop;
+
/* Pending options - -D, -U, -A, -I, -ixxx. */
struct cpp_pending *pending;
likely to be in comments). */
unsigned char lang_asm;
- /* 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. */
- unsigned char lang_fortran;
-
- /* Nonzero means handle CHILL comment syntax and output CHILL string
- delimiters for __DATE__ etc. */
- unsigned char chill;
-
/* Nonzero means don't copy comments into the output file. */
unsigned char discard_comments;
- /* Nonzero means process the ANSI trigraph sequences. */
+ /* Nonzero means process the ISO trigraph sequences. */
unsigned char trigraphs;
+ /* Nonzero means process the ISO digraph sequences. */
+ unsigned char digraphs;
+
/* Nonzero means print the names of included files rather than the
preprocessed output. 1 means just the #include "...", 2 means
#include <...> as well. */
/* Nonzero means warn if #import is used. */
unsigned char warn_import;
- /* Nonzero means warn if a macro argument is (or would be)
- stringified with -traditional, and warn about directives
- with the # indented from the beginning of the line. */
+ /* Nonzero means warn about various incompatibilities with
+ traditional C. */
unsigned char warn_traditional;
+ /* Nonzero means warn if ## is applied to two tokens that cannot be
+ pasted together. */
+ unsigned char warn_paste;
+
/* Nonzero means turn warnings into errors. */
unsigned char warnings_are_errors;
/* Zero means dollar signs are punctuation. */
unsigned char dollars_in_ident;
- /* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
- unsigned char traditional;
-
/* Nonzero means warn if undefined identifiers are evaluated in an #if. */
unsigned char warn_undef;
unsigned char show_column;
};
-
/* 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. */
struct cpp_reader
{
+ /* HACK FIXME. Maybe make into cpp_printer printer later. */
+ cpp_printer *printer;
+
+ /* Top of buffer stack. */
cpp_buffer *buffer;
/* A buffer used for both for cpp_get_token's output, and also internally. */
unsigned char *limit;
/* Error counter for exit code */
- int errors;
+ unsigned int errors;
- /* Line where a newline was first seen in a string constant. */
- int multiline_string_line;
+ /* Line and column where a newline was first seen in a string constant. */
+ unsigned int multiline_string_line;
+ unsigned int multiline_string_column;
/* Current depth in #include directives that use <...>. */
- int system_include_depth;
+ unsigned int system_include_depth;
/* Current depth of buffer stack. */
- int buffer_stack_depth;
+ unsigned int buffer_stack_depth;
+
+ /* Current depth in #include directives. */
+ unsigned int include_depth;
/* Hash table of macros and assertions. See cpphash.c */
struct htab *hashtab;
- /* Hash table of other included files. See cppfiles.c */
- struct htab *all_include_files;
+ /* Tree of other included files. See cppfiles.c */
+ struct splay_tree_s *all_include_files;
/* Chain of `actual directory' file_name_list entries,
for "" inclusion. */
for include files. (Altered as we get more of them.) */
unsigned int max_include_len;
- struct if_stack *if_stack;
+ /* 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;
+
+ /* Token column position adjustment owing to tabs in whitespace. */
+ unsigned int col_adjust;
+
+ /* Token list used to store logical lines with new lexer. */
+ cpp_toklist token_list;
+
+ /* Temporary token store. */
+ cpp_token **temp_tokens;
+ unsigned int temp_cap;
+ unsigned int temp_alloced;
+ unsigned int temp_used;
+
+ /* Date and time tokens. Calculated together if either is requested. */
+ cpp_token *date;
+ cpp_token *time;
+
+ /* 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;
- long lineno;
+ /* 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;
- struct tm *timebuf;
+ /* Current arguments when scanning arguments. Used for pointer
+ fix-up. */
+ struct macro_args *args;
/* Buffer of -M output. */
struct deps *deps;
- /* A buffer used only by read_and_prescan (in cppfiles.c), which is
- allocated once per cpp_reader object to keep it off the stack. */
- unsigned char *input_buffer;
- size_t input_buffer_len;
+ /* Obstack holding all macro hash nodes. This never shrinks.
+ See cpphash.c */
+ struct obstack *hash_ob;
+
+ /* Obstack holding buffer and conditional structures. This is a
+ real stack. See cpplib.c */
+ struct obstack *buffer_ob;
/* User visible options. */
struct cpp_options opts;
containing files that matches the current status. */
unsigned char input_stack_listing_current;
- /* If non-zero, macros are not expanded. */
- unsigned char no_macro_expand;
-
- /* If non-zero, directives cause a hard error. Used when parsing
- macro arguments. */
- unsigned char no_directives;
-
/* We're printed a warning recommending against using #import. */
unsigned char import_warning;
- /* If true, characters between '<' and '>' are a single (string) token. */
- unsigned char parsing_include_directive;
+ /* True after cpp_start_read completes. Used to inhibit some
+ warnings while parsing the command line. */
+ unsigned char done_initializing;
- /* If true, # introduces an assertion (see do_assert) */
- unsigned char parsing_if_directive;
+ /* True if we are skipping a failed conditional group. */
+ unsigned char skipping;
- /* If true, # and ## are the STRINGIZE and TOKPASTE operators */
- unsigned char parsing_define_directive;
+ /* True if we need to save parameter spellings - only if -pedantic,
+ or we might need to write out definitions. */
+ unsigned char save_parameter_spellings;
- /* True if escape sequences (as described for has_escapes in
- parse_buffer) should be emitted. */
- unsigned char output_escapes;
+ /* If we're in lex_line. */
+ unsigned char in_lex_line;
- /* 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. */
- unsigned char only_seen_white;
+ /* True if output_line_command needs to output a newline. */
+ unsigned char need_newline;
- /* True after cpp_start_read completes. Used to inhibit some
- warnings while parsing the command line. */
- unsigned char done_initializing;
+ /* Special nodes - identifiers with predefined significance to the
+ preprocessor. */
+ struct spec_nodes *spec_nodes;
+};
+
+/* 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. */
+
+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 */
};
#define CPP_FATAL_LIMIT 1000
#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)
/* 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 *));
+/* 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. */
+
+/* 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 */
+};
+
+/* 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;
+struct cpp_hashnode
+{
+ unsigned int hash; /* cached hash value */
+ unsigned short length; /* length of name */
+ ENUM_BITFIELD(node_type) type : 8; /* node type */
+
+ 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;
+
+ union tree_node *fe_value; /* front end value */
+
+ const unsigned char name[1]; /* name[length] */
+};
+
+extern int cpp_handle_options PARAMS ((cpp_reader *, int, char **));
+extern int cpp_handle_option PARAMS ((cpp_reader *, int, char **));
extern void cpp_reader_init PARAMS ((cpp_reader *));
-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 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 cpp_expand_to_buffer PARAMS ((cpp_reader *,
- const unsigned char *, int));
-extern void cpp_scan_buffer PARAMS ((cpp_reader *));
+/* 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
}