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_PADDING, "") /* Whitespace for cpp0. */ \
- 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 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. */
/* 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
};
#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. */
#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
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 *));
/* 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 */