diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2000-07-04 01:58:21 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2000-07-04 01:58:21 +0000 |
commit | 041c31944c94d5ee089bd569c4361fbc3d2acaea (patch) | |
tree | 1c91fa44eb386dd706e44d139ed980ea94f05cae /gcc/cpphash.h | |
parent | 4f647814cefff8ee95ac918a8484d5da8c415825 (diff) | |
download | gcc-041c31944c94d5ee089bd569c4361fbc3d2acaea.zip gcc-041c31944c94d5ee089bd569c4361fbc3d2acaea.tar.gz gcc-041c31944c94d5ee089bd569c4361fbc3d2acaea.tar.bz2 |
top level:
2000-07-03 Zack Weinberg <zack@wolery.cumb.org>
* fix-header.c (struct partial_proto): Remove unnecessary fields.
(recognized_extern, recognized_function, read_scan_file):
Update for new scheme.
(check_protection): It's still a multiple include guard even
if it doesn't always trigger.
* scan-decls.c (skip_to_closing_brace, scan_decls): Update for
new scheme.
* scan.h: Declare struct cpp_token. Update prototypes.
2000-07-03 Neil Booth <neilb@earthling.net>
Zack Weinberg <zack@wolery.cumb.org>
Complete overhaul of the lexer and macro expander.
* cpphash.c (object_defn, funct_defn, push_macro_expansion,
arg, arglist, argdata, reflist, collect_objlike_expansion,
collect_funlike_expansion, collect_params,
warn_trad_stringify, trad_stringify, duplicate_arg_p, add_pat,
unsafe_chars, macarg, compare_defs, special_symbol,
scan_arguments, stringify, funlike_macroexpand,
_cpp_quote_string, monthnames): Delete.
(cpp_lookup, _cpp_free_definition, dump_funlike_macro,
_cpp_create_definition, _cpp_dump_definition,
dump_hash_helper): Adjust.
(find_param, count_params, parse_define, var_args_str,
check_macro_redefinition, save_expansion): New.
* cpplex.c (skip_block_comment, skip_line_comment, parse_name,
parse_string, output_line_command, trigraph_replace,
lex_line, cpp_push_buffer, cpp_pop_buffer, cpp_output_tokens,
cpp_scan_buffer_nooutput, cpp_scan_buffer, cpp_free_toklist,
cpp_idcmp, _cpp_get_directive_token, _cpp_init_input_buffer,
_cpp_skip_rest_of_line): Modify.
(maybe_macroexpand, skip_comment, copy_comment, skip_string,
find_position, null_warning, bump_column, expand_name_space,
pedantic_whitespace, _cpp_output_list, _cpp_slice_toklist,
_cpp_squeeze_toklist, _cpp_scan_until, _cpp_skip_hspace,
_cpp_parse_name, _cpp_lex_token, cpp_get_non_space_token,
_cpp_prescan): Delete.
(dump_param_spelling, process_directive, lex_next,
is_macro_disabled, stringify_arg, expand_context_stack,
output_token, make_string_token, alloc_number_token,
special_symbol, duplicate_token, maybe_paste_with_next,
can_paste, prevent_macro_expansion, restore_macro_expansion,
get_temp_token, release_temp_tokens, quote_string,
token_names, token_spellings, _cpp_expand_name_space,
_cpp_glue_header_name, _cpp_reserve_name_space,
digraph_spellings, trigraph_ok, skip_whitespace, save_comment,
placemarker_token, eof_token, cpp_context, macro_args,
get_raw_token, parse_arg, parse_args, save_token,
push_arg_context, push_macro_context, pop_context,
do_pop_context, free_macro_args, _cpp_get_line,
_cpp_run_directive): New.
* cpplib.c (validate_else, parse_include, push_conditional,
pass_thru_directive, read_line_number, parse_ifdef,
detect_if_not_defined, _cpp_check_directive, do_define,
do_undef, do_include, do_import, do_include_next, do_error,
do_warning, do_ident, do_pragma, pragma_dispatch, gcc_pragmas,
top_pragmas, do_pragma_gcc, do_pragma_implementation,
do_pragma_poison, do_pragma_system_header,
do_pragma_dependency, do_sccs, do_ifdef, do_ifndef, do_else,
dl_elif, do_endif, _cpp_unwind_if_stack, do_assert,
do_unassert, cpp_define, cpp_undef, cpp_assert, cpp_unassert,
cpp_defined): Update for new scheme.
(strtoul_for_line, get_define_node, dump_macro_name,
_cpp_check_linemarker, _cpp_parse_assertion): New.
(_cpp_handle_directive, do_pragma_default): Delete.
* cpphash.h (struct predicate): Now struct answer.
(enum spell_type, struct token_spelling, struct directive,
directive_handler): New.
Update prototypes. Remove unused macros.
* cpplib.h: Update prototypes. Remove unused macros,
structure definitions, and fields.
* cpperror.c (print_containing_files, v_message): Adjust.
* cppexp.c (parse_assertion, lex, parse_escape,
_cpp_parse_expr): Adjust.
* cppfiles.c (open_include_file, _cpp_execute_include,
_cpp_compare_file_date, cpp_read_file, read_include_file):
Adjust.
* cppinit.c (dump_special_to_buffer): Delete.
(append_include_chain, merge_include_chains, cpp_reader_init,
cpp_cleanup, initialize_builtins, builtin_array, cpp_start_read,
cpp_finish, handle_option, print_help): Adjust.
* cppmain.c (main): Adjust.
testsuite:
2000-07-03 Zack Weinberg <zack@wolery.cumb.org>
* testsuite/gcc.dg/cpp/19951025-1.c: Adjust regexps.
* testsuite/gcc.dg/cpp/19990703-1.c: Likewise.
* testsuite/gcc.dg/cpp/20000625-1.c: Likewise.
* testsuite/gcc.dg/cpp/20000625-2.c: Likewise.
* testsuite/gcc.dg/cpp/macro1.c,
testsuite/gcc.dg/cpp/paste1.c, testsuite/gcc.dg/cpp/paste2.c,
testsuite/gcc.dg/cpp/paste3.c, testsuite/gcc.dg/cpp/paste4.c,
testsuite/gcc.dg/cpp/strify1.c,
testsuite/gcc.dg/cpp/strify2.c: New tests.
From-SVN: r34859
Diffstat (limited to 'gcc/cpphash.h')
-rw-r--r-- | gcc/cpphash.h | 162 |
1 files changed, 85 insertions, 77 deletions
diff --git a/gcc/cpphash.h b/gcc/cpphash.h index ec9204a..f7c130b 100644 --- a/gcc/cpphash.h +++ b/gcc/cpphash.h @@ -25,11 +25,60 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ typedef unsigned char U_CHAR; #define U (const U_CHAR *) /* Intended use: U"string" */ -/* Structure used for assertion predicates. */ -struct predicate +/* Order here matters. Those beyond SPELL_NONE store their spelling + in the token list, and it's length in the token->val.name.len. */ +enum spell_type { - struct predicate *next; - struct cpp_toklist answer; + SPELL_OPERATOR = 0, + SPELL_CHAR, + SPELL_NONE, + SPELL_IDENT, + SPELL_STRING +}; + +struct token_spelling +{ + ENUM_BITFIELD(spell_type) type : CHAR_BIT; + const U_CHAR *spelling; +}; + +extern const struct token_spelling token_spellings[]; + +/* Chained list of answers to an assertion. */ +struct answer +{ + struct answer *next; + cpp_toklist list; +}; +#define FREE_ANSWER(answer) do {_cpp_free_toklist (&answer->list); \ + free (answer); } while (0) + +/* Values for the origin field of struct directive. KANDR directives + come from traditional (K&R) C. STDC89 directives come from the + 1989 C standard. EXTENSION directives are extensions. */ +#define KANDR 0 +#define STDC89 1 +#define EXTENSION 2 + +/* Values for the flags field of struct directive. COND indicates a + conditional. EXPAND means that macros are to be expanded on the + directive line. INCL means to treat "..." and <...> as + q-char-sequence and h-char-sequence respectively. COMMENTS means + preserve comments in the directive if -C. */ +#define COND (1 << 0) +#define EXPAND (1 << 1) +#define INCL (1 << 2) +#define COMMENTS (1 << 3) + +/* Defines one #-directive, including how to handle it. */ +typedef int (*directive_handler) PARAMS ((cpp_reader *)); +struct directive +{ + directive_handler handler; /* Function to handle directive. */ + const U_CHAR *name; /* Name of directive. */ + unsigned short length; /* Length of name. */ + unsigned char origin; /* Origin of directive. */ + unsigned char flags; /* Flags describing this directive. */ }; /* List of directories to look for include files in. */ @@ -105,12 +154,6 @@ extern unsigned char _cpp_IStable[256]; /* Macros. */ -/* One character lookahead in the input buffer. Note that if this - returns EOF, it does *not* necessarily mean the file's end has been - reached. */ -#define CPP_BUF_PEEK(BUFFER) \ - ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF) - /* 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 \ @@ -127,53 +170,15 @@ extern unsigned char _cpp_IStable[256]; /* Append character CH to PFILE's output buffer. Make space if need be. */ #define CPP_PUTC(PFILE, CH) (CPP_RESERVE (PFILE, 1), CPP_PUTC_Q (PFILE, CH)) -/* Advance the current line by one. */ -#define CPP_BUMP_BUFFER_LINE(PBUF) ((PBUF)->lineno++,\ - (PBUF)->line_base = (PBUF)->cur) -#define CPP_BUMP_LINE(PFILE) CPP_BUMP_BUFFER_LINE(CPP_BUFFER(PFILE)) -#define CPP_BUMP_BUFFER_LINE_CUR(PBUF, CUR) ((PBUF)->lineno++,\ - (PBUF)->line_base = CUR) -#define CPP_BUMP_LINE_CUR(PFILE, CUR) \ - CPP_BUMP_BUFFER_LINE_CUR(CPP_BUFFER(PFILE), CUR) #define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->prev) - -/* Are we in column 1 right now? Used mainly for -traditional handling - of directives. */ -#define CPP_IN_COLUMN_1(PFILE) \ -(CPP_BUFFER (PFILE)->cur - CPP_BUFFER (PFILE)->line_base == 1) - #define CPP_PRINT_DEPS(PFILE) CPP_OPTION (PFILE, print_deps) #define CPP_TRADITIONAL(PFILE) CPP_OPTION (PFILE, traditional) -#define CPP_IN_SYSTEM_HEADER(PFILE) (cpp_file_buffer (PFILE)->inc->sysp) +#define CPP_IN_SYSTEM_HEADER(PFILE) (CPP_BUFFER (PFILE)->inc->sysp) #define CPP_PEDANTIC(PF) \ (CPP_OPTION (PF, pedantic) && !CPP_IN_SYSTEM_HEADER (PF)) #define CPP_WTRADITIONAL(PF) \ (CPP_OPTION (PF, warn_traditional) && !CPP_IN_SYSTEM_HEADER (PF)) -/* CPP_IS_MACRO_BUFFER is true if the buffer contains macro expansion. - (Note that it is false while we're expanding macro *arguments*.) */ -#define CPP_IS_MACRO_BUFFER(PBUF) ((PBUF)->macro != NULL) - -/* Remember the current position of PFILE so it may be returned to - after looking ahead a bit. - - Note that when you set a mark, you _must_ return to that mark. You - may not forget about it and continue parsing. You may not pop a - buffer with an active mark. You may not call CPP_BUMP_LINE while a - mark is active. */ -#define CPP_SET_BUF_MARK(IP) ((IP)->mark = (IP)->cur) -#define CPP_GOTO_BUF_MARK(IP) ((IP)->cur = (IP)->mark, (IP)->mark = 0) -#define CPP_SET_MARK(PFILE) CPP_SET_BUF_MARK(CPP_BUFFER(PFILE)) -#define CPP_GOTO_MARK(PFILE) CPP_GOTO_BUF_MARK(CPP_BUFFER(PFILE)) - -/* ACTIVE_MARK_P is true if there's a live mark in the buffer. */ -#define ACTIVE_MARK_P(PFILE) (CPP_BUFFER (PFILE)->mark != 0) - -/* Are mark and point adjacent characters? Used mostly to deal with - the somewhat annoying semantic of #define. */ -#define ADJACENT_TO_MARK(PFILE) \ - (CPP_BUFFER(PFILE)->cur - CPP_BUFFER(PFILE)->mark == 1) - /* Flags for _cpp_init_toklist. */ #define DUMMY_TOKEN 0 #define NO_DUMMY_TOKEN 1 @@ -181,22 +186,19 @@ extern unsigned char _cpp_IStable[256]; /* In cpphash.c */ extern unsigned int _cpp_calc_hash PARAMS ((const U_CHAR *, size_t)); extern void _cpp_free_definition PARAMS ((cpp_hashnode *)); -extern int _cpp_create_definition PARAMS ((cpp_reader *, cpp_toklist *, - cpp_hashnode *)); +extern int _cpp_create_definition PARAMS ((cpp_reader *, cpp_hashnode *)); extern void _cpp_dump_definition PARAMS ((cpp_reader *, cpp_hashnode *)); -extern void _cpp_quote_string PARAMS ((cpp_reader *, const U_CHAR *)); -extern void _cpp_macroexpand PARAMS ((cpp_reader *, cpp_hashnode *)); extern void _cpp_init_macro_hash PARAMS ((cpp_reader *)); extern void _cpp_dump_macro_hash PARAMS ((cpp_reader *)); /* In cppfiles.c */ extern void _cpp_simplify_pathname PARAMS ((char *)); -extern void _cpp_execute_include PARAMS ((cpp_reader *, U_CHAR *, +extern void _cpp_execute_include PARAMS ((cpp_reader *, const U_CHAR *, unsigned int, int, - struct file_name_list *)); -extern int _cpp_compare_file_date PARAMS ((cpp_reader *, U_CHAR *, - unsigned int, - struct file_name_list *)); + struct file_name_list *, + int)); +extern int _cpp_compare_file_date PARAMS ((cpp_reader *, const U_CHAR *, + unsigned int, int)); extern void _cpp_init_include_table PARAMS ((cpp_reader *)); extern const char *_cpp_fake_include PARAMS ((cpp_reader *, const char *)); @@ -204,40 +206,46 @@ extern const char *_cpp_fake_include PARAMS ((cpp_reader *, const char *)); extern int _cpp_parse_expr PARAMS ((cpp_reader *)); /* In cpplex.c */ -extern void _cpp_parse_name PARAMS ((cpp_reader *, int)); extern void _cpp_skip_rest_of_line PARAMS ((cpp_reader *)); -extern void _cpp_skip_hspace PARAMS ((cpp_reader *)); -extern void _cpp_expand_to_buffer PARAMS ((cpp_reader *, - const unsigned char *, int)); -extern int _cpp_parse_assertion PARAMS ((cpp_reader *)); -extern enum cpp_ttype _cpp_lex_token PARAMS ((cpp_reader *)); -extern ssize_t _cpp_prescan PARAMS ((cpp_reader *, cpp_buffer *, - ssize_t)); +extern void _cpp_free_temp_tokens PARAMS ((cpp_reader *)); extern void _cpp_init_input_buffer PARAMS ((cpp_reader *)); extern void _cpp_grow_token_buffer PARAMS ((cpp_reader *, long)); extern enum cpp_ttype _cpp_get_directive_token PARAMS ((cpp_reader *)); -extern enum cpp_ttype _cpp_get_define_token - PARAMS ((cpp_reader *)); -extern enum cpp_ttype _cpp_scan_until PARAMS ((cpp_reader *, cpp_toklist *, - enum cpp_ttype)); extern void _cpp_init_toklist PARAMS ((cpp_toklist *, int)); extern void _cpp_clear_toklist PARAMS ((cpp_toklist *)); -extern void _cpp_free_toklist PARAMS ((cpp_toklist *)); -extern void _cpp_slice_toklist PARAMS ((cpp_toklist *, - const cpp_token *, - const cpp_token *)); -extern void _cpp_squeeze_toklist PARAMS ((cpp_toklist *)); +extern void _cpp_free_toklist PARAMS ((const cpp_toklist *)); extern int _cpp_equiv_tokens PARAMS ((const cpp_token *, const cpp_token *)); extern int _cpp_equiv_toklists PARAMS ((const cpp_toklist *, const cpp_toklist *)); extern void _cpp_expand_token_space PARAMS ((cpp_toklist *, unsigned int)); +extern void _cpp_reserve_name_space PARAMS ((cpp_toklist *, unsigned int)); +extern void _cpp_expand_name_space PARAMS ((cpp_toklist *, unsigned int)); +extern void _cpp_dump_list PARAMS ((cpp_reader *, + const cpp_toklist *, + const cpp_token *, int)); +extern int _cpp_equiv_tokens PARAMS ((const cpp_token *, + const cpp_token *)); +extern void _cpp_run_directive PARAMS ((cpp_reader *, + const struct directive *, + const char *, size_t)); +extern unsigned int _cpp_get_line PARAMS ((cpp_reader *, + unsigned int *)); +extern const cpp_token *_cpp_get_raw_token PARAMS ((cpp_reader *)); +extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token*)); +extern const cpp_token *_cpp_glue_header_name PARAMS ((cpp_reader *)); /* In cpplib.c */ -extern int _cpp_handle_directive PARAMS ((cpp_reader *)); +extern const struct directive *_cpp_check_directive + PARAMS ((cpp_reader *, const cpp_token *, int)); +extern const struct directive *_cpp_check_linemarker + PARAMS ((cpp_reader *, const cpp_token *, int)); extern void _cpp_unwind_if_stack PARAMS ((cpp_reader *, cpp_buffer *)); -extern void _cpp_check_directive PARAMS ((cpp_toklist *, cpp_token *)); +extern cpp_hashnode * _cpp_parse_assertion PARAMS ((cpp_reader *, + struct answer **)); +extern struct answer** find_answer PARAMS ((cpp_hashnode *, + const cpp_toklist *)); /* Utility routines and macros. */ #define xnew(T) (T *) xmalloc (sizeof(T)) |