typedef struct cpp_string cpp_string;
typedef struct cpp_hashnode cpp_hashnode;
typedef struct cpp_macro cpp_macro;
-typedef struct cpp_lexer_pos cpp_lexer_pos;
-typedef struct cpp_lookahead cpp_lookahead;
typedef struct cpp_callbacks cpp_callbacks;
struct answer;
struct file_name_map_list;
-struct ht;
/* The first two groups, apart from '=', can appear in preprocessor
expressions. This allows a lookup table to be implemented in
OP(CPP_ATSIGN, "@") /* used in Objective C */ \
\
TK(CPP_NAME, SPELL_IDENT) /* word */ \
- TK(CPP_NUMBER, SPELL_STRING) /* 34_be+ta */ \
+ TK(CPP_NUMBER, SPELL_NUMBER) /* 34_be+ta */ \
\
TK(CPP_CHAR, SPELL_STRING) /* 'char' */ \
TK(CPP_WCHAR, SPELL_STRING) /* L'char' */ \
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_COMMENT, SPELL_NUMBER) /* Only if output comments. */ \
+ /* SPELL_NUMBER happens to DTRT. */ \
TK(CPP_MACRO_ARG, SPELL_NONE) /* Macro argument. */ \
- OP(CPP_EOF, "EOL") /* End of line or file. */
+ TK(CPP_PADDING, SPELL_NONE) /* Whitespace for cpp0. */ \
+ TK(CPP_EOF, SPELL_NONE) /* End of line or file. */
#define OP(e, s) e,
#define TK(e, s) e,
#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 AVOID_LPASTE (1 << 6) /* Check left for accidental pastes. */
+#define BOL (1 << 6) /* Token at beginning of line. */
/* A preprocessing token. This has been carefully packed and should
- occupy 12 bytes on 32-bit hosts and 16 bytes on 64-bit hosts. */
+ occupy 16 bytes on 32-bit hosts and 24 bytes on 64-bit hosts. */
struct cpp_token
{
unsigned int line; /* Logical line of first char of token. */
union
{
cpp_hashnode *node; /* An identifier. */
+ const cpp_token *source; /* Inherit padding from this token. */
struct cpp_string str; /* A string, or number. */
unsigned int arg_no; /* Argument no. for a CPP_MACRO_ARG. */
unsigned char c; /* Character represented by CPP_OTHER. */
} val;
};
-/* The position of a token in the current file. */
-struct cpp_lexer_pos
-{
- unsigned int line;
- unsigned int output_line;
- unsigned short col;
-};
-
-typedef struct cpp_token_with_pos cpp_token_with_pos;
-struct cpp_token_with_pos
-{
- cpp_token token;
- cpp_lexer_pos pos;
-};
-
-/* Token lookahead. */
-struct cpp_lookahead
-{
- struct cpp_lookahead *next;
- cpp_token_with_pos *tokens;
- cpp_lexer_pos pos;
- unsigned int cur, count, cap;
-};
-
/* A standalone character. We may want to make it unsigned for the
same reason we use unsigned char - to avoid signedness issues. */
typedef int cppchar_t;
/* Characters between tab stops. */
unsigned int tabstop;
- /* Pending options - -D, -U, -A, -I, -ixxx. */
+ /* Pending options - -D, -U, -A, -I, -ixxx. */
struct cpp_pending *pending;
/* File name which deps are being written to. This is 0 if deps are
generated files and not errors. */
unsigned char print_deps_missing_files;
- /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
+ /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
unsigned char print_deps_append;
/* Nonzero means print names of header files (-H). */
the source-file directory. */
unsigned char ignore_srcdir;
- /* Zero means dollar signs are punctuation. */
+ /* Zero means dollar signs are punctuation. */
unsigned char dollars_in_ident;
/* Nonzero means warn if undefined identifiers are evaluated in an #if. */
/* Print column number in error messages. */
unsigned char show_column;
- /* Treat C++ alternate operator names special. */
+ /* Nonzero means handle C++ alternate operator names. */
unsigned char operator_names;
/* True if --help, --version or --target-help appeared in the
unsigned char help_only;
};
-typedef struct cpp_file_change cpp_file_change;
-struct cpp_file_change
-{
- struct line_map *map; /* Line map to use until next callback. */
- unsigned int line; /* Logical line number of next line. */
- enum lc_reason reason; /* Reason for change. */
- unsigned char sysp; /* Nonzero if system header. */
- unsigned char externc; /* Nonzero if wrapper needed. */
-};
-
/* Call backs. */
struct cpp_callbacks
{
- void (*file_change) PARAMS ((cpp_reader *, const cpp_file_change *));
- void (*include) PARAMS ((cpp_reader *, unsigned int,
- const unsigned char *, const cpp_token *));
- void (*define) PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *));
- void (*undef) PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *));
- void (*ident) PARAMS ((cpp_reader *, unsigned int, const cpp_string *));
- void (*def_pragma) PARAMS ((cpp_reader *, unsigned int));
+ /* Called when a new line of preprocessed output is started. */
+ void (*line_change) PARAMS ((cpp_reader *, const cpp_token *, int));
+ void (*file_change) PARAMS ((cpp_reader *, const struct line_map *));
+ void (*include) PARAMS ((cpp_reader *, unsigned int,
+ const unsigned char *, const cpp_token *));
+ void (*define) PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *));
+ void (*undef) PARAMS ((cpp_reader *, unsigned int, cpp_hashnode *));
+ void (*ident) PARAMS ((cpp_reader *, unsigned int, const cpp_string *));
+ void (*def_pragma) PARAMS ((cpp_reader *, unsigned int));
};
#define CPP_FATAL_LIMIT 1000
-/* True if we have seen a "fatal" error. */
+/* True if we have seen a "fatal" error. */
#define CPP_FATAL_ERRORS(PFILE) (cpp_errors (PFILE) >= CPP_FATAL_LIMIT)
/* Name under which this program was invoked. */
extern const char *progname;
-/* Where does this buffer come from? A source file, a builtin macro,
- a command-line option, or a _Pragma operator. */
-enum cpp_buffer_type {BUF_FILE, BUF_BUILTIN, BUF_CL_OPTION, BUF_PRAGMA};
-
/* The structure of a node in the hash table. The hash table has
entries for all identifiers: either macros defined by #define
commands (type NT_MACRO), assertions created with #assert
#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. */
/* Different flavors of hash node. */
enum node_type
NT_ASSERTION /* Predicate for #assert. */
};
-/* Different flavors of builtin macro. */
+/* Different flavors of builtin macro. _Pragma is an operator, but we
+ handle it with the builtin code for efficiency reasons. */
enum builtin_type
{
BT_SPECLINE = 0, /* `__LINE__' */
BT_BASE_FILE, /* `__BASE_FILE__' */
BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
BT_TIME, /* `__TIME__' */
- BT_STDC /* `__STDC__' */
+ BT_STDC, /* `__STDC__' */
+ BT_PRAGMA /* `_Pragma' operator */
};
#define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))
} value;
};
-/* Call this first to get a handle to pass to other functions. If you
- want cpplib to manage its own hashtable, pass in a NULL pointer.
- Or you can pass in an initialised hash table that cpplib will use;
- this technique is used by the C front ends. */
-extern cpp_reader *cpp_create_reader PARAMS ((struct ht *,
- enum c_lang));
-
-/* Call this to release the handle. Any use of the handle after this
- function returns is invalid. Returns cpp_errors (pfile). */
-extern int cpp_destroy PARAMS ((cpp_reader *));
+/* Call this first to get a handle to pass to other functions. */
+extern cpp_reader *cpp_create_reader PARAMS ((enum c_lang));
/* Call these to get pointers to the options and callback structures
for a given reader. These pointers are good until you call
through the pointer returned from cpp_get_callbacks, or set them
with cpp_set_callbacks. */
extern cpp_options *cpp_get_options PARAMS ((cpp_reader *));
-extern struct line_maps *cpp_get_line_maps PARAMS ((cpp_reader *));
+extern const struct line_maps *cpp_get_line_maps PARAMS ((cpp_reader *));
extern cpp_callbacks *cpp_get_callbacks PARAMS ((cpp_reader *));
extern void cpp_set_callbacks PARAMS ((cpp_reader *, cpp_callbacks *));
return value is the number of arguments used. If
cpp_handle_options returns without using all arguments, it couldn't
understand the next switch. When there are no switches left, you
- must call cpp_post_options before calling cpp_start_read. Only
+ must call cpp_post_options before calling cpp_read_main_file. Only
after cpp_post_options are the contents of the cpp_options
- structure reliable. */
+ structure reliable. Options processing is not completed until you
+ call cpp_finish_options. */
extern int cpp_handle_options PARAMS ((cpp_reader *, int, char **));
extern int cpp_handle_option PARAMS ((cpp_reader *, int, char **));
extern void cpp_post_options PARAMS ((cpp_reader *));
+/* This function reads the file, but does not start preprocessing. It
+ 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.
+
+ If you want cpplib to manage its own hashtable, pass in a NULL
+ pointer. Otherise you should pass in an initialised hash table
+ that cpplib will share; this technique is used by the C front
+ ends. */
+extern const char *cpp_read_main_file PARAMS ((cpp_reader *, const char *,
+ struct ht *));
+
+/* Deferred handling of command line options that can generate debug
+ callbacks, such as -D and -imacros. Call this after
+ cpp_read_main_file. The front ends need this separation so they
+ can initialize debug output with the original file name, returned
+ from cpp_read_main_file, before they get debug callbacks. */
+extern void cpp_finish_options PARAMS ((cpp_reader *));
+
+/* Call this to release the handle at the end of preprocessing. Any
+ use of the handle after this function returns is invalid. Returns
+ cpp_errors (pfile). */
+extern int cpp_destroy PARAMS ((cpp_reader *));
+
/* Error count. */
extern unsigned int cpp_errors PARAMS ((cpp_reader *));
extern void cpp_register_pragma PARAMS ((cpp_reader *,
const char *, const char *,
void (*) PARAMS ((cpp_reader *))));
-extern void cpp_register_pragma_space PARAMS ((cpp_reader *, const char *));
-extern int cpp_start_read PARAMS ((cpp_reader *, const char *));
extern void cpp_finish PARAMS ((cpp_reader *));
extern int cpp_avoid_paste PARAMS ((cpp_reader *, const cpp_token *,
const cpp_token *));
-extern enum cpp_ttype cpp_can_paste PARAMS ((cpp_reader *, const cpp_token *,
- const cpp_token *, int *));
-extern void cpp_get_token PARAMS ((cpp_reader *, cpp_token *));
-extern const cpp_lexer_pos *cpp_get_line PARAMS ((cpp_reader *));
+extern const cpp_token *cpp_get_token PARAMS ((cpp_reader *));
extern const unsigned char *cpp_macro_definition PARAMS ((cpp_reader *,
const cpp_hashnode *));
+extern void _cpp_backup_tokens PARAMS ((cpp_reader *, unsigned int));
/* Evaluate a CPP_CHAR or CPP_WCHAR token. */
extern HOST_WIDE_INT
extern cpp_buffer *cpp_push_buffer PARAMS ((cpp_reader *,
const unsigned char *, size_t,
- enum cpp_buffer_type,
- const char *, int));
+ int, int));
extern int cpp_defined PARAMS ((cpp_reader *, const unsigned char *, int));
/* N.B. The error-message-printer prototypes have not been nicely
ATTRIBUTE_PRINTF_4;
extern void cpp_pedwarn_with_line PARAMS ((cpp_reader *, int, int, const char *msgid, ...))
ATTRIBUTE_PRINTF_4;
-extern void cpp_pedwarn_with_file_and_line PARAMS ((cpp_reader *, const char *, int, int, const char *msgid, ...))
- ATTRIBUTE_PRINTF_5;
extern void cpp_error_from_errno PARAMS ((cpp_reader *, const char *));
extern void cpp_notice_from_errno PARAMS ((cpp_reader *, const char *));
/* In cppmacro.c */
extern void cpp_scan_nooutput PARAMS ((cpp_reader *));
-extern void cpp_start_lookahead PARAMS ((cpp_reader *));
-extern void cpp_stop_lookahead PARAMS ((cpp_reader *, int));
extern int cpp_sys_macro_p PARAMS ((cpp_reader *));
/* In cppfiles.c */