Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
2004, 2005, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
Written by Per Bothner, 1994-95.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>.
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
what you give them. Help stamp out software-hoarding! */
#ifndef LIBCPP_CPPLIB_H
#define LIBCPP_CPPLIB_H
#include <sys/types.h>
#include "symtab.h"
#include "line-map.h"
typedef struct cpp_reader cpp_reader;
typedef struct cpp_buffer cpp_buffer;
typedef struct cpp_options cpp_options;
typedef struct cpp_token cpp_token;
typedef struct cpp_string cpp_string;
typedef struct cpp_hashnode cpp_hashnode;
typedef struct cpp_macro cpp_macro;
typedef struct cpp_callbacks cpp_callbacks;
typedef struct cpp_dir cpp_dir;
struct answer;
struct _cpp_file;
expressions (+= and -= are used to indicate unary + and - resp.).
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 ">>".
See the cpp_operator table optab in expr.c if you change the order or
add or remove anything in the first group. */
#define TTYPE_TABLE \
OP(EQ, "=") \
OP(NOT, "!") \
OP(GREATER, ">") /* compare */ \
OP(LESS, "<") \
OP(PLUS, "+") /* math */ \
OP(MINUS, "-") \
OP(MULT, "*") \
OP(DIV, "/") \
OP(MOD, "%") \
OP(AND, "&") /* bit ops */ \
OP(OR, "|") \
OP(XOR, "^") \
OP(RSHIFT, ">>") \
OP(LSHIFT, "<<") \
\
OP(COMPL, "~") \
OP(AND_AND, "&&") /* logical */ \
OP(OR_OR, "||") \
OP(QUERY, "?") \
OP(COLON, ":") \
OP(COMMA, ",") /* grouping */ \
OP(OPEN_PAREN, "(") \
OP(CLOSE_PAREN, ")") \
TK(EOF, NONE) \
OP(EQ_EQ, "==") /* compare */ \
OP(NOT_EQ, "!=") \
OP(GREATER_EQ, ">=") \
OP(LESS_EQ, "<=") \
\
/* These two are unary + / - in preprocessor expressions. */ \
OP(PLUS_EQ, "+=") /* math */ \
OP(MINUS_EQ, "-=") \
\
OP(MULT_EQ, "*=") \
OP(DIV_EQ, "/=") \
OP(MOD_EQ, "%=") \
OP(AND_EQ, "&=") /* bit ops */ \
OP(OR_EQ, "|=") \
OP(XOR_EQ, "^=") \
OP(RSHIFT_EQ, ">>=") \
OP(LSHIFT_EQ, "<<=") \
/* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \
OP(HASH, "#") /* digraphs */ \
OP(PASTE, "##") \
OP(OPEN_SQUARE, "[") \
OP(CLOSE_SQUARE, "]") \
OP(OPEN_BRACE, "{") \
OP(CLOSE_BRACE, "}") \
/* The remainder of the punctuation. Order is not significant. */ \
OP(SEMICOLON, ";") /* structure */ \
OP(ELLIPSIS, "...") \
OP(PLUS_PLUS, "++") /* increment */ \
OP(MINUS_MINUS, "--") \
OP(DEREF, "->") /* accessors */ \
OP(DOT, ".") \
OP(SCOPE, "::") \
OP(DEREF_STAR, "->*") \
OP(DOT_STAR, ".*") \
OP(ATSIGN, "@") /* used in Objective-C */ \
\
TK(NAME, IDENT) /* word */ \
TK(AT_NAME, IDENT) /* @word - Objective-C */ \
TK(NUMBER, LITERAL) /* 34_be+ta */ \
\
TK(CHAR, LITERAL) /* 'char' */ \
TK(WCHAR, LITERAL) /* L'char' */ \
TK(CHAR16, LITERAL) /* u'char' */ \
TK(CHAR32, LITERAL) /* U'char' */ \
TK(OTHER, LITERAL) /* stray punctuation */ \
\
TK(STRING, LITERAL) /* "string" */ \
TK(WSTRING, LITERAL) /* L"string" */ \
TK(STRING16, LITERAL) /* u"string" */ \
TK(STRING32, LITERAL) /* U"string" */ \
TK(UTF8STRING, LITERAL) /* u8"string" */ \
TK(OBJC_STRING, LITERAL) /* @"string" - Objective-C */ \
TK(HEADER_NAME, LITERAL) /* <stdio.h> in #include */ \
\
TK(COMMENT, LITERAL) /* Only if output comments. */ \
/* SPELL_LITERAL happens to DTRT. */ \
TK(MACRO_ARG, NONE) /* Macro argument. */ \
TK(PRAGMA, NONE) /* Only for deferred pragmas. */ \
TK(PRAGMA_EOL, NONE) /* End-of-line for deferred pragmas. */ \
TK(PADDING, NONE) /* Whitespace for -E. */
#define OP(e, s) CPP_ ## e,
#define TK(e, s) CPP_ ## e,
enum cpp_ttype
{
TTYPE_TABLE
N_TTYPES,
CPP_LAST_EQ = CPP_LSHIFT,
CPP_FIRST_DIGRAPH = CPP_HASH,
CPP_LAST_PUNCTUATOR= CPP_ATSIGN,
CPP_LAST_CPP_OP = CPP_LESS_EQ
};
#undef OP
#undef TK
enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_GNUC1X,
CLK_STDC89, CLK_STDC94, CLK_STDC99, CLK_STDC1X,
CLK_GNUCXX, CLK_CXX98, CLK_GNUCXX0X, CLK_CXX0X, CLK_ASM};
struct GTY(()) cpp_string {
unsigned int len;
const unsigned char *text;
};
#define PREV_WHITE (1 << 0) /* If whitespace before this token. */
#define DIGRAPH (1 << 1) /* If it was a digraph. */
#define STRINGIFY_ARG (1 << 2) /* If macro argument to be stringified. */
#define PASTE_LEFT (1 << 3) /* If on LHS of a ## operator. */
#define NAMED_OP (1 << 4) /* C++ named operators. */
#define NO_EXPAND (1 << 5) /* Do not macro-expand this token. */
#define BOL (1 << 6) /* Token at beginning of line. */
#define PURE_ZERO (1 << 7) /* Single 0 digit, used by the C++ frontend,
set in c-lex.c. */
#define SP_DIGRAPH (1 << 8) /* # or ## token was a digraph. */
#define SP_PREV_WHITE (1 << 9) /* If whitespace before a ##
operator, or before this token
after a # operator. */
enum cpp_token_fld_kind {
CPP_TOKEN_FLD_NODE,
CPP_TOKEN_FLD_SOURCE,
CPP_TOKEN_FLD_STR,
CPP_TOKEN_FLD_ARG_NO,
CPP_TOKEN_FLD_TOKEN_NO,
CPP_TOKEN_FLD_PRAGMA,
CPP_TOKEN_FLD_NONE
};
struct GTY(()) cpp_macro_arg {
unsigned int arg_no;
};
struct GTY(()) cpp_identifier {
cpp_hashnode *
GTY ((nested_ptr (union tree_node,
"%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
"%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
node;
};
occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts. */
struct GTY(()) cpp_token {
source_location src_loc;
ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT;
unsigned short flags;
union cpp_token_u
{
struct cpp_identifier GTY ((tag ("CPP_TOKEN_FLD_NODE"))) node;
cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source;
struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str;
struct cpp_macro_arg GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) macro_arg;
consecutive paste tokens in a macro expansion). */
unsigned int GTY ((tag ("CPP_TOKEN_FLD_TOKEN_NO"))) token_no;
unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma;
} GTY ((desc ("cpp_token_val_index (&%1)"))) val;
};
extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok);
cpplib's character constant interpreter requires an unsigned type.
Also, a typedef for the signed equivalent.
The width of this type is capped at 32 bits; there do exist targets
where wchar_t is 64 bits, but only in a non-default mode, and there
would be no meaningful interpretation for a wchar_t value greater
than 2^32 anyway -- the widest wide-character encoding around is
ISO 10646, which stops at 2^31. */
#if CHAR_BIT * SIZEOF_INT >= 32
# define CPPCHAR_SIGNED_T int
#elif CHAR_BIT * SIZEOF_LONG >= 32
# define CPPCHAR_SIGNED_T long
#else
# error "Cannot find a least-32-bit signed integer type"
#endif
typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
typedef CPPCHAR_SIGNED_T cppchar_signed_t;
enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
enum cpp_normalize_level {
normalized_KC = 0,
normalized_C,
the identifier invalid. */
normalized_identifier_C,
normalized_none
};
carries all the options visible to the command line. */
struct cpp_options
{
unsigned int tabstop;
enum c_lang lang;
unsigned char cplusplus;
unsigned char cplusplus_comments;
the OBJC[PLUS]_INCLUDE_PATH environment variable, and allow
"#import". */
unsigned char objc;
unsigned char discard_comments;
macro expansion. */
unsigned char discard_comments_in_macro_exp;
unsigned char trigraphs;
unsigned char digraphs;
unsigned char extended_numbers;
unsigned char uliterals;
unsigned char print_include_names;
unsigned char cpp_warn_deprecated;
unsigned char warn_comments;
exist. */
unsigned char warn_missing_include_dirs;
unsigned char warn_trigraphs;
unsigned char warn_multichar;
traditional C. */
unsigned char cpp_warn_traditional;
unsigned char cpp_warn_long_long;
unsigned char warn_endif_labels;
promotions. */
unsigned char warn_num_sign_change;
Presumably the usage is protected by the appropriate #ifdef. */
unsigned char warn_variadic_macros;
explicitly undefined. */
unsigned char warn_builtin_macro_redefined;
names. */
unsigned char remap;
unsigned char dollars_in_ident;
unsigned char extended_identifiers;
for this translation unit. */
unsigned char warn_dollars;
unsigned char warn_undef;
unsigned char warn_unused_macros;
unsigned char c99;
unsigned char std;
unsigned char cpp_pedantic;
bother trying to do macro expansion and whatnot. */
unsigned char preprocessed;
unsigned char operator_names;
unsigned char warn_cxx_operator_names;
unsigned char traditional;
const char *narrow_charset;
const char *wide_charset;
const char *input_charset;
is generated. */
enum cpp_normalize_level warn_normalize;
bool warn_invalid_pch;
bool restore_pch_deps;
struct
{
enum cpp_deps_style style;
bool missing_files;
one. */
bool phony_targets;
bool ignore_main_file;
in addition to the dependency info. */
bool need_preprocessor_output;
} deps;
ints and target wide characters, respectively. */
size_t precision, char_precision, int_precision, wchar_precision;
bool unsigned_char, unsigned_wchar;
address in memory. */
bool bytes_big_endian;
unsigned char stdc_0_in_system_headers;
bool directives_only;
};
source file. It is used as a method of last resort to find headers
that are not otherwise found during the normal include processing.
The return value is the malloced name of a header to try and open,
if any, or NULL otherwise. This callback is called only if the
header is otherwise unfound. */
typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **);
struct cpp_callbacks
{
void (*line_change) (cpp_reader *, const cpp_token *, int);
The line_map is for the new file. It is NULL if there is no new file.
(In C this happens when done with <built-in>+<command line> and also
when done with a main file.) This can be used for resource cleanup. */
void (*file_change) (cpp_reader *, const struct line_map *);
void (*dir_change) (cpp_reader *, const char *);
void (*include) (cpp_reader *, unsigned int, const unsigned char *,
const char *, int, const cpp_token **);
void (*define) (cpp_reader *, unsigned int, cpp_hashnode *);
void (*undef) (cpp_reader *, unsigned int, cpp_hashnode *);
void (*ident) (cpp_reader *, unsigned int, const cpp_string *);
void (*def_pragma) (cpp_reader *, unsigned int);
int (*valid_pch) (cpp_reader *, const char *, int);
void (*read_pch) (cpp_reader *, const char *, int, const char *);
missing_header_cb missing_header;
be expanded. */
cpp_hashnode * (*macro_to_expand) (cpp_reader *, const cpp_token *);
translated message. */
bool (*error) (cpp_reader *, int, int, source_location, unsigned int,
const char *, va_list *)
ATTRIBUTE_FPTR_PRINTF(6,0);
defined or not at the time) in #ifdef, #ifndef or "defined". */
void (*used_define) (cpp_reader *, unsigned int, cpp_hashnode *);
void (*used_undef) (cpp_reader *, unsigned int, cpp_hashnode *);
changes are processed. */
void (*before_define) (cpp_reader *);
Second argument is the location of the start of the current expansion. */
void (*used) (cpp_reader *, source_location, cpp_hashnode *);
bool (*user_builtin_macro) (cpp_reader *, cpp_hashnode *);
};
#ifdef VMS
#define INO_T_CPP ino_t ino[3]
#else
#define INO_T_CPP ino_t ino
#endif
struct cpp_dir
{
struct cpp_dir *next;
char *name;
unsigned int len;
"C" guards for C++. */
unsigned char sysp;
bool user_supplied_p;
is only used by hosts that lack reliable inode numbers. */
char *canonical_name;
platforms. A NULL-terminated array of (from, to) pairs. */
const char **name_map;
HEADER we are trying to find, return a constructed pathname to
try and open. If this is NULL, the constructed pathname is as
constructed by append_file_to_dir. */
char *(*construct) (const char *header, cpp_dir *dir);
directories in the search path. */
INO_T_CPP;
dev_t dev;
};
entries for all identifiers: either macros defined by #define
commands (type NT_MACRO), assertions created with #assert
(NT_ASSERTION), or neither of the above (NT_VOID). Builtin macros
like __LINE__ are flagged NODE_BUILTIN. Poisoned identifiers are
flagged NODE_POISONED. NODE_OPERATOR (C++ only) indicates an
identifier that behaves like an operator such as "xor".
NODE_DIAGNOSTIC is for speed in lex_token: it indicates a
diagnostic may be required for this node. Currently this only
applies to __VA_ARGS__, poisoned identifiers, and -Wc++-compat
warnings about NODE_OPERATOR. */
#define NODE_OPERATOR (1 << 0) /* C++ named operator. */
#define NODE_POISONED (1 << 1) /* Poisoned identifier. */
#define NODE_BUILTIN (1 << 2) /* Builtin macro. */
#define NODE_DIAGNOSTIC (1 << 3) /* Possible diagnostic when lexed. */
#define NODE_WARN (1 << 4) /* Warn if redefined or undefined. */
#define NODE_DISABLED (1 << 5) /* A disabled macro. */
#define NODE_MACRO_ARG (1 << 6) /* Used during #define processing. */
#define NODE_USED (1 << 7) /* Dumped with -dU. */
#define NODE_CONDITIONAL (1 << 8) /* Conditional macro */
#define NODE_WARN_OPERATOR (1 << 9) /* Warn about C++ named operator. */
enum node_type
{
NT_VOID = 0,
NT_MACRO,
NT_ASSERTION
};
handle it with the builtin code for efficiency reasons. */
enum cpp_builtin_type
{
BT_SPECLINE = 0,
BT_DATE,
BT_FILE,
BT_BASE_FILE,
BT_INCLUDE_LEVEL,
BT_TIME,
BT_STDC,
BT_PRAGMA,
BT_TIMESTAMP,
BT_COUNTER,
BT_FIRST_USER,
BT_LAST_USER = BT_FIRST_USER + 31
};
#define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))
#define HT_NODE(NODE) ((ht_identifier *) (NODE))
#define NODE_LEN(NODE) HT_LEN (&(NODE)->ident)
#define NODE_NAME(NODE) HT_STR (&(NODE)->ident)
enum {
NTV_MACRO,
NTV_ANSWER,
NTV_BUILTIN,
NTV_ARGUMENT,
NTV_NONE
};
#define CPP_HASHNODE_VALUE_IDX(HNODE) \
((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT \
: HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) \
? NTV_BUILTIN : NTV_MACRO) \
: HNODE.type == NT_ASSERTION ? NTV_ANSWER \
: NTV_NONE)
ends. Also used to store CPP identifiers, which are a superset of
identifiers in the grammatical sense. */
union GTY(()) _cpp_hashnode_value {
cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
enum cpp_builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
};
struct GTY(()) cpp_hashnode {
struct ht_identifier ident;
unsigned int is_directive : 1;
unsigned int directive_index : 7;
then index into directive table.
Otherwise, a NODE_OPERATOR. */
unsigned char rid_code;
ENUM_BITFIELD(node_type) type : 6;
unsigned int flags : 10;
union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
};
If you want cpplib to manage its own hashtable, pass in a NULL
pointer. Otherwise you should pass in an initialized hash table
that cpplib will share; this technique is used by the C front
ends. */
extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *,
struct line_maps *);
PCH file. */
extern void cpp_set_line_map (cpp_reader *, struct line_maps *);
command line options). */
extern void cpp_set_lang (cpp_reader *, enum c_lang);
extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
structures for a given reader. These pointers are good until you
call cpp_finish on that reader. You can either edit the callbacks
through the pointer returned from cpp_get_callbacks, or set them
with cpp_set_callbacks. */
extern cpp_options *cpp_get_options (cpp_reader *);
extern cpp_callbacks *cpp_get_callbacks (cpp_reader *);
extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *);
extern struct deps *cpp_get_deps (cpp_reader *);
returns the name of the original file; this is the same as the
input file, except for preprocessed input. This will generate at
least one file change callback, and possibly a line change callback
too. If there was an error opening the file, it returns NULL. */
extern const char *cpp_read_main_file (cpp_reader *, const char *);
instead unless your know what you are doing. */
extern void cpp_init_special_builtins (cpp_reader *);
extern void cpp_init_builtins (cpp_reader *, int);
processed. */
extern void cpp_post_options (cpp_reader *);
extern void cpp_init_iconv (cpp_reader *);
generation, pass an open stream to write the information to,
otherwise NULL. It is your responsibility to close the stream. */
extern void cpp_finish (cpp_reader *, FILE *deps_stream);
use of the handle after this function returns is invalid. */
extern void cpp_destroy (cpp_reader *);
extern unsigned int cpp_token_len (const cpp_token *);
extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
unsigned char *, bool);
extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
void (*) (cpp_reader *), bool);
extern void cpp_register_deferred_pragma (cpp_reader *, const char *,
const char *, unsigned, bool, bool);
extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
const cpp_token *);
extern const cpp_token *cpp_get_token (cpp_reader *);
extern const cpp_token *cpp_get_token_with_location (cpp_reader *,
source_location *);
extern const unsigned char *cpp_macro_definition (cpp_reader *,
cpp_hashnode *);
extern void _cpp_backup_tokens (cpp_reader *, unsigned int);
extern const cpp_token *cpp_peek_token (cpp_reader *, int);
extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *,
unsigned int *, int *);
extern bool cpp_interpret_string (cpp_reader *,
const cpp_string *, size_t,
cpp_string *, enum cpp_ttype);
extern bool cpp_interpret_string_notranslate (cpp_reader *,
const cpp_string *, size_t,
cpp_string *, enum cpp_ttype);
extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
The text is the same as the command line argument. */
extern void cpp_define (cpp_reader *, const char *);
extern void cpp_define_formatted (cpp_reader *pfile,
const char *fmt, ...) ATTRIBUTE_PRINTF_2;
extern void cpp_assert (cpp_reader *, const char *);
extern void cpp_undef (cpp_reader *, const char *);
extern void cpp_unassert (cpp_reader *, const char *);
extern void cpp_undef_all (cpp_reader *);
extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *,
size_t, int);
extern int cpp_defined (cpp_reader *, const unsigned char *, int);
the double integer are set to zero. */
typedef unsigned HOST_WIDE_INT cpp_num_part;
typedef struct cpp_num cpp_num;
struct cpp_num
{
cpp_num_part high;
cpp_num_part low;
bool unsignedp;
bool overflow;
};
numbers.
cpp_classify_number categorizes numeric constants according to
their field (integer, floating point, or invalid), radix (decimal,
octal, hexadecimal), and type suffixes. */
#define CPP_N_CATEGORY 0x000F
#define CPP_N_INVALID 0x0000
#define CPP_N_INTEGER 0x0001
#define CPP_N_FLOATING 0x0002
#define CPP_N_WIDTH 0x00F0
#define CPP_N_SMALL 0x0010 /* int, float, shrot _Fract/Accum */
#define CPP_N_MEDIUM 0x0020 /* long, double, long _Fract/_Accum. */
#define CPP_N_LARGE 0x0040 /* long long, long double,
long long _Fract/Accum. */
#define CPP_N_WIDTH_MD 0xF0000 /* machine defined. */
#define CPP_N_MD_W 0x10000
#define CPP_N_MD_Q 0x20000
#define CPP_N_RADIX 0x0F00
#define CPP_N_DECIMAL 0x0100
#define CPP_N_HEX 0x0200
#define CPP_N_OCTAL 0x0400
#define CPP_N_BINARY 0x0800
#define CPP_N_UNSIGNED 0x1000 /* Properties. */
#define CPP_N_IMAGINARY 0x2000
#define CPP_N_DFLOAT 0x4000
#define CPP_N_DEFAULT 0x8000
#define CPP_N_FRACT 0x100000 /* Fract types. */
#define CPP_N_ACCUM 0x200000 /* Accum types. */
the flags from the above sets. */
extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *);
extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
unsigned int type);
others assumed clear, to fill out a cpp_num structure. */
cpp_num cpp_num_sign_extend (cpp_num, size_t);
position in the translation unit with it, use cpp_error_with_line
with a line number of zero. */
enum {
CPP_DL_WARNING = 0,
CPP_DL_WARNING_SYSHDR,
CPP_DL_PEDWARN,
CPP_DL_ERROR,
otherwise the same as CPP_DL_ERROR. */
CPP_DL_ICE,
CPP_DL_NOTE,
CPP_DL_FATAL
};
and errors that are not warnings. */
enum {
CPP_W_NONE = 0,
CPP_W_DEPRECATED,
CPP_W_COMMENTS,
CPP_W_MISSING_INCLUDE_DIRS,
CPP_W_TRIGRAPHS,
CPP_W_MULTICHAR,
CPP_W_TRADITIONAL,
CPP_W_LONG_LONG,
CPP_W_ENDIF_LABELS,
CPP_W_NUM_SIGN_CHANGE,
CPP_W_VARIADIC_MACROS,
CPP_W_BUILTIN_MACRO_REDEFINED,
CPP_W_DOLLARS,
CPP_W_UNDEF,
CPP_W_UNUSED_MACROS,
CPP_W_CXX_OPERATOR_NAMES,
CPP_W_NORMALIZE,
CPP_W_INVALID_PCH,
CPP_W_WARNING_DIRECTIVE
};
extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)
ATTRIBUTE_PRINTF_3;
extern bool cpp_warning (cpp_reader *, int, const char *msgid, ...)
ATTRIBUTE_PRINTF_3;
extern bool cpp_pedwarning (cpp_reader *, int, const char *msgid, ...)
ATTRIBUTE_PRINTF_3;
extern bool cpp_warning_syshdr (cpp_reader *, int, const char *msgid, ...)
ATTRIBUTE_PRINTF_3;
error string of errno. No location is printed. */
extern bool cpp_errno (cpp_reader *, int, const char *msgid);
(translation unit) physical line and physical column. If the line is
zero, then no location is printed. */
extern bool cpp_error_with_line (cpp_reader *, int, source_location,
unsigned, const char *msgid, ...)
ATTRIBUTE_PRINTF_5;
extern bool cpp_warning_with_line (cpp_reader *, int, source_location,
unsigned, const char *msgid, ...)
ATTRIBUTE_PRINTF_5;
extern bool cpp_pedwarning_with_line (cpp_reader *, int, source_location,
unsigned, const char *msgid, ...)
ATTRIBUTE_PRINTF_5;
extern bool cpp_warning_with_line_syshdr (cpp_reader *, int, source_location,
unsigned, const char *msgid, ...)
ATTRIBUTE_PRINTF_5;
extern int cpp_ideq (const cpp_token *, const char *);
extern void cpp_output_line (cpp_reader *, FILE *);
extern unsigned char *cpp_output_line_to_string (cpp_reader *,
const unsigned char *);
extern void cpp_output_token (const cpp_token *, FILE *);
extern const char *cpp_type2name (enum cpp_ttype, unsigned char flags);
target precision. PSTR points to the input pointer, which is just
after the backslash. LIMIT is how much text we have. WIDE is true
if the escape sequence is part of a wide character constant or
string literal. Handles all relevant diagnostics. */
extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr,
const unsigned char *limit, int wide);
source code. */
typedef struct
{
char *comment;
source_location sloc;
} cpp_comment;
typedef struct
{
cpp_comment *entries;
int count;
int allocated;
} cpp_comment_table;
table is only populated when pfile->state.save_comments is true. */
extern cpp_comment_table *cpp_get_comments (cpp_reader *);
table if it is not already there. */
extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
unsigned int);
typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *);
extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *);
extern void cpp_scan_nooutput (cpp_reader *);
extern int cpp_sys_macro_p (cpp_reader *);
extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
unsigned int);
extern bool cpp_included (cpp_reader *, const char *);
extern bool cpp_included_before (cpp_reader *, const char *, source_location);
extern void cpp_make_system_header (cpp_reader *, int, int);
extern bool cpp_push_include (cpp_reader *, const char *);
extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
extern const char *cpp_get_path (struct _cpp_file *);
extern cpp_dir *cpp_get_dir (struct _cpp_file *);
extern cpp_buffer *cpp_get_buffer (cpp_reader *);
extern struct _cpp_file *cpp_get_file (cpp_buffer *);
extern cpp_buffer *cpp_get_prev (cpp_buffer *);
extern void cpp_clear_file_cache (cpp_reader *);
struct save_macro_data;
extern int cpp_save_state (cpp_reader *, FILE *);
extern int cpp_write_pch_deps (cpp_reader *, FILE *);
extern int cpp_write_pch_state (cpp_reader *, FILE *);
extern int cpp_valid_state (cpp_reader *, const char *, int);
extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
extern int cpp_read_state (cpp_reader *, const char *, FILE *,
struct save_macro_data *);
#endif