cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
/* Parse C expressions for cpplib.
|
2000-02-23 19:21:07 +00:00
|
|
|
|
Copyright (C) 1987, 92, 94, 95, 97, 98, 1999, 2000 Free Software Foundation.
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
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 2, 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; if not, write to the Free Software
|
1995-06-15 07:33:25 -04:00
|
|
|
|
Foundation, 59 Temple Place - Suite 330,
|
|
|
|
|
Boston, MA 02111-1307, USA.
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
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!
|
|
|
|
|
|
1996-07-03 22:07:53 +00:00
|
|
|
|
Written by Per Bothner 1994. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
/* Parse a C expression from text in a string */
|
|
|
|
|
|
|
|
|
|
#include "config.h"
|
More cutover to system.h:
* Makefile.in (cppalloc.o, cpperror.o, cppexp.o, cpphash.o,
cpplib.o, cppmain.o, fix-header.o, gcov.o, gen-protos.o,
gengenrtl.o, halfpic.o, hash.o, scan-decls.o, scan.o): Depend on
system.h.
* cpphash.c: Include config.h.
* cppalloc.c: Include system.h. Add parameters to various
function prototypes.
* cpperror.c: Likewise.
* cppexp.c: Likewise.
* cpphash.c: Likewise.
* cpplib.c: Likewise.
* cppmain.c: Likewise.
* fix-header.c: Likewise.
* gcov.c: Likewise.
* gen-protos.c: Likewise.
* gengenrtl.c: Likewise.
* halfpic.c: Likewise.
* hash.c: Likewise.
* scan-decls.c: Likewise.
* scan.c: Likewise.
From-SVN: r18911
1998-03-30 12:05:54 +00:00
|
|
|
|
#include "system.h"
|
Warning Fixes:
* Makefile.in (print-rtl.o): Depend on bitmap.h.
(dbxout.o): Depend on toplev.h.
($(SCHED_PREFIX)sched.o): Likewise.
($(out_object_file)): Likewise for system.h and toplev.h.
(cppmain.o): Depend on gansidecl.h.
(cpplib.o): Likewise.
(cpperror.o): Likewise.
(cppexp.o): Likewise.
(cpphash.o): Likewise.
(cppalloc.o): Likewise.
(fix-header.o): Depend on cpplib.h and cpphash.h.
(scan-decls.o): Depend on gansidecl.h.
* basic-block.h (free_regset_vector): Add prototype.
* cccp.c (check_precompiled): Mark parameter `fname' with
ATTRIBUTE_UNUSED.
(do_assert): Likewise for `op' and `keyword'.
(do_unassert): Likewise.
(do_line): Likewise for `keyword'.
(do_error): Likewise for `op' and `keyword'.
(do_warning): Likewise.
(do_ident): Likewise for `keyword'.
(do_pragma): Likewise for `limit', `op' and `keyword'.
(do_sccs): Likewise.
(do_if): Likewise for `keyword'.
(do_elif): Likewise.
(do_else): Likewise.
(do_endif): Likewise.
* collect2.c (getenv): Remove redundant prototype.
(collect_exit, collect_execute, dump_file): Likewise.
(dump_list): Wrap prototype and definition in COLLECT_EXPORT_LIST.
(dump_prefix_list): Hide prototype and definition.
* sparc.c: Include toplev.h.
(intreg_operand): Mark parameter `mode' with ATTRIBUTE_UNUSED.
(symbolic_memory_operand): Likewise.
(sp64_medium_pic_operand): Likewise.
(data_segment_operand): Likewise.
(text_segment_operand): Likewise.
(splittable_symbolic_memory_operand): Likewise.
(splittable_immediate_memory_operand): Likewise.
(eq_or_neq): Likewise.
(normal_comp_operator): Likewise.
(noov_compare_op): Likewise.
(v9_regcmp_op): Likewise.
(v8plus_regcmp_op): Likewise.
(extend_op): Likewise.
(cc_arithop): Likewise.
(cc_arithopn): Likewise.
(small_int): Likewise.
(uns_small_int): Likewise.
(clobbered_register): Likewise.
(legitimize_pic_address): Likewise.
(delay_operand): Likewise.
(sparc_builtin_saveregs): Remove unused variable `stdarg'.
* sparc.h (order_regs_for_local_alloc, eligible_for_return_delay,
sparc_issue_rate, v8plus_regcmp_p): Add prototypes.
* sparc.md (cmpdi_v8plus): Add abort for default case in switch.
* cppalloc.c: Include gansidecl.h.
* cpperror.c: Include stdarg.h/varargs.h and gansidecl.h.
(cpp_file_line_for_message): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
(v_cpp_message): New function.
(cpp_message): Use it. Also convert to variable arguments.
(cpp_fatal): Likewise.
(cpp_pfatal_with_name): Constify parameter `name'.
* cppexp.c: Move gansidecl.h before cpplib.h.
* cpphash.c: Likewise.
* cpphash.h (hashf, delete_macro): Add prototypes.
* cpplib.c: Include stdarg.h/varargs.h and move gansidecl.h before
cpplib.h. Don't include errno.h.
(update_path): Add arguments to prototype.
(cpp_fatal, cpp_file_line_for_message, cpp_message, delete_macro,
cpp_print_containing_files): Remove redundant prototypes.
(cpp_hash_cleanup, add_import, append_include_chain,
make_assertion, path_include, initialize_builtins,
initialize_char_syntax, finclude, validate_else, comp_def_part,
lookup_import, redundant_include_p, is_system_include,
read_name_map, read_filename_string, open_include_file,
check_macro_name, compare_defs, compare_token_lists,
eval_if_expression, change_newlines): Add prototype arguments.
(hashf): Remove redundant prototype.
(read_token_list, free_token_list, safe_read, xcalloc, savestring,
conditional_skip, skip_if_group): Add prototype arguments.
(fdopen): Remove redundant prototype.
(do_define, do_line, do_include, do_undef, do_error, do_pragma,
do_ident, do_if, do_xifdef, do_else, do_elif, do_endif, do_sccs,
do_once, do_assert, do_unassert, do_warning): Add prototype arguments.
(struct directive): Add prototype arguments to function pointer
member `func'.
(handle_directive): Add missing arguments to call to `do_line'.
(do_include): Mark parameters `unused1' and `unused2' with
ATTRIBUTE_UNUSED.
(do_line): Likewise for `keyword' and new parameters `unused1' and
`unused2'.
(do_error): Likewise for `keyword'.
(do_warning): Likewise. Also add missing argument `pfile' in call
to cpp_pedwarn.
(do_once): Mark parameter `keyword', `unused1' and `unused2' with
ATTRIBUTE_UNUSED.
(do_ident): Likewise for `keyword', `buf' and `limit'.
(do_pragma): Likewise. Also add missing arguments in call to do_once.
(do_sccs): Mark parameter `keyword', `buf' and `limit' with
ATTRIBUTE_UNUSED.
(do_if): Likewise for `keyword'.
(do_elif): Likewise.
(eval_if_expression): Likewise for `buf' and `length'.
(do_xifdef): Likewise for `unused1' and `unused2'.
(do_else): Likewise for `keyword', `buf' and `limit'.
(do_endif): Likewise.
(parse_name): Add missing argument `pfile' in call to cpp_pedwarn.
(cpp_handle_options): Remove superfluous NULL argument in call to
cpp_fatal.
(cpp_handle_options): Likewise.
(do_assert): Mark parameter `keyword', `buf' and `limit' with
ATTRIBUTE_UNUSED.
(do_unassert): Likewise.
(cpp_print_file_and_line): Add missing argument `pfile' in call to
cpp_file_line_for_message.
(v_cpp_error): New function.
(cpp_error): Use it. Also accept variable arguments.
(v_cpp_warning): New function.
(cpp_warning): Use it. Also accept variable arguments.
(cpp_pedwarn): Accept variable arguments.
(v_cpp_error_with_line): New function
(cpp_error_with_line): Use it. Accept variable arguments.
(v_cpp_warning_with_line): New function.
(cpp_warning_with_line): Use it. Accept variable arguments. Hide
definition.
(cpp_pedwarn_with_line): Accept variable arguments.
(cpp_pedwarn_with_file_and_line): Likewise.
(cpp_error_from_errno): Constify parameter `name'. Add missing
argument `pfile' in call to cpp_file_line_for_message.
(cpp_perror_with_name): Constify parameter `name'.
* cpplib.h: Define PARAMS() in terms of PROTO().
(fatal): Remove redundant prototype.
(cpp_error, cpp_warning, cpp_pedwarn, cpp_error_with_line,
cpp_pedwarn_with_line, cpp_pedwarn_with_file_and_line,
cpp_error_from_errno, cpp_perror_with_name, cpp_pfatal_with_name,
cpp_fatal, cpp_message, cpp_pfatal_with_name,
cpp_file_line_for_message, cpp_print_containing_files): Add
arguments to prototypes.
(scan_decls, cpp_finish): Add prototypes.
* cppmain.c: Include gansidecl.h.
(main): Remove unused variable `i'.
* dbxout.c: Include toplev.h.
* demangle.h (do_tlink, collect_execute, collect_exit,
collect_wait, dump_file, file_exists): Add prototype.
* dwarf2out.c (dwarf_type_encoding_name, decl_start_label): Hide
prototype and definition.
(gen_unspecified_parameters_die): Don't assign results of call to
function new_die() to unused variable `parm_die'.
(dwarf2out_line): Mark parameter `filename' with ATTRIBUTE_UNUSED.
(dwarf2out_define): Likewise for `lineno' and `buffer'.
* dwarfout.c (output_unsigned_leb128, output_signed_leb128): Hide
prototype and definition.
(output_die): Add prototype arguments to function pointer arg.
(output_unspecified_parameters_die): Mark parameter `arg' with
ATTRIBUTE_UNUSED.
* except.c (output_exception_table_entry): Remove unused variable
`eh_entry'.
* except.h (expand_fixup_region_start, expand_fixup_region_end):
Add prototypes.
* expr.c (do_jump_by_parts_equality_rtx): Remove prototype.
* expr.h (do_jump_by_parts_equality_rtx): Add prototype.
* fix-header.c: Include stdarg.h/varargs.h, move gansidecl.h
before cpplib.h, include cpphash.h, remove redundant prototype of
cpp_fatal, don't define `const', add a prototype for `fatal'.
(cpp_file_line_for_message): Add missing arguments `pfile'.
(v_cpp_message): New function.
(cpp_message): Use it.
(v_fatal): New function.
(fatal, cpp_fatal): Use it.
(cpp_pfatal_with_name): Constify parameter `name'.
* flow.c (free_regset_vector): Remove redundant prototype.
* function.c (round_down): Wrap prototype and definition with
macro ARGS_GROW_DOWNWARD.
(record_insns): Wrap prototype and definition with
defined (HAVE_prologue) || defined (HAVE_epilogue).
* gansidecl.h (ATTRIBUTE_PRINTF_4, ATTRIBUTE_PRINTF_5): New macros.
* gen-protos.c: Include gansidecl.h.
(hashf): Don't make it static, constify parameter `name'.
* genattrtab.c (check_attr_test): Change XEXP() to XSTR() to match
specifier %s in calls to function `fatal'.
* haifa-sched.c: Include toplev.h.
(find_rgns): Remove unused variable `j'.
* integrate.c (note_modified_parmregs): Mark parameter `x' with
ATTRIBUTE_UNUSED.
(mark_stores): Likewise.
* jump.c (mark_modified_reg): Likewise.
* output.h (insn_current_reference_address): Add prototype.
(eh_frame_section): Likewise.
* print-rtl.c: Include bitmap.h.
* reload1.c (reload): Wrap variables `note' and `next' in macro
PRESERVE_DEATH_INFO_REGNO_P.
(forget_old_reloads_1): Mark parameter `ignored' with
ATTRIBUTE_UNUSED.
(choose_reload_regs): Remove unused variable `in'.
(reload_cse_invalidate_mem): Mark parameter `ignore' with
ATTRIBUTE_UNUSED.
(reload_cse_check_clobber): Likewise.
* rtl.h (expand_null_return, reg_classes_intersect_p): Add prototype.
(mark_elimination): Fix typo in prototype.
* scan-decls.c: Include gansidecl.h.
* tree.h (using_eh_for_cleanups, supports_one_only): Add prototype.
From-SVN: r19867
1998-05-19 08:42:48 +00:00
|
|
|
|
#include "cpplib.h"
|
Makefile.in (LIBCPP_DEPS): New macro.
* Makefile.in (LIBCPP_DEPS): New macro.
(cpplib.o, cpphash.o, cpperror.o, cppexp.o, cppfiles.o): Use
it to declare deps.
* cpperror.c: Include cpphash.h.
* cppexp.c: Include cpphash.h. Remove MULTIBYTE_CHARS
dingleberry.
(lex): Don't use CPP_WARN_UNDEF.
(_cpp_parse_expr): Return an int, the truth value.
* cppfiles.c: Include cpphash.h.
(_cpp_merge_include_chains): Move to cppinit.c and make static.
* cppinit.c (include_defaults_array): Disentangle.
(cpp_cleanup): Don't free the if stack here.
(cpp_finish): Pop off all buffers, not just one.
* cpplib.c (eval_if_expr): Return int.
(do_xifdef): Rename do_ifdef.
(handle_directive): Don't use CPP_PREPROCESSED.
(cpp_get_token): Don't use CPP_C89.
* fix-header.c: Don't use CPP_OPTIONS.
* cpplib.h: Move U_CHAR, enum node_type, struct
file_name_list, struct ihash, is_idchar, is_idstart,
is_numchar, is_numstart, is_hspace, is_space, CPP_BUF_PEEK,
CPP_BUF_GET, CPP_FORWARD, CPP_PUTS, CPP_PUTS_Q, CPP_PUTC,
CPP_PUTC_Q, CPP_NUL_TERMINATE, CPP_NUL_TERMINATE_Q,
CPP_BUMP_BUFFER_LINE, CPP_BUMP_LINE, CPP_PREV_BUFFER,
CPP_PRINT_DEPS, CPP_TRADITIONAL, CPP_PEDANTIC, and prototypes
of _cpp_simplify_pathname, _cpp_find_include_file,
_cpp_read_include_file, and _cpp_parse_expr to cpphash.h.
Move struct if_stack to cpplib.c. Move struct cpp_pending to
cppinit.c.
Change all uses of U_CHAR to be unsigned char instead.
Delete CPP_WARN_UNDEF, CPP_C89, and CPP_PREPROCESSED.
From-SVN: r32435
2000-03-08 23:35:19 +00:00
|
|
|
|
#include "cpphash.h"
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
#ifndef CHAR_TYPE_SIZE
|
|
|
|
|
#define CHAR_TYPE_SIZE BITS_PER_UNIT
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef INT_TYPE_SIZE
|
|
|
|
|
#define INT_TYPE_SIZE BITS_PER_WORD
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef LONG_TYPE_SIZE
|
|
|
|
|
#define LONG_TYPE_SIZE BITS_PER_WORD
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef WCHAR_TYPE_SIZE
|
|
|
|
|
#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MAX_CHAR_TYPE_SIZE
|
|
|
|
|
#define MAX_CHAR_TYPE_SIZE CHAR_TYPE_SIZE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MAX_INT_TYPE_SIZE
|
|
|
|
|
#define MAX_INT_TYPE_SIZE INT_TYPE_SIZE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MAX_LONG_TYPE_SIZE
|
|
|
|
|
#define MAX_LONG_TYPE_SIZE LONG_TYPE_SIZE
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MAX_WCHAR_TYPE_SIZE
|
|
|
|
|
#define MAX_WCHAR_TYPE_SIZE WCHAR_TYPE_SIZE
|
|
|
|
|
#endif
|
|
|
|
|
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
#define MAX_CHAR_TYPE_MASK (MAX_CHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
? (~(~(HOST_WIDEST_INT) 0 << MAX_CHAR_TYPE_SIZE)) \
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
: ~ (HOST_WIDEST_INT) 0)
|
1998-12-07 13:35:20 +00:00
|
|
|
|
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
#define MAX_WCHAR_TYPE_MASK (MAX_WCHAR_TYPE_SIZE < HOST_BITS_PER_WIDEST_INT \
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
? ~(~(HOST_WIDEST_INT) 0 << MAX_WCHAR_TYPE_SIZE) \
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
: ~ (HOST_WIDEST_INT) 0)
|
1998-12-07 13:35:20 +00:00
|
|
|
|
|
1995-03-16 13:59:07 -08:00
|
|
|
|
/* Yield nonzero if adding two numbers with A's and B's signs can yield a
|
|
|
|
|
number with SUM's sign, where A, B, and SUM are all C integers. */
|
|
|
|
|
#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
|
|
|
|
|
|
2000-04-02 22:12:14 +00:00
|
|
|
|
typedef short op_t;
|
|
|
|
|
|
More cutover to system.h:
* Makefile.in (cppalloc.o, cpperror.o, cppexp.o, cpphash.o,
cpplib.o, cppmain.o, fix-header.o, gcov.o, gen-protos.o,
gengenrtl.o, halfpic.o, hash.o, scan-decls.o, scan.o): Depend on
system.h.
* cpphash.c: Include config.h.
* cppalloc.c: Include system.h. Add parameters to various
function prototypes.
* cpperror.c: Likewise.
* cppexp.c: Likewise.
* cpphash.c: Likewise.
* cpplib.c: Likewise.
* cppmain.c: Likewise.
* fix-header.c: Likewise.
* gcov.c: Likewise.
* gen-protos.c: Likewise.
* gengenrtl.c: Likewise.
* halfpic.c: Likewise.
* hash.c: Likewise.
* scan-decls.c: Likewise.
* scan.c: Likewise.
From-SVN: r18911
1998-03-30 12:05:54 +00:00
|
|
|
|
static void integer_overflow PARAMS ((cpp_reader *));
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
static HOST_WIDEST_INT left_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
|
2000-03-07 23:11:06 +00:00
|
|
|
|
unsigned int,
|
|
|
|
|
unsigned HOST_WIDEST_INT));
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
static HOST_WIDEST_INT right_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT,
|
2000-03-07 23:11:06 +00:00
|
|
|
|
unsigned int,
|
|
|
|
|
unsigned HOST_WIDEST_INT));
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
static struct operation parse_number PARAMS ((cpp_reader *, U_CHAR *,
|
|
|
|
|
U_CHAR *));
|
|
|
|
|
static struct operation parse_charconst PARAMS ((cpp_reader *, U_CHAR *,
|
|
|
|
|
U_CHAR *));
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
static struct operation parse_defined PARAMS ((cpp_reader *));
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
static HOST_WIDEST_INT parse_escape PARAMS ((cpp_reader *, U_CHAR **,
|
|
|
|
|
HOST_WIDEST_INT));
|
|
|
|
|
static struct operation lex PARAMS ((cpp_reader *, int));
|
2000-04-02 22:12:14 +00:00
|
|
|
|
static const char * op_to_str PARAMS ((op_t));
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
#define ERROR 299
|
|
|
|
|
#define OROR 300
|
|
|
|
|
#define ANDAND 301
|
|
|
|
|
#define EQUAL 302
|
|
|
|
|
#define NOTEQUAL 303
|
|
|
|
|
#define LEQ 304
|
|
|
|
|
#define GEQ 305
|
|
|
|
|
#define LSH 306
|
|
|
|
|
#define RSH 307
|
|
|
|
|
#define NAME 308
|
|
|
|
|
#define INT 309
|
|
|
|
|
#define CHAR 310
|
2000-04-02 08:27:23 +00:00
|
|
|
|
#define FINISHED 311
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
struct operation
|
|
|
|
|
{
|
2000-04-02 22:12:14 +00:00
|
|
|
|
op_t op;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
U_CHAR prio; /* Priority of op. */
|
2000-03-07 23:11:06 +00:00
|
|
|
|
U_CHAR flags;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
U_CHAR unsignedp; /* True if value should be treated as unsigned. */
|
|
|
|
|
HOST_WIDEST_INT value; /* The value logically "right" of op. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
};
|
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
/* Parse and convert an integer for #if. Accepts decimal, hex, or octal
|
|
|
|
|
with or without size suffixes. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
static struct operation
|
|
|
|
|
parse_number (pfile, start, end)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
cpp_reader *pfile;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
U_CHAR *start;
|
|
|
|
|
U_CHAR *end;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
|
|
|
|
struct operation op;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
U_CHAR *p = start;
|
|
|
|
|
int c;
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
unsigned HOST_WIDEST_INT n = 0, nd, MAX_over_base;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
int base = 10;
|
|
|
|
|
int overflow = 0;
|
|
|
|
|
int digit, largest_digit = 0;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
int spec_long = 0;
|
|
|
|
|
|
|
|
|
|
op.unsignedp = 0;
|
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
if (p[0] == '0')
|
|
|
|
|
{
|
|
|
|
|
if (end - start >= 3 && (p[1] == 'x' || p[1] == 'X'))
|
|
|
|
|
{
|
|
|
|
|
p += 2;
|
|
|
|
|
base = 16;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
p += 1;
|
|
|
|
|
base = 8;
|
|
|
|
|
}
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
1996-07-03 22:07:53 +00:00
|
|
|
|
/* Some buggy compilers (e.g. MPW C) seem to need both casts. */
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
MAX_over_base = (((unsigned HOST_WIDEST_INT) -1)
|
|
|
|
|
/ ((unsigned HOST_WIDEST_INT) base));
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
while (p < end)
|
|
|
|
|
{
|
|
|
|
|
c = *p++;
|
|
|
|
|
|
|
|
|
|
if (c >= '0' && c <= '9')
|
|
|
|
|
digit = c - '0';
|
|
|
|
|
else if (base == 16 && c >= 'a' && c <= 'f') /* FIXME: assumes ASCII */
|
|
|
|
|
digit = c - 'a' + 10;
|
|
|
|
|
else if (base == 16 && c >= 'A' && c <= 'F')
|
|
|
|
|
digit = c - 'A' + 10;
|
|
|
|
|
else if (c == '.')
|
|
|
|
|
{
|
|
|
|
|
/* It's a float since it contains a point. */
|
|
|
|
|
cpp_error (pfile,
|
|
|
|
|
"floating point numbers are not allowed in #if expressions");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* `l' means long, and `u' means unsigned. */
|
|
|
|
|
for (;;)
|
|
|
|
|
{
|
|
|
|
|
if (c == 'l' || c == 'L')
|
|
|
|
|
spec_long++;
|
|
|
|
|
else if (c == 'u' || c == 'U')
|
|
|
|
|
op.unsignedp++;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Decrement p here so that the error for an invalid number
|
|
|
|
|
will be generated below in the case where this is the
|
|
|
|
|
last character in the buffer. */
|
|
|
|
|
p--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (p == end)
|
|
|
|
|
break;
|
|
|
|
|
c = *p++;
|
|
|
|
|
}
|
|
|
|
|
/* Don't look for any more digits after the suffixes. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
break;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (largest_digit < digit)
|
|
|
|
|
largest_digit = digit;
|
|
|
|
|
nd = n * base + digit;
|
|
|
|
|
overflow |= MAX_over_base < n || nd < n;
|
|
|
|
|
n = nd;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
if (p != end)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
1999-01-25 11:28:11 +00:00
|
|
|
|
cpp_error (pfile, "invalid number in #if expression");
|
|
|
|
|
goto error;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
cpplib.h: Merge struct cpp_options into struct cpp_reader.
* cpplib.h: Merge struct cpp_options into struct cpp_reader.
Reorder struct cpp_options and struct cpp_reader for better
packing. Replace CPP_OPTIONS macro with CPP_OPTION which
takes two args. Change all 'char' flags to 'unsigned char'.
Move show_column flag into struct cpp_options. Don't
prototype cpp_options_init.
* cpphash.h, cpperror.c, cppexp.c, cppfiles.c, cpphash.c,
cppinit.c, cpplex.c, cpplib.c:
Replace CPP_OPTIONS (pfile)->whatever with
CPP_OPTION (pfile, whatever), and likewise for
opts = CPP_OPTIONS (pfile); ... opts->whatever;
* cppinit.c (merge_include_chains): Take a cpp_reader *.
Extract CPP_OPTION (pfile, pending) and work with that
directly.
(cpp_options_init): Delete.
(cpp_reader_init): Turn on on-by-default options here.
Allocate the pending structure here.
(cl_options, enum opt_code): Define these from the same table,
kept in a large macro. Add -fshow-column and -fno-show-column
options.
* cpperror.c (v_message): If show_column is off, don't print
the column number.
* cppmain.c: Update for new interface.
* fix-header.c: Likewise.
From-SVN: r32850
2000-03-31 23:16:11 +00:00
|
|
|
|
else if (spec_long > (CPP_OPTION (pfile, c89) ? 1 : 2))
|
1999-01-25 11:28:11 +00:00
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "too many `l' suffixes in integer constant");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
else if (op.unsignedp > 1)
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "too many `u' suffixes in integer constant");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
|
1995-03-16 13:59:07 -08:00
|
|
|
|
if (base <= largest_digit)
|
1997-03-17 17:08:27 -05:00
|
|
|
|
cpp_pedwarn (pfile, "integer constant contains digits beyond the radix");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
if (overflow)
|
1997-03-17 17:08:27 -05:00
|
|
|
|
cpp_pedwarn (pfile, "integer constant out of range");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
/* If too big to be signed, consider it unsigned. */
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
else if ((HOST_WIDEST_INT) n < 0 && ! op.unsignedp)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
|
|
|
|
if (base == 10)
|
1999-01-25 11:28:11 +00:00
|
|
|
|
cpp_warning (pfile,
|
|
|
|
|
"integer constant is so large that it is unsigned");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
op.unsignedp = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
op.value = n;
|
|
|
|
|
op.op = INT;
|
|
|
|
|
return op;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
op.op = ERROR;
|
|
|
|
|
return op;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
/* Parse and convert a character constant for #if. Understands backslash
|
|
|
|
|
escapes (\n, \031) and multibyte characters (if so configured). */
|
|
|
|
|
static struct operation
|
|
|
|
|
parse_charconst (pfile, start, end)
|
|
|
|
|
cpp_reader *pfile;
|
|
|
|
|
U_CHAR *start;
|
|
|
|
|
U_CHAR *end;
|
|
|
|
|
{
|
|
|
|
|
struct operation op;
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
HOST_WIDEST_INT result = 0;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
int num_chars = 0;
|
|
|
|
|
int num_bits;
|
|
|
|
|
unsigned int width = MAX_CHAR_TYPE_SIZE, mask = MAX_CHAR_TYPE_MASK;
|
|
|
|
|
int max_chars;
|
|
|
|
|
U_CHAR *ptr = start;
|
|
|
|
|
|
1999-04-06 10:04:10 +00:00
|
|
|
|
int c = -1;
|
1999-01-25 11:28:11 +00:00
|
|
|
|
|
|
|
|
|
if (*ptr == 'L')
|
|
|
|
|
{
|
|
|
|
|
++ptr;
|
|
|
|
|
width = MAX_WCHAR_TYPE_SIZE, mask = MAX_WCHAR_TYPE_MASK;
|
|
|
|
|
}
|
|
|
|
|
max_chars = MAX_LONG_TYPE_SIZE / width;
|
|
|
|
|
|
|
|
|
|
++ptr; /* skip initial quote */
|
|
|
|
|
|
|
|
|
|
while (ptr < end)
|
|
|
|
|
{
|
|
|
|
|
c = *ptr++;
|
|
|
|
|
if (c == '\'' || c == '\0')
|
|
|
|
|
break;
|
|
|
|
|
else if (c == '\\')
|
|
|
|
|
{
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
c = parse_escape (pfile, &ptr, mask);
|
1999-01-25 11:28:11 +00:00
|
|
|
|
if (width < HOST_BITS_PER_INT
|
|
|
|
|
&& (unsigned int) c >= (unsigned int)(1 << width))
|
|
|
|
|
cpp_pedwarn (pfile, "escape sequence out of range for character");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Merge character into result; ignore excess chars. */
|
|
|
|
|
if (++num_chars <= max_chars)
|
|
|
|
|
{
|
|
|
|
|
if (width < HOST_BITS_PER_INT)
|
|
|
|
|
result = (result << width) | (c & ((1 << width) - 1));
|
|
|
|
|
else
|
|
|
|
|
result = c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (num_chars == 0)
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "empty character constant");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
else if (c != '\'')
|
|
|
|
|
{
|
|
|
|
|
/* cpp_get_token has already emitted an error if !traditional. */
|
|
|
|
|
if (! CPP_TRADITIONAL (pfile))
|
|
|
|
|
cpp_error (pfile, "malformatted character constant");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
else if (num_chars > max_chars)
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "character constant too long");
|
|
|
|
|
goto error;
|
|
|
|
|
}
|
|
|
|
|
else if (num_chars != 1 && ! CPP_TRADITIONAL (pfile))
|
|
|
|
|
cpp_warning (pfile, "multi-character character constant");
|
|
|
|
|
|
|
|
|
|
/* If char type is signed, sign-extend the constant. */
|
|
|
|
|
num_bits = num_chars * width;
|
|
|
|
|
|
2000-02-10 23:47:04 +00:00
|
|
|
|
if (cpp_defined (pfile, (const U_CHAR *)"__CHAR_UNSIGNED__",
|
|
|
|
|
sizeof ("__CHAR_UNSIGNED__")-1)
|
1999-01-25 11:28:11 +00:00
|
|
|
|
|| ((result >> (num_bits - 1)) & 1) == 0)
|
1999-02-25 20:48:42 +00:00
|
|
|
|
op.value = result & ((unsigned HOST_WIDEST_INT) ~0
|
|
|
|
|
>> (HOST_BITS_PER_WIDEST_INT - num_bits));
|
1999-01-25 11:28:11 +00:00
|
|
|
|
else
|
1999-02-25 20:48:42 +00:00
|
|
|
|
op.value = result | ~((unsigned HOST_WIDEST_INT) ~0
|
|
|
|
|
>> (HOST_BITS_PER_WIDEST_INT - num_bits));
|
1999-01-25 11:28:11 +00:00
|
|
|
|
|
|
|
|
|
/* This is always a signed type. */
|
|
|
|
|
op.unsignedp = 0;
|
|
|
|
|
op.op = CHAR;
|
|
|
|
|
return op;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
op.op = ERROR;
|
|
|
|
|
return op;
|
|
|
|
|
}
|
|
|
|
|
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
static struct operation
|
|
|
|
|
parse_defined (pfile)
|
|
|
|
|
cpp_reader *pfile;
|
|
|
|
|
{
|
|
|
|
|
int paren = 0, len;
|
|
|
|
|
U_CHAR *tok;
|
|
|
|
|
enum cpp_token token;
|
|
|
|
|
struct operation op;
|
|
|
|
|
long old_written = CPP_WRITTEN (pfile);
|
|
|
|
|
|
|
|
|
|
op.unsignedp = 0;
|
|
|
|
|
op.op = INT;
|
|
|
|
|
|
|
|
|
|
pfile->no_macro_expand++;
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
token = _cpp_get_directive_token (pfile);
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
if (token == CPP_LPAREN)
|
|
|
|
|
{
|
|
|
|
|
paren++;
|
|
|
|
|
CPP_SET_WRITTEN (pfile, old_written);
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
token = _cpp_get_directive_token (pfile);
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (token != CPP_NAME)
|
|
|
|
|
goto oops;
|
|
|
|
|
|
|
|
|
|
tok = pfile->token_buffer + old_written;
|
|
|
|
|
len = CPP_PWRITTEN (pfile) - tok;
|
|
|
|
|
op.value = cpp_defined (pfile, tok, len);
|
|
|
|
|
|
|
|
|
|
if (paren)
|
|
|
|
|
{
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
if (_cpp_get_directive_token (pfile) != CPP_RPAREN)
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
goto oops;
|
|
|
|
|
}
|
|
|
|
|
CPP_SET_WRITTEN (pfile, old_written);
|
|
|
|
|
pfile->no_macro_expand--;
|
|
|
|
|
return op;
|
|
|
|
|
|
|
|
|
|
oops:
|
|
|
|
|
CPP_SET_WRITTEN (pfile, old_written);
|
|
|
|
|
pfile->no_macro_expand--;
|
|
|
|
|
cpp_error (pfile, "`defined' without an identifier");
|
|
|
|
|
|
|
|
|
|
op.op = ERROR;
|
|
|
|
|
return op;
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-02 22:12:14 +00:00
|
|
|
|
struct token
|
|
|
|
|
{
|
cpperror.c (cpp_file_line_for_message): Constify a char*.
* cpperror.c (cpp_file_line_for_message): Constify a char*.
* cppexp.c (parse_number, parse_charconst, cpp_lex,
cpp_parse_expr): Add static prototypes.
(parse_charconst): Don't cast away const-ness.
(token): Constify a char*.
* cppfiles.c (file_name_list, include_hash, find_include_file,
finclude, initialize_input_buffer): Constify a char*.
(file_cleanup, find_position): Add static prototypes.
* cpphash.c (macro_cleanup, macarg, timestamp, special_symbol,
collect_expansion): Add static prototypes.
(cpp_install, create_definition, monthnames): Constify a char*.
* cpphash.h (cpp_install): Likewise.
* cppinit.c (known_suffixes, default_include,
dump_special_to_buffer, NAME, cpp_start_read, cpp_finish): Likewise.
(base_name, dump_special_to_buffer, initialize_dependency_output):
Add static prototypes.
* cpplib.c (my_strerror): Constify a char*.
(null_underflow, null_cleanup, skip_comment, copy_comment,
copy_rest_of_line, handle_directive, pass_thru_directive,
get_directive_token, read_line_number, cpp_print_file_and_line,
v_cpp_error, v_cpp_warning, v_cpp_error_with_line,
v_cpp_warning_with_line, detect_if_not_defined,
consider_directive_while_skipping): Add static prototypes.
(pass_thru_directive, check_macro_name, cpp_expand_to_buffer,
cpp_pedwarn_with_file_and_line): Constify a char*.
* cpplib.h (cpp_options, include_hash, progname, definition,
cpp_pedwarn_with_file_and_line, cpp_expand_to_buffer,
check_macro_name, cpp_pfatal_with_name, cpp_file_line_for_message,
find_include_file, deps_output, include_hash): Constify a char*.
* cppmain.c (progname): Constify.
(main): Add prototype. Use return, not exit.
* fix-header.c (fatal, add_symbols, lookup_std_proto, write_lbrac,
recognized_macro, check_macro_names, read_scan_file, write_rbrac,
inf_skip_spaces, inf_read_upto, inf_scan_ident, inf_scan_ident,
check_protection): Add static prototype.
(xfree): Remove.
(progname, recognized_macrom, recognized_extern): Constify a char*.
(main): Add prototype.
* gen-protos.c (progname): Constify a char*.
From-SVN: r29171
1999-09-07 15:41:26 +00:00
|
|
|
|
const char *operator;
|
2000-04-02 22:12:14 +00:00
|
|
|
|
op_t token;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
};
|
|
|
|
|
|
2000-04-02 22:12:14 +00:00
|
|
|
|
static const struct token tokentab2[] =
|
|
|
|
|
{
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{"&&", ANDAND},
|
|
|
|
|
{"||", OROR},
|
|
|
|
|
{"<<", LSH},
|
|
|
|
|
{">>", RSH},
|
|
|
|
|
{"==", EQUAL},
|
|
|
|
|
{"!=", NOTEQUAL},
|
|
|
|
|
{"<=", LEQ},
|
|
|
|
|
{">=", GEQ},
|
|
|
|
|
{"++", ERROR},
|
|
|
|
|
{"--", ERROR},
|
|
|
|
|
{NULL, ERROR}
|
|
|
|
|
};
|
|
|
|
|
|
1996-07-03 22:07:53 +00:00
|
|
|
|
/* Read one token. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
cpplib.c: Kill define of STDC_VALUE.
1999-02-18 18:32 -0500 Zack Weinberg <zack@rabi.columbia.edu>
* cpplib.c: Kill define of STDC_VALUE. Don't include output.h
or prefix.h. Change CPP_IS_MACRO_BUFFER to not refer to
macro_cleanup.
(GET_ENV_PATH_LIST, PATH_SEPARATOR, STANDARD_INCLUDE_DIR,
predefs, SIZE_TYPE, PTRDIFF_TYPE, WCHAR_TYPE,
CPP_WCHAR_TYPE, USER_LABEL_PREFIX, REGISTER_PREFIX, struct
cpp_pending, version_string, struct default_include,
include_defaults_array, path_include, cpp_options_init,
dump_special_to_buffer, initialize_builtins, cpp_start_read,
cpp_reader_init, nreverse_pending, push_pending, print_help,
cpp_handle_option, cpp_handle_options, cpp_finish,
cpp_cleanup): Move to cppinit.c.
(macro_cleanup, struct arglist, collect_expansion,
create_definition, compare_defs, comp_def_part, ARG_BASE,
struct argdata, macarg, change_newlines, timestamp,
monthnames, special_symbol, unsafe_chars, macroexpand,
push_macro_expansion): Move to cpphash.c.
(quote_string, check_macro_name, cpp_expand_to_buffer,
output_line_command, cpp_undef): Export.
(null_underflow, null_cleanup, handle_directive): Make static.
* cpplib.h: Prototype now-exported functions. Adjust decls of
syntax tables so we can include cpplib.h in cppinit.c.
* cpphash.h: Prototype all functions exported by cpphash.c.
* cppinit.c: Make syntax tables initialized data if possible
(uses GCC designated-initializer extension).
* cppexp.c: Make cpp_lex static.
* Makefile.in: Move -D switches for the various include dirs
from cpplib.o rule to cppinit.o rule. Adjust dependencies.
From-SVN: r25287
1999-02-18 15:35:49 +00:00
|
|
|
|
static struct operation
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
lex (pfile, skip_evaluation)
|
1996-01-22 15:40:12 -08:00
|
|
|
|
cpp_reader *pfile;
|
1997-04-13 12:50:58 -04:00
|
|
|
|
int skip_evaluation;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-03-04 01:42:56 +00:00
|
|
|
|
const struct token *toktab;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
enum cpp_token token;
|
|
|
|
|
struct operation op;
|
|
|
|
|
U_CHAR *tok_start, *tok_end;
|
2000-02-10 23:47:04 +00:00
|
|
|
|
long old_written;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
1995-05-15 13:42:04 -07:00
|
|
|
|
old_written = CPP_WRITTEN (pfile);
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
token = _cpp_get_directive_token (pfile);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
tok_start = pfile->token_buffer + old_written;
|
|
|
|
|
tok_end = CPP_PWRITTEN (pfile);
|
2000-02-10 23:47:04 +00:00
|
|
|
|
CPP_SET_WRITTEN (pfile, old_written);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
switch (token)
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
{
|
1996-07-03 22:07:53 +00:00
|
|
|
|
case CPP_EOF: /* Should not happen ... */
|
1996-01-16 15:46:59 -08:00
|
|
|
|
case CPP_VSPACE:
|
1995-03-16 13:59:07 -08:00
|
|
|
|
op.op = 0;
|
|
|
|
|
return op;
|
|
|
|
|
case CPP_NUMBER:
|
1999-01-25 11:28:11 +00:00
|
|
|
|
return parse_number (pfile, tok_start, tok_end);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case CPP_STRING:
|
2000-02-23 19:21:07 +00:00
|
|
|
|
case CPP_WSTRING:
|
2000-02-10 23:47:04 +00:00
|
|
|
|
cpp_error (pfile, "string constants are not allowed in #if expressions");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
op.op = ERROR;
|
|
|
|
|
return op;
|
2000-02-23 19:21:07 +00:00
|
|
|
|
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case CPP_CHAR:
|
2000-02-23 19:21:07 +00:00
|
|
|
|
case CPP_WCHAR:
|
1999-01-25 11:28:11 +00:00
|
|
|
|
return parse_charconst (pfile, tok_start, tok_end);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
case CPP_NAME:
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
if (!strcmp (tok_start, "defined"))
|
|
|
|
|
return parse_defined (pfile);
|
|
|
|
|
|
1999-01-25 11:28:11 +00:00
|
|
|
|
op.op = INT;
|
|
|
|
|
op.unsignedp = 0;
|
|
|
|
|
op.value = 0;
|
1999-02-08 20:27:27 +00:00
|
|
|
|
|
cpplib.h: Merge struct cpp_options into struct cpp_reader.
* cpplib.h: Merge struct cpp_options into struct cpp_reader.
Reorder struct cpp_options and struct cpp_reader for better
packing. Replace CPP_OPTIONS macro with CPP_OPTION which
takes two args. Change all 'char' flags to 'unsigned char'.
Move show_column flag into struct cpp_options. Don't
prototype cpp_options_init.
* cpphash.h, cpperror.c, cppexp.c, cppfiles.c, cpphash.c,
cppinit.c, cpplex.c, cpplib.c:
Replace CPP_OPTIONS (pfile)->whatever with
CPP_OPTION (pfile, whatever), and likewise for
opts = CPP_OPTIONS (pfile); ... opts->whatever;
* cppinit.c (merge_include_chains): Take a cpp_reader *.
Extract CPP_OPTION (pfile, pending) and work with that
directly.
(cpp_options_init): Delete.
(cpp_reader_init): Turn on on-by-default options here.
Allocate the pending structure here.
(cl_options, enum opt_code): Define these from the same table,
kept in a large macro. Add -fshow-column and -fno-show-column
options.
* cpperror.c (v_message): If show_column is off, don't print
the column number.
* cppmain.c: Update for new interface.
* fix-header.c: Likewise.
From-SVN: r32850
2000-03-31 23:16:11 +00:00
|
|
|
|
if (CPP_OPTION (pfile, warn_undef) && !skip_evaluation)
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
cpp_warning (pfile, "`%.*s' is not defined",
|
|
|
|
|
(int) (tok_end - tok_start), tok_start);
|
1999-02-08 20:27:27 +00:00
|
|
|
|
return op;
|
|
|
|
|
|
cpplib.h (CPP_ASSERTION, [...]): New token types.
* cpplib.h (CPP_ASSERTION, CPP_STRINGIZE, CPP_TOKPASTE): New
token types.
(struct cpp_reader): Add parsing_if_directive and
parsing_define_directive flags.
(struct cpp_options): Remove output_conditionals flag.
(check_macro_name): Delete prototype.
* cpphash.h (struct macrodef): Delete.
(struct reflist): Separate from struct definition.
(struct definition): Remove unused fields. Add column number.
(create_definition): Returns a DEFINITION *. Takes a
cpp_reader * and an int.
* cpphash.c (SKIP_WHITE_SPACE): Delete.
(PEEKC): Copy defn from cpplib.c.
(rest_extension, REST_EXTENSION_LENGTH): Delete.
(struct arg): New.
(struct arglist): Simplify.
(collect_expansion): Rewrite. Get tokens by calling
cpp_get_token. Add more error checking.
(collect_formal_parameters): New function, broken out of
create_definition and reworked to use get_directive_token.
(create_definition): All real work is now in collect_expansion
and collect_formal_parameters. do_define handles finding the
macro name. Return a DEFINITION, not a MACRODEF.
(macroexpand): Replace bcopy with memcpy throughout. Replace
character-at-a-time copy loop with memcpy and pointer increments.
(compare-defs): d1->argnames / d2->argnames might be null.
* cpplib.c (copy_rest_of_line): Delete function.
(skip_rest_of_line): Do all the work ourselves.
(skip_string): New function.
(parse_string): Use skip_string.
(get_macro_name): New function.
(check_macro_name): Delete.
(copy_comment): Use CPP_RESERVE and CPP_PUTC_Q.
(cpp_skip_hspace): Use CPP_BUMP_LINE.
(handle_directive): ICE if we're called on a macro buffer.
(do_define): Determine macro name and type (funlike/objlike)
here. Expunge all uses of MACRODEF.
(cpp_push_buffer): Set line_base to NULL.
(do_undef, read_line_number): Don't worry about getting a POP token.
(eval_if_expression): Set/reset parsing_if_directive around
cpp_parse_expr. Don't clear only_seen_white.
(skip_if_group): Remove output_conditionals logic. Use
skip_rest_of_line.
(cpp_get_token): Return ASSERTION, STRINGIZE, and TOKPASTE
tokens under appropriate conditions.
(cpp_unassert): Call do_unassert not do_assert. Oops.
* cppexp.c (parse_defined): New function, break out of
cpp_lex.
(cpp_lex): We now get CPP_ASSERTION tokens and can check them
ourselves, with cpp_defined.
* cppinit.c (cpp_handle_option, print_help): Delete -ifoutput.
* gcc.dg/20000209-2.c: Turn off -pedantic-errors.
* gcc.dg/strpaste-2.c: New.
From-SVN: r32274
2000-03-01 00:57:09 +00:00
|
|
|
|
case CPP_ASSERTION:
|
|
|
|
|
op.op = INT;
|
|
|
|
|
op.unsignedp = 0;
|
|
|
|
|
op.value = cpp_defined (pfile, tok_start, tok_end - tok_start);
|
1999-01-25 11:28:11 +00:00
|
|
|
|
return op;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
case CPP_OTHER:
|
|
|
|
|
/* See if it is a special token of length 2. */
|
|
|
|
|
if (tok_start + 2 == tok_end)
|
|
|
|
|
{
|
|
|
|
|
for (toktab = tokentab2; toktab->operator != NULL; toktab++)
|
|
|
|
|
if (tok_start[0] == toktab->operator[0]
|
|
|
|
|
&& tok_start[1] == toktab->operator[1])
|
|
|
|
|
break;
|
|
|
|
|
if (toktab->token == ERROR)
|
1999-01-27 01:43:17 +00:00
|
|
|
|
cpp_error (pfile, "`%s' not allowed in operand of `#if'",
|
|
|
|
|
tok_start);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
op.op = toktab->token;
|
|
|
|
|
return op;
|
|
|
|
|
}
|
|
|
|
|
/* fall through */
|
|
|
|
|
default:
|
|
|
|
|
op.op = *tok_start;
|
|
|
|
|
return op;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-02 22:12:14 +00:00
|
|
|
|
/* Convert an operator ID to a string. */
|
|
|
|
|
static const char *
|
|
|
|
|
op_to_str (op)
|
|
|
|
|
op_t op;
|
|
|
|
|
{
|
|
|
|
|
static char str[5]; /* XXX static variable. */
|
|
|
|
|
const struct token *toktab;
|
|
|
|
|
|
|
|
|
|
/* See if it is a special token of length 2. */
|
|
|
|
|
for (toktab = tokentab2; toktab->operator != NULL; toktab++)
|
|
|
|
|
if (op == toktab->token)
|
|
|
|
|
return toktab->operator;
|
|
|
|
|
|
|
|
|
|
if (ISGRAPH (op))
|
|
|
|
|
sprintf (str, "%c", (int) op);
|
|
|
|
|
else
|
|
|
|
|
sprintf (str, "\\%03o", (int) op);
|
|
|
|
|
return str;
|
|
|
|
|
}
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
/* Parse a C escape sequence. STRING_PTR points to a variable
|
|
|
|
|
containing a pointer to the string to parse. That pointer
|
|
|
|
|
is updated past the characters we use. The value of the
|
|
|
|
|
escape sequence is returned.
|
|
|
|
|
|
|
|
|
|
A negative value means the sequence \ newline was seen,
|
|
|
|
|
which is supposed to be equivalent to nothing at all.
|
|
|
|
|
|
|
|
|
|
If \ is followed by a null character, we return a negative
|
|
|
|
|
value and leave the string pointer pointing at the null character.
|
|
|
|
|
|
|
|
|
|
If \ is followed by 000, we return 0 and leave the string pointer
|
|
|
|
|
after the zeros. A value of 0 does not mean end of string. */
|
|
|
|
|
|
1999-10-15 18:18:46 +00:00
|
|
|
|
static HOST_WIDEST_INT
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
parse_escape (pfile, string_ptr, result_mask)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
cpp_reader *pfile;
|
1999-10-15 18:18:46 +00:00
|
|
|
|
U_CHAR **string_ptr;
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
HOST_WIDEST_INT result_mask;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
|
|
|
|
register int c = *(*string_ptr)++;
|
|
|
|
|
switch (c)
|
|
|
|
|
{
|
|
|
|
|
case 'a':
|
|
|
|
|
return TARGET_BELL;
|
|
|
|
|
case 'b':
|
|
|
|
|
return TARGET_BS;
|
|
|
|
|
case 'e':
|
|
|
|
|
case 'E':
|
cpplib.h: Merge struct cpp_options into struct cpp_reader.
* cpplib.h: Merge struct cpp_options into struct cpp_reader.
Reorder struct cpp_options and struct cpp_reader for better
packing. Replace CPP_OPTIONS macro with CPP_OPTION which
takes two args. Change all 'char' flags to 'unsigned char'.
Move show_column flag into struct cpp_options. Don't
prototype cpp_options_init.
* cpphash.h, cpperror.c, cppexp.c, cppfiles.c, cpphash.c,
cppinit.c, cpplex.c, cpplib.c:
Replace CPP_OPTIONS (pfile)->whatever with
CPP_OPTION (pfile, whatever), and likewise for
opts = CPP_OPTIONS (pfile); ... opts->whatever;
* cppinit.c (merge_include_chains): Take a cpp_reader *.
Extract CPP_OPTION (pfile, pending) and work with that
directly.
(cpp_options_init): Delete.
(cpp_reader_init): Turn on on-by-default options here.
Allocate the pending structure here.
(cl_options, enum opt_code): Define these from the same table,
kept in a large macro. Add -fshow-column and -fno-show-column
options.
* cpperror.c (v_message): If show_column is off, don't print
the column number.
* cppmain.c: Update for new interface.
* fix-header.c: Likewise.
From-SVN: r32850
2000-03-31 23:16:11 +00:00
|
|
|
|
if (CPP_PEDANTIC (pfile))
|
1995-03-16 13:59:07 -08:00
|
|
|
|
cpp_pedwarn (pfile, "non-ANSI-standard escape sequence, `\\%c'", c);
|
Linas Vepstas <linas@linas.org>
* c-common.c: Use ISGRAPH, ISLOWER, toupper.
* c-lex.c, cccp.c, cexp.c, cexp.y, cppexp.c, dwarf2out.c, genattr.c,
genattrtab.c, genemit.c, genextract.c, genpeep.c, tree.c: Likewise.
* system.h (IN_CTYPE_DOMAIN): Define to 1 if HOST_EBCDIC.
* defaults.h (TARGET_ESC): Add default.
From-SVN: r29192
1999-09-08 06:51:23 +00:00
|
|
|
|
return TARGET_ESC;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case 'f':
|
|
|
|
|
return TARGET_FF;
|
|
|
|
|
case 'n':
|
|
|
|
|
return TARGET_NEWLINE;
|
|
|
|
|
case 'r':
|
|
|
|
|
return TARGET_CR;
|
|
|
|
|
case 't':
|
|
|
|
|
return TARGET_TAB;
|
|
|
|
|
case 'v':
|
|
|
|
|
return TARGET_VT;
|
|
|
|
|
case '\n':
|
|
|
|
|
return -2;
|
|
|
|
|
case 0:
|
|
|
|
|
(*string_ptr)--;
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
case '0':
|
|
|
|
|
case '1':
|
|
|
|
|
case '2':
|
|
|
|
|
case '3':
|
|
|
|
|
case '4':
|
|
|
|
|
case '5':
|
|
|
|
|
case '6':
|
|
|
|
|
case '7':
|
|
|
|
|
{
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
register HOST_WIDEST_INT i = c - '0';
|
1995-03-16 13:59:07 -08:00
|
|
|
|
register int count = 0;
|
|
|
|
|
while (++count < 3)
|
|
|
|
|
{
|
|
|
|
|
c = *(*string_ptr)++;
|
|
|
|
|
if (c >= '0' && c <= '7')
|
|
|
|
|
i = (i << 3) + c - '0';
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
(*string_ptr)--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
1998-12-07 13:35:20 +00:00
|
|
|
|
if (i != (i & result_mask))
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
1998-12-07 13:35:20 +00:00
|
|
|
|
i &= result_mask;
|
|
|
|
|
cpp_pedwarn (pfile, "octal escape sequence out of range");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
case 'x':
|
|
|
|
|
{
|
Makefile.in (cppmain.o, [...]): Don't depend on machmode.h.
* Makefile.in (cppmain.o, cpplib.o, cpphash.o, cppalloc.o,
cpperror.o, cppexp.o, cppfiles.o, cppinit.o, fix-header.o,
scan-decls.o): Don't depend on machmode.h.
* cppexp.c: Don't define CHAR_BIT or HOST_BITS_PER_WIDE_INT anymore.
Replace all instances of HOST_WIDE_INT with HOST_WIDEST_INT.
* cppfiles.c: Likewise.
* cpplib.c: Likewise.
* cpplib.h: Likewise. Also don't include machmode.h anymore.
From-SVN: r25446
1999-02-25 20:40:21 +00:00
|
|
|
|
register unsigned HOST_WIDEST_INT i = 0, overflow = 0;
|
1998-12-07 13:35:20 +00:00
|
|
|
|
register int digits_found = 0, digit;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
for (;;)
|
|
|
|
|
{
|
|
|
|
|
c = *(*string_ptr)++;
|
|
|
|
|
if (c >= '0' && c <= '9')
|
|
|
|
|
digit = c - '0';
|
|
|
|
|
else if (c >= 'a' && c <= 'f')
|
|
|
|
|
digit = c - 'a' + 10;
|
|
|
|
|
else if (c >= 'A' && c <= 'F')
|
|
|
|
|
digit = c - 'A' + 10;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
(*string_ptr)--;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
overflow |= i ^ (i << 4 >> 4);
|
|
|
|
|
i = (i << 4) + digit;
|
|
|
|
|
digits_found = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!digits_found)
|
|
|
|
|
cpp_error (pfile, "\\x used with no following hex digits");
|
1998-12-07 13:35:20 +00:00
|
|
|
|
if (overflow | (i != (i & result_mask)))
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
1998-12-07 13:35:20 +00:00
|
|
|
|
i &= result_mask;
|
|
|
|
|
cpp_pedwarn (pfile, "hex escape sequence out of range");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
return c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
integer_overflow (pfile)
|
|
|
|
|
cpp_reader *pfile;
|
|
|
|
|
{
|
|
|
|
|
if (CPP_PEDANTIC (pfile))
|
|
|
|
|
cpp_pedwarn (pfile, "integer overflow in preprocessor expression");
|
|
|
|
|
}
|
|
|
|
|
|
1999-02-25 20:48:42 +00:00
|
|
|
|
static HOST_WIDEST_INT
|
1995-03-16 13:59:07 -08:00
|
|
|
|
left_shift (pfile, a, unsignedp, b)
|
|
|
|
|
cpp_reader *pfile;
|
1999-02-25 20:48:42 +00:00
|
|
|
|
HOST_WIDEST_INT a;
|
2000-03-07 23:11:06 +00:00
|
|
|
|
unsigned int unsignedp;
|
1999-02-25 20:48:42 +00:00
|
|
|
|
unsigned HOST_WIDEST_INT b;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
1999-02-25 20:48:42 +00:00
|
|
|
|
if (b >= HOST_BITS_PER_WIDEST_INT)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
|
|
|
|
if (! unsignedp && a != 0)
|
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else if (unsignedp)
|
1999-02-25 20:48:42 +00:00
|
|
|
|
return (unsigned HOST_WIDEST_INT) a << b;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
else
|
|
|
|
|
{
|
1999-02-25 20:48:42 +00:00
|
|
|
|
HOST_WIDEST_INT l = a << b;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
if (l >> b != a)
|
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
return l;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1999-02-25 20:48:42 +00:00
|
|
|
|
static HOST_WIDEST_INT
|
1995-03-16 13:59:07 -08:00
|
|
|
|
right_shift (pfile, a, unsignedp, b)
|
Warning fixes:
* Makefile.in (c-lang.o): Depend on c-tree.h, c-lex.h and toplev.h.
(c-lex.o): Depend on output.h.
(c-common.o): Likewise.
(stmt.o): Likewise.
(calls.o): Likewise.
(integrate.o): Depend on toplev.h.
(regclass.o): Depend on output.h.
(final.o): Depend on reload.h.
* c-common.c: Include output.h.
(check_format_info): Remove unused variable `integral_format'.
* c-decl.c (print_lang_decl): Mark parameters `file', `node' and
`indent' with ATTRIBUTE_UNUSED.
(print_lang_type): Likewise.
(maybe_build_cleanup): Likewise for parameter `decl'.
(copy_lang_decl): Likewise for parameter `node'.
* c-lang.c: Include c-tree.h, c-lex.h and toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(lookup_interface): Likewise for parameter `arg'.
(is_class_name): Likewise.
(maybe_objc_check_decl): Likewise for parameter `decl'.
(maybe_objc_comptypes): Likewise for parameters `lhs', `rhs' and
`reflexive'.
(maybe_objc_method_name): Likewise for parameter `decl'.
(build_objc_string): Likewise for parameters `len' and `str'.
* c-lex.c: Include output.h.
* c-lex.h (position_after_white_space): Correct typo in prototype.
* c-tree.h (finish_file, c_expand_start_cond, c_expand_start_else,
c_expand_end_cond, init_iterators): Add prototypes.
* caller-save.c (set_reg_live): Mark parameters `reg' and `setter'
with ATTRIBUTE_UNUSED.
* calls.c: Include output.h.
* cccp.c (pipe_closed): Mark parameter `signo' with
ATTRIBUTE_UNUSED.
* combine.c: Move inclusion of expr.h to after insn-config.h.
* iris6.h (ASM_IDENTIFY_GCC, ASM_IDENTIFY_LANGUAGE): Don't define
as empty, rather define as ((void)0).
* sparc.c (sparc_check_64): Add braces around ambiguous `else'.
Add parentheses around assignment used as truth value.
* cplus-dem.c (squangle_mop_up): Change return type to void.
(internal_cplus_demangle): Remove unused parameter `options'.
All callers changed.
(cplus_demangle_opname): Remove function wide variable `int i' and
replace with `size_t i' at each location where it is used.
(cplus_demangle_opname): change type of `i' from int to size_t.
* cppexp.c (right_shift): Mark parameter `pfile' with
ATTRIBUTE_UNUSED.
* cpphash.c (cpp_lookup): Likewise.
(cpp_hash_cleanup): Likewise.
* cpplib.c (parse_name): Add a prototype and make it static.
(null_underflow): Mark parameter `pfile' with ATTRIBUTE_UNUSED.
(null_cleanup): Likewise for parameters `pbuf' and `pfile'.
(macro_cleanup): Likewise for parameter `pfile'.
(file_cleanup): Likewise.
* cpplib.h (cpp_reader_init, cpp_options_init, cpp_start_read,
cpp_read_check_assertion, skip_rest_of_line): Add prototypes.
* crtstuff.c (force_to_data, __CTOR_LIST__, force_to_data,
__DTOR_END__, __FRAME_END__): Mark with ATTRIBUTE_UNUSED.
* cse.c (cse_check_loop_start): Mark parameter `set' with
ATTRIBUTE_UNUSED.
* dbxout.c (flag_minimal_debug, have_used_extensions,
source_label_number): Move inside macro wrapper check against
defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO).
* dwarf2out.c (gen_entry_point_die): Hide prototype and definition.
* except.h (doing_eh): Provide prototype.
* expr.c: Move inclusion of expr.h to after insn-config.h.
* final.c: Include reload.h.
(shorten_branches): Cast the first argument of bzero to char *.
* fix-header.c (cpp_print_containing_files): Mark parameter
`pfile' with ATTRIBUTE_UNUSED.
(cpp_fatal): Likewise.
* flow.c (find_basic_blocks_1): Cast the first argument of bzero
to char *.
* genattrtab.c (make_length_attrs): Change the type of variable
`i' from int to size_t.
(zero_fn): Mark parameter `exp' with ATTRIBUTE_UNUSED.
(one_fn): Likewise.
* genextract.c (main): When generating insn-extract.c, mark
variable `junk' with ATTRIBUTE_UNUSED.
* gengenrtl.c (gencode): When generating genrtl.c, cast the first
argument of bzero to char*.
* integrate.c: Include toplev.h.
* libgcc2.c: Wrap `struct exception_table' and
`find_exception_handler' in macro DWARF2_UNWIND_INFO.
* objc/Make-lang.in (objc-act.o): Depend on toplev.h.
* objc/objc-act.c: Include toplev.h.
(lang_print_xnode): Mark parameters `file', `node' and `indent'
with ATTRIBUTE_UNUSED.
(finish_protocol): Likewise for parameter `protocol'.
* output.h (declare_weak): Add prototype.
(decode_reg_name): Don't wrap with TREE_CODE macro.
(assemble_alias): Add prototype.
* regclass.c: Include output.h.
* reload.h (reloads_conflict): Add prototype.
* rtl.h (print_rtl_single, mark_elimiation, reg_class_subset_p,
output_func_start_profiler): Add prototypes.
* rtlanal.c (reg_set_p_1): Mark parameters `x' and `pat' with
ATTRIBUTE_UNUSED.
* scan-decls.c: Include scan.h.
* scan.h (recognized_function, recognized_extern): Add prototypes.
* stmt.c: Include output.h.
* toplev.c (error_for_asm, warning_for_asm): Remove prototypes.
(output_lang_identify): Hide prototype and definition.
(float_signal): Mark parameter `signo' with ATTRIBUTE_UNUSED.
(pipe_closed): Likewise.
* toplev.h (count_error, strip_off_ending, error_for_asm,
warning_for_asm): Add prototypes.
From-SVN: r19712
1998-05-13 12:40:39 +00:00
|
|
|
|
cpp_reader *pfile ATTRIBUTE_UNUSED;
|
1999-02-25 20:48:42 +00:00
|
|
|
|
HOST_WIDEST_INT a;
|
2000-03-07 23:11:06 +00:00
|
|
|
|
unsigned int unsignedp;
|
1999-02-25 20:48:42 +00:00
|
|
|
|
unsigned HOST_WIDEST_INT b;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
1999-02-25 20:48:42 +00:00
|
|
|
|
if (b >= HOST_BITS_PER_WIDEST_INT)
|
|
|
|
|
return unsignedp ? 0 : a >> (HOST_BITS_PER_WIDEST_INT - 1);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
else if (unsignedp)
|
1999-02-25 20:48:42 +00:00
|
|
|
|
return (unsigned HOST_WIDEST_INT) a >> b;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
else
|
|
|
|
|
return a >> b;
|
|
|
|
|
}
|
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* Operator precedence and flags table.
|
2000-04-01 07:48:59 +00:00
|
|
|
|
|
|
|
|
|
After an operator is returned from the lexer, if it has priority less
|
|
|
|
|
than or equal to the operator on the top of the stack, we reduce the
|
2000-04-02 08:27:23 +00:00
|
|
|
|
stack by one operator and repeat the test. Since equal priorities
|
|
|
|
|
reduce, this is naturally left-associative.
|
2000-04-01 07:48:59 +00:00
|
|
|
|
|
|
|
|
|
We handle right-associative operators by clearing the lower bit of all
|
|
|
|
|
left-associative operators, and setting it for right-associative ones.
|
2000-04-02 08:27:23 +00:00
|
|
|
|
After the reduction phase of a new operator, just before it is pushed
|
|
|
|
|
onto the stack, its RIGHT_ASSOC bit is cleared. The effect is that
|
|
|
|
|
during the reduction phase, the current right-associative operator has
|
|
|
|
|
a priority one greater than any other operator of otherwise equal
|
|
|
|
|
precedence that has been pushed on the top of the stack. This avoids
|
|
|
|
|
a reduction pass, and effectively makes the logic right-associative.
|
2000-04-01 07:48:59 +00:00
|
|
|
|
|
|
|
|
|
The remaining cases are '(' and ')'. We handle '(' by skipping the
|
|
|
|
|
reduction phase completely. ')' is given lower priority than
|
|
|
|
|
everything else, including '(', effectively forcing a reduction of the
|
2000-04-02 08:27:23 +00:00
|
|
|
|
parenthesised expression. If there is no matching '(', the stack will
|
|
|
|
|
be reduced all the way to the beginning, exiting the parser in the
|
|
|
|
|
same way as the ultra-low priority end-of-expression dummy operator.
|
|
|
|
|
The exit code checks to see if the operator that caused it is ')', and
|
|
|
|
|
if so outputs an appropriate error message.
|
|
|
|
|
|
|
|
|
|
The parser assumes all shifted operators require a right operand
|
|
|
|
|
unless the flag NO_R_OPERAND is set, and similarly for NO_L_OPERAND.
|
|
|
|
|
These semantics are automatically checked, any extra semantics need to
|
|
|
|
|
be handled with operator-specific code. */
|
|
|
|
|
|
|
|
|
|
#define FLAG_BITS 8
|
|
|
|
|
#define FLAG_MASK ((1 << FLAG_BITS) - 1)
|
|
|
|
|
#define PRIO_SHIFT (FLAG_BITS + 1)
|
|
|
|
|
#define EXTRACT_PRIO(cnst) (cnst >> FLAG_BITS)
|
|
|
|
|
#define EXTRACT_FLAGS(cnst) (cnst & FLAG_MASK)
|
|
|
|
|
|
|
|
|
|
/* Flags. */
|
|
|
|
|
#define HAVE_VALUE (1 << 0)
|
|
|
|
|
#define NO_L_OPERAND (1 << 1)
|
|
|
|
|
#define NO_R_OPERAND (1 << 2)
|
|
|
|
|
#define SHORT_CIRCUIT (1 << 3)
|
|
|
|
|
|
|
|
|
|
/* Priority and flag combinations. */
|
|
|
|
|
#define RIGHT_ASSOC (1 << FLAG_BITS)
|
|
|
|
|
#define FORCE_REDUCE_PRIO (0 << PRIO_SHIFT)
|
|
|
|
|
#define CLOSE_PAREN_PRIO (1 << PRIO_SHIFT)
|
|
|
|
|
#define OPEN_PAREN_PRIO ((2 << PRIO_SHIFT) | NO_L_OPERAND)
|
|
|
|
|
#define COMMA_PRIO (3 << PRIO_SHIFT)
|
|
|
|
|
#define COND_PRIO ((4 << PRIO_SHIFT) | RIGHT_ASSOC | SHORT_CIRCUIT)
|
|
|
|
|
#define COLON_PRIO ((5 << PRIO_SHIFT) | SHORT_CIRCUIT)
|
|
|
|
|
#define OROR_PRIO ((6 << PRIO_SHIFT) | SHORT_CIRCUIT)
|
|
|
|
|
#define ANDAND_PRIO ((7 << PRIO_SHIFT) | SHORT_CIRCUIT)
|
|
|
|
|
#define OR_PRIO (8 << PRIO_SHIFT)
|
|
|
|
|
#define XOR_PRIO (9 << PRIO_SHIFT)
|
|
|
|
|
#define AND_PRIO (10 << PRIO_SHIFT)
|
|
|
|
|
#define EQUAL_PRIO (11 << PRIO_SHIFT)
|
|
|
|
|
#define LESS_PRIO (12 << PRIO_SHIFT)
|
|
|
|
|
#define SHIFT_PRIO (13 << PRIO_SHIFT)
|
|
|
|
|
#define PLUS_PRIO (14 << PRIO_SHIFT)
|
|
|
|
|
#define MUL_PRIO (15 << PRIO_SHIFT)
|
|
|
|
|
#define UNARY_PRIO ((16 << PRIO_SHIFT) | RIGHT_ASSOC | NO_L_OPERAND)
|
2000-03-31 22:23:59 +00:00
|
|
|
|
|
1995-03-16 13:59:07 -08:00
|
|
|
|
#define COMPARE(OP) \
|
2000-04-02 08:27:23 +00:00
|
|
|
|
top->unsignedp = 0; \
|
1998-10-11 00:05:11 +00:00
|
|
|
|
top->value = (unsigned1 || unsigned2) \
|
2000-04-02 08:27:23 +00:00
|
|
|
|
? (unsigned HOST_WIDEST_INT) v1 OP (unsigned HOST_WIDEST_INT) v2 \
|
|
|
|
|
: (v1 OP v2)
|
|
|
|
|
#define EQUALITY(OP) \
|
|
|
|
|
top->value = v1 OP v2; \
|
|
|
|
|
top->unsignedp = 0;
|
2000-04-01 07:48:59 +00:00
|
|
|
|
#define LOGICAL(OP) \
|
2000-04-02 08:27:23 +00:00
|
|
|
|
top->value = v1 OP v2; \
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
/* Parse and evaluate a C expression, reading from PFILE.
|
Makefile.in (LIBCPP_DEPS): New macro.
* Makefile.in (LIBCPP_DEPS): New macro.
(cpplib.o, cpphash.o, cpperror.o, cppexp.o, cppfiles.o): Use
it to declare deps.
* cpperror.c: Include cpphash.h.
* cppexp.c: Include cpphash.h. Remove MULTIBYTE_CHARS
dingleberry.
(lex): Don't use CPP_WARN_UNDEF.
(_cpp_parse_expr): Return an int, the truth value.
* cppfiles.c: Include cpphash.h.
(_cpp_merge_include_chains): Move to cppinit.c and make static.
* cppinit.c (include_defaults_array): Disentangle.
(cpp_cleanup): Don't free the if stack here.
(cpp_finish): Pop off all buffers, not just one.
* cpplib.c (eval_if_expr): Return int.
(do_xifdef): Rename do_ifdef.
(handle_directive): Don't use CPP_PREPROCESSED.
(cpp_get_token): Don't use CPP_C89.
* fix-header.c: Don't use CPP_OPTIONS.
* cpplib.h: Move U_CHAR, enum node_type, struct
file_name_list, struct ihash, is_idchar, is_idstart,
is_numchar, is_numstart, is_hspace, is_space, CPP_BUF_PEEK,
CPP_BUF_GET, CPP_FORWARD, CPP_PUTS, CPP_PUTS_Q, CPP_PUTC,
CPP_PUTC_Q, CPP_NUL_TERMINATE, CPP_NUL_TERMINATE_Q,
CPP_BUMP_BUFFER_LINE, CPP_BUMP_LINE, CPP_PREV_BUFFER,
CPP_PRINT_DEPS, CPP_TRADITIONAL, CPP_PEDANTIC, and prototypes
of _cpp_simplify_pathname, _cpp_find_include_file,
_cpp_read_include_file, and _cpp_parse_expr to cpphash.h.
Move struct if_stack to cpplib.c. Move struct cpp_pending to
cppinit.c.
Change all uses of U_CHAR to be unsigned char instead.
Delete CPP_WARN_UNDEF, CPP_C89, and CPP_PREPROCESSED.
From-SVN: r32435
2000-03-08 23:35:19 +00:00
|
|
|
|
Returns the truth value of the expression. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
Makefile.in (LIBCPP_DEPS): New macro.
* Makefile.in (LIBCPP_DEPS): New macro.
(cpplib.o, cpphash.o, cpperror.o, cppexp.o, cppfiles.o): Use
it to declare deps.
* cpperror.c: Include cpphash.h.
* cppexp.c: Include cpphash.h. Remove MULTIBYTE_CHARS
dingleberry.
(lex): Don't use CPP_WARN_UNDEF.
(_cpp_parse_expr): Return an int, the truth value.
* cppfiles.c: Include cpphash.h.
(_cpp_merge_include_chains): Move to cppinit.c and make static.
* cppinit.c (include_defaults_array): Disentangle.
(cpp_cleanup): Don't free the if stack here.
(cpp_finish): Pop off all buffers, not just one.
* cpplib.c (eval_if_expr): Return int.
(do_xifdef): Rename do_ifdef.
(handle_directive): Don't use CPP_PREPROCESSED.
(cpp_get_token): Don't use CPP_C89.
* fix-header.c: Don't use CPP_OPTIONS.
* cpplib.h: Move U_CHAR, enum node_type, struct
file_name_list, struct ihash, is_idchar, is_idstart,
is_numchar, is_numstart, is_hspace, is_space, CPP_BUF_PEEK,
CPP_BUF_GET, CPP_FORWARD, CPP_PUTS, CPP_PUTS_Q, CPP_PUTC,
CPP_PUTC_Q, CPP_NUL_TERMINATE, CPP_NUL_TERMINATE_Q,
CPP_BUMP_BUFFER_LINE, CPP_BUMP_LINE, CPP_PREV_BUFFER,
CPP_PRINT_DEPS, CPP_TRADITIONAL, CPP_PEDANTIC, and prototypes
of _cpp_simplify_pathname, _cpp_find_include_file,
_cpp_read_include_file, and _cpp_parse_expr to cpphash.h.
Move struct if_stack to cpplib.c. Move struct cpp_pending to
cppinit.c.
Change all uses of U_CHAR to be unsigned char instead.
Delete CPP_WARN_UNDEF, CPP_C89, and CPP_PREPROCESSED.
From-SVN: r32435
2000-03-08 23:35:19 +00:00
|
|
|
|
int
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
_cpp_parse_expr (pfile)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
cpp_reader *pfile;
|
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* The implementation is an operator precedence parser, i.e. a
|
|
|
|
|
bottom-up parser, using a stack for not-yet-reduced tokens.
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
|
|
|
|
The stack base is 'stack', and the current stack pointer is 'top'.
|
|
|
|
|
There is a stack element for each operator (only),
|
|
|
|
|
and the most recently pushed operator is 'top->op'.
|
|
|
|
|
An operand (value) is stored in the 'value' field of the stack
|
|
|
|
|
element of the operator that precedes it.
|
|
|
|
|
In that case the 'flags' field has the HAVE_VALUE flag set. */
|
|
|
|
|
|
|
|
|
|
#define INIT_STACK_SIZE 20
|
|
|
|
|
struct operation init_stack[INIT_STACK_SIZE];
|
|
|
|
|
struct operation *stack = init_stack;
|
|
|
|
|
struct operation *limit = stack + INIT_STACK_SIZE;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
register struct operation *top = stack + 1;
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
long old_written = CPP_WRITTEN (pfile);
|
2000-04-02 08:27:23 +00:00
|
|
|
|
int skip_evaluation = 0;
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
int result;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
pfile->parsing_if_directive++;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* We've finished when we try to reduce this. */
|
|
|
|
|
top->op = FINISHED;
|
|
|
|
|
/* Nifty way to catch missing '('. */
|
|
|
|
|
top->prio = EXTRACT_PRIO(CLOSE_PAREN_PRIO);
|
|
|
|
|
/* Avoid missing right operand checks. */
|
|
|
|
|
top->flags = NO_R_OPERAND;
|
|
|
|
|
|
1995-03-16 13:59:07 -08:00
|
|
|
|
for (;;)
|
|
|
|
|
{
|
2000-04-01 07:48:59 +00:00
|
|
|
|
unsigned int prio;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
unsigned int flags;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
struct operation op;
|
|
|
|
|
|
|
|
|
|
/* Read a token */
|
2000-04-01 07:42:37 +00:00
|
|
|
|
op = lex (pfile, skip_evaluation);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* If the token is an operand, push its value and get next
|
|
|
|
|
token. If it is an operator, get its priority and flags, and
|
|
|
|
|
try to reduce the expression on the stack. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
switch (op.op)
|
|
|
|
|
{
|
|
|
|
|
case NAME:
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
cpp_ice (pfile, "lex returns a NAME");
|
2000-04-01 07:42:37 +00:00
|
|
|
|
case ERROR:
|
|
|
|
|
goto syntax_error;
|
cppinit.c (cpp_start_read): Turn off -Wtraditional if processing C++.
* cppinit.c (cpp_start_read): Turn off -Wtraditional if
processing C++.
* cpplib.c (_cpp_handle_directive): Improve warnings for
traditional C and indented directives.
* enquire.c, gsyslimits.h, limity.h, config/convex/fixinc.convex,
fixinc/fixinc.irix, fixinc/fixinc.sco, fixinc/fixinc.wrap,
fixinc/inclhack.def: Indent the # of #include_next one space.
* cp/rtti.c: Un-indent #if and #endif.
* cppexp.c (_cpp_parse_expr): If lex returns '#', it's a
syntax error, but an error has already been printed.
* cpplex.c (_cpp_parse_assertion): Give a more specific error
message when called with nothing remaining on the line.
(_cpp_lex_token): If _cpp_parse_assertion fails, return an
OTHER token, not an ASSERTION.
* cpplib.c (do_assert): When we create a 'base' node, clear
its aschain pointer.
* gcc.c-torture/compile/981211-1.c: Move to...
* gcc.dg/cpp-as1.c: ...here.
* gcc.dg/cpp-as2.c: New file.
* gcc.dg/cpp-tradwarn1.c: Change warning regexps to match the
compiler.
From-SVN: r32870
2000-04-02 22:50:55 +00:00
|
|
|
|
case '#':
|
|
|
|
|
/* We get '#' when get_directive_token hits a syntactically
|
|
|
|
|
invalid assertion predicate. _cpp_parse_assertion has
|
|
|
|
|
already issued an error. */
|
|
|
|
|
goto syntax_error;
|
2000-04-01 07:42:37 +00:00
|
|
|
|
default:
|
|
|
|
|
cpp_error (pfile, "invalid character in #if");
|
|
|
|
|
goto syntax_error;
|
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
case INT:
|
|
|
|
|
case CHAR:
|
2000-04-01 07:42:37 +00:00
|
|
|
|
push_immediate:
|
|
|
|
|
/* Push a value onto the stack. */
|
2000-02-10 23:47:04 +00:00
|
|
|
|
if (top->flags & HAVE_VALUE)
|
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
cpp_error (pfile, "missing binary operator");
|
2000-04-01 07:42:37 +00:00
|
|
|
|
goto syntax_error;
|
2000-02-10 23:47:04 +00:00
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
top->value = op.value;
|
|
|
|
|
top->unsignedp = op.unsignedp;
|
|
|
|
|
top->flags |= HAVE_VALUE;
|
|
|
|
|
continue;
|
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
case '+':
|
|
|
|
|
case '-': prio = PLUS_PRIO; if (top->flags & HAVE_VALUE) break;
|
|
|
|
|
/* else unary; fall through */
|
|
|
|
|
case '!':
|
|
|
|
|
case '~': prio = UNARY_PRIO; break;
|
2000-04-01 07:48:59 +00:00
|
|
|
|
|
|
|
|
|
case '*':
|
|
|
|
|
case '/':
|
|
|
|
|
case '%': prio = MUL_PRIO; break;
|
|
|
|
|
case '<':
|
|
|
|
|
case '>':
|
|
|
|
|
case LEQ:
|
|
|
|
|
case GEQ: prio = LESS_PRIO; break;
|
|
|
|
|
case NOTEQUAL:
|
|
|
|
|
case EQUAL: prio = EQUAL_PRIO; break;
|
|
|
|
|
case LSH:
|
|
|
|
|
case RSH: prio = SHIFT_PRIO; break;
|
|
|
|
|
case '&': prio = AND_PRIO; break;
|
|
|
|
|
case '^': prio = XOR_PRIO; break;
|
|
|
|
|
case '|': prio = OR_PRIO; break;
|
|
|
|
|
case ANDAND: prio = ANDAND_PRIO; break;
|
|
|
|
|
case OROR: prio = OROR_PRIO; break;
|
|
|
|
|
case ',': prio = COMMA_PRIO; break;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
case '(': prio = OPEN_PAREN_PRIO; break;
|
|
|
|
|
case ')': prio = CLOSE_PAREN_PRIO; break;
|
|
|
|
|
case ':': prio = COLON_PRIO; break;
|
|
|
|
|
case '?': prio = COND_PRIO; break;
|
|
|
|
|
case 0: prio = FORCE_REDUCE_PRIO; break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* Separate the operator's code into priority and flags. */
|
|
|
|
|
flags = EXTRACT_FLAGS(prio);
|
|
|
|
|
prio = EXTRACT_PRIO(prio);
|
|
|
|
|
if (op.op == '(')
|
|
|
|
|
goto skip_reduction;
|
2000-02-10 23:47:04 +00:00
|
|
|
|
|
2000-04-01 07:48:59 +00:00
|
|
|
|
/* Check for reductions. Then push the operator. */
|
|
|
|
|
while (prio <= top->prio)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
HOST_WIDEST_INT v1, v2;
|
|
|
|
|
unsigned int unsigned1, unsigned2;
|
|
|
|
|
|
|
|
|
|
/* Most operators that can appear on the stack require a
|
|
|
|
|
right operand. Check this before trying to reduce. */
|
|
|
|
|
if ((top->flags & (HAVE_VALUE | NO_R_OPERAND)) == 0)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (top->op == '(')
|
|
|
|
|
cpp_error (pfile, "void expression between '(' and ')'");
|
|
|
|
|
else
|
2000-04-02 22:12:14 +00:00
|
|
|
|
cpp_error (pfile, "operator `%s' has no right operand",
|
|
|
|
|
op_to_str (top->op));
|
1995-03-16 13:59:07 -08:00
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
2000-04-02 08:27:23 +00:00
|
|
|
|
|
|
|
|
|
unsigned2 = top->unsignedp, v2 = top->value;
|
|
|
|
|
top--;
|
|
|
|
|
unsigned1 = top->unsignedp, v1 = top->value;
|
|
|
|
|
|
|
|
|
|
/* Now set top->value = (top[1].op)(v1, v2); */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
switch (top[1].op)
|
|
|
|
|
{
|
|
|
|
|
case '+':
|
|
|
|
|
if (!(top->flags & HAVE_VALUE))
|
|
|
|
|
{ /* Unary '+' */
|
|
|
|
|
top->value = v2;
|
|
|
|
|
top->unsignedp = unsigned2;
|
|
|
|
|
top->flags |= HAVE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
top->value = v1 + v2;
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
1996-01-16 15:46:59 -08:00
|
|
|
|
if (! top->unsignedp && ! skip_evaluation
|
1995-03-16 13:59:07 -08:00
|
|
|
|
&& ! possible_sum_sign (v1, v2, top->value))
|
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case '-':
|
1996-01-22 15:40:12 -08:00
|
|
|
|
if (!(top->flags & HAVE_VALUE))
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{ /* Unary '-' */
|
|
|
|
|
top->value = - v2;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (!skip_evaluation && (top->value & v2) < 0
|
|
|
|
|
&& !unsigned2)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
top->unsignedp = unsigned2;
|
|
|
|
|
top->flags |= HAVE_VALUE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ /* Binary '-' */
|
|
|
|
|
top->value = v1 - v2;
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
1996-01-22 15:40:12 -08:00
|
|
|
|
if (! top->unsignedp && ! skip_evaluation
|
1995-03-16 13:59:07 -08:00
|
|
|
|
&& ! possible_sum_sign (top->value, v2, v1))
|
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case '*':
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
|
|
|
|
if (top->unsignedp)
|
1999-02-25 20:48:42 +00:00
|
|
|
|
top->value = (unsigned HOST_WIDEST_INT) v1 * v2;
|
1996-01-16 15:46:59 -08:00
|
|
|
|
else if (!skip_evaluation)
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
|
|
|
|
top->value = v1 * v2;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (v1 && (top->value / v1 != v2
|
|
|
|
|
|| (top->value & v1 & v2) < 0))
|
1995-03-16 13:59:07 -08:00
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case '/':
|
2000-04-02 08:27:23 +00:00
|
|
|
|
case '%':
|
1996-01-16 15:46:59 -08:00
|
|
|
|
if (skip_evaluation)
|
|
|
|
|
break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
if (v2 == 0)
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "division by zero in #if");
|
|
|
|
|
v2 = 1;
|
|
|
|
|
}
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (top[1].op == '/')
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (top->unsignedp)
|
|
|
|
|
top->value = (unsigned HOST_WIDEST_INT) v1 / v2;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
top->value = v1 / v2;
|
|
|
|
|
if ((top->value & v1 & v2) < 0)
|
|
|
|
|
integer_overflow (pfile);
|
|
|
|
|
}
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
2000-04-02 08:27:23 +00:00
|
|
|
|
else
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-04-02 08:27:23 +00:00
|
|
|
|
if (top->unsignedp)
|
|
|
|
|
top->value = (unsigned HOST_WIDEST_INT) v1 % v2;
|
|
|
|
|
else
|
|
|
|
|
top->value = v1 % v2;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case '!':
|
|
|
|
|
top->value = ! v2;
|
|
|
|
|
top->unsignedp = 0;
|
|
|
|
|
top->flags |= HAVE_VALUE;
|
|
|
|
|
break;
|
|
|
|
|
case '~':
|
|
|
|
|
top->value = ~ v2;
|
|
|
|
|
top->unsignedp = unsigned2;
|
|
|
|
|
top->flags |= HAVE_VALUE;
|
|
|
|
|
break;
|
|
|
|
|
case '<': COMPARE(<); break;
|
|
|
|
|
case '>': COMPARE(>); break;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
case LEQ: COMPARE(<=); break;
|
|
|
|
|
case GEQ: COMPARE(>=); break;
|
|
|
|
|
case EQUAL: EQUALITY(==); break;
|
|
|
|
|
case NOTEQUAL: EQUALITY(!=); break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case LSH:
|
1996-01-16 15:46:59 -08:00
|
|
|
|
if (skip_evaluation)
|
|
|
|
|
break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
top->unsignedp = unsigned1;
|
|
|
|
|
if (v2 < 0 && ! unsigned2)
|
|
|
|
|
top->value = right_shift (pfile, v1, unsigned1, -v2);
|
|
|
|
|
else
|
|
|
|
|
top->value = left_shift (pfile, v1, unsigned1, v2);
|
|
|
|
|
break;
|
|
|
|
|
case RSH:
|
1996-01-16 15:46:59 -08:00
|
|
|
|
if (skip_evaluation)
|
|
|
|
|
break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
top->unsignedp = unsigned1;
|
|
|
|
|
if (v2 < 0 && ! unsigned2)
|
|
|
|
|
top->value = left_shift (pfile, v1, unsigned1, -v2);
|
|
|
|
|
else
|
|
|
|
|
top->value = right_shift (pfile, v1, unsigned1, v2);
|
|
|
|
|
break;
|
|
|
|
|
case '&': LOGICAL(&); break;
|
|
|
|
|
case '^': LOGICAL(^); break;
|
|
|
|
|
case '|': LOGICAL(|); break;
|
|
|
|
|
case ANDAND:
|
1996-01-16 15:46:59 -08:00
|
|
|
|
top->value = v1 && v2; top->unsignedp = 0;
|
|
|
|
|
if (!v1) skip_evaluation--;
|
|
|
|
|
break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case OROR:
|
1996-01-16 15:46:59 -08:00
|
|
|
|
top->value = v1 || v2; top->unsignedp = 0;
|
|
|
|
|
if (v1) skip_evaluation--;
|
|
|
|
|
break;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
case ',':
|
|
|
|
|
if (CPP_PEDANTIC (pfile))
|
|
|
|
|
cpp_pedwarn (pfile, "comma operator in operand of `#if'");
|
|
|
|
|
top->value = v2;
|
|
|
|
|
top->unsignedp = unsigned2;
|
|
|
|
|
break;
|
2000-04-01 07:42:37 +00:00
|
|
|
|
case '?':
|
2000-04-01 07:48:59 +00:00
|
|
|
|
cpp_error (pfile, "syntax error '?' without following ':'");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
goto syntax_error;
|
|
|
|
|
case ':':
|
|
|
|
|
if (top[0].op != '?')
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile,
|
|
|
|
|
"syntax error ':' without preceding '?'");
|
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
2000-04-02 08:27:23 +00:00
|
|
|
|
top--;
|
|
|
|
|
if (top->value) skip_evaluation--;
|
|
|
|
|
top->value = top->value ? v1 : v2;
|
|
|
|
|
top->unsignedp = unsigned1 || unsigned2;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
break;
|
2000-04-01 07:42:37 +00:00
|
|
|
|
case '(':
|
|
|
|
|
if (op.op != ')')
|
1995-03-16 13:59:07 -08:00
|
|
|
|
{
|
2000-04-01 07:42:37 +00:00
|
|
|
|
cpp_error (pfile, "missing ')' in expression");
|
1995-03-16 13:59:07 -08:00
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
op.value = v2;
|
|
|
|
|
op.unsignedp = unsigned2;
|
|
|
|
|
goto push_immediate;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
default:
|
2000-04-02 22:12:14 +00:00
|
|
|
|
cpp_error (pfile, "unimplemented operator `%s'",
|
|
|
|
|
op_to_str (top[1].op));
|
2000-04-02 08:27:23 +00:00
|
|
|
|
break;
|
|
|
|
|
case FINISHED:
|
|
|
|
|
/* Reducing this dummy operator indicates we've finished. */
|
|
|
|
|
if (op.op == ')')
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "missing '(' in expression");
|
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
|
|
|
|
goto done;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* Handle short-circuit evaluations. */
|
|
|
|
|
if (flags & SHORT_CIRCUIT)
|
|
|
|
|
switch (op.op)
|
|
|
|
|
{
|
|
|
|
|
case OROR: if (top->value) skip_evaluation++; break;
|
|
|
|
|
case ANDAND:
|
|
|
|
|
case '?': if (!top->value) skip_evaluation++; break;
|
|
|
|
|
case ':':
|
|
|
|
|
if (top[-1].value) /* Was '?' condition true? */
|
|
|
|
|
skip_evaluation++;
|
|
|
|
|
else
|
|
|
|
|
skip_evaluation--;
|
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
|
|
|
|
|
skip_reduction:
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* Check we have a left operand iff we need one. */
|
|
|
|
|
if (((flags & NO_L_OPERAND) != 0) ^ ((top->flags & HAVE_VALUE) == 0))
|
|
|
|
|
{
|
|
|
|
|
if (flags & NO_L_OPERAND)
|
2000-04-02 22:12:14 +00:00
|
|
|
|
cpp_error (pfile, "missing binary operator before `%s'",
|
|
|
|
|
op_to_str (op.op));
|
2000-04-02 08:27:23 +00:00
|
|
|
|
else
|
2000-04-02 22:12:14 +00:00
|
|
|
|
cpp_error (pfile, "operator `%s' has no left operand",
|
|
|
|
|
op_to_str (op.op));
|
2000-04-02 08:27:23 +00:00
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
|
|
|
|
|
1996-07-03 22:07:53 +00:00
|
|
|
|
/* Check for and handle stack overflow. */
|
2000-04-01 07:42:37 +00:00
|
|
|
|
top++;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
if (top == limit)
|
|
|
|
|
{
|
|
|
|
|
struct operation *new_stack;
|
1996-07-03 22:07:53 +00:00
|
|
|
|
int old_size = (char *) limit - (char *) stack;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
int new_size = 2 * old_size;
|
|
|
|
|
if (stack != init_stack)
|
1996-07-03 22:07:53 +00:00
|
|
|
|
new_stack = (struct operation *) xrealloc (stack, new_size);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
else
|
|
|
|
|
{
|
1996-07-03 22:07:53 +00:00
|
|
|
|
new_stack = (struct operation *) xmalloc (new_size);
|
cppfiles.c (_cpp_find_include_file): Make sure ih->name is initialized.
* cppfiles.c (_cpp_find_include_file): Make sure ih->name is
initialized.
* cppinit.c (cpp_cleanup): Free imp->nshort also.
* cpperror.c (cpp_print_containing_files,
cpp_print_file_and_line, v_cpp_message): Rename to
print_containing_files, print_file_and_line, and v_message.
* cppexp.c (cpp_parse_expr, cpp_parse_escape, cpp_lex): Rename
to _cpp_parse_expr, parse_escape, and lex.
(parse_charconst): Remove broken multibyte support.
* cppfiles.c (include_hash): Make static.
(cpp_included): New function.
(merge_include_chains, find_include_file, finclude,
simplify_pathname): Rename to _cpp_merge_include_chains,
_cpp_find_include_file, _cpp_read_include_file, and
_cpp_simplify_pathname.
* cpphash.c (cpp_lookup, free_definition, delete_macro,
cpp_install, create_definition, macroexpand, compare_defs,
dump_definition): Rename to _cpp_lookup, _cpp_free_definition,
_cpp_delete_macro, _cpp_install, _cpp_create_definition,
_cpp_macroexpand, _cpp_compare_defs, and _cpp_dump_definition.
* cppinit.c (cpp_handle_option): Rename to handle_option, make
static.
* cpplib.c: Remove extern prototype of cpp_parse_expr.
* cpphash.h: Update prototypes.
* cpplib.h: Likewise. Prototype _cpp_parse_expr here.
From-SVN: r32390
2000-03-07 20:58:47 +00:00
|
|
|
|
memcpy (new_stack, stack, old_size);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
stack = new_stack;
|
1996-07-03 22:07:53 +00:00
|
|
|
|
top = (struct operation *) ((char *) new_stack + old_size);
|
|
|
|
|
limit = (struct operation *) ((char *) new_stack + new_size);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
top->flags = flags;
|
2000-04-02 08:27:23 +00:00
|
|
|
|
top->prio = prio & ~EXTRACT_PRIO(RIGHT_ASSOC);
|
1995-03-16 13:59:07 -08:00
|
|
|
|
top->op = op.op;
|
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
done:
|
|
|
|
|
result = (top[1].value != 0);
|
2000-04-01 07:42:37 +00:00
|
|
|
|
if (top != stack)
|
2000-04-02 08:27:23 +00:00
|
|
|
|
{
|
|
|
|
|
cpp_ice (pfile, "unbalanced stack in #if expression");
|
|
|
|
|
goto syntax_error;
|
|
|
|
|
}
|
|
|
|
|
else if (!(top[1].flags & HAVE_VALUE))
|
|
|
|
|
{
|
|
|
|
|
cpp_error (pfile, "#if with no expression");
|
|
|
|
|
syntax_error:
|
|
|
|
|
_cpp_skip_rest_of_line (pfile);
|
|
|
|
|
result = 0; /* Return 0 on syntax error. */
|
|
|
|
|
}
|
2000-04-01 07:42:37 +00:00
|
|
|
|
|
2000-04-02 08:27:23 +00:00
|
|
|
|
/* Free dynamic stack if we allocated one. */
|
1995-03-16 13:59:07 -08:00
|
|
|
|
if (stack != init_stack)
|
|
|
|
|
free (stack);
|
2000-04-02 08:27:23 +00:00
|
|
|
|
pfile->parsing_if_directive--;
|
|
|
|
|
CPP_SET_WRITTEN (pfile, old_written);
|
Makefile.in (LIBCPP_OBJS): Add cpplex.o.
* Makefile.in (LIBCPP_OBJS): Add cpplex.o.
(cpplex.o): New target.
* po/POTFILES.in: Add cpplex.c.
* cpplex.c (_cpp_grow_token_buffer, null_cleanup,
cpp_push_buffer, cpp_pop_buffer, cpp_scan_buffer,
cpp_expand_to_buffer, cpp_buf_line_and_col, cpp_file_buffer,
skip_block_comment, skip_line_comment, skip_comment,
copy_comment, _cpp_skip_hspace, _cpp_skip_rest_of_line,
_cpp_parse_name, skip_string, parse_string,
_cpp_parse_assertion, cpp_get_token, cpp_get_non_space_token,
_cpp_get_directive_token, find_position,
_cpp_read_and_prescan, _cpp_init_input_buffer): Move here.
(maybe_macroexpand, _cpp_lex_token): New functions.
* cpplib.c (SKIP_WHITE_SPACE, eval_if_expr, parse_set_mark,
parse_goto_mark): Delete.
(_cpp_handle_eof): New function.
(_cpp_handle_directive): Rename from handle_directive.
(_cpp_output_line_command): Rename from output_line_command.
(do_if, do_elif): Call _cpp_parse_expr directly.
* cppfiles.c (_cpp_read_include_file): Don't call
init_input_buffer here.
* cpphash.c (quote_string): Move here, rename _cpp_quote_string.
* cppexp.c (_cpp_parse_expr): Diddle parsing_if_directive
here; pop the token_buffer and skip the rest of the line here.
* cppinit.c (cpp_start_read): Call _cpp_init_input_buffer
here.
* cpphash.h (CPP_RESERVE, CPP_IS_MACRO_BUFFER, ACTIVE_MARK_P):
Define here.
(CPP_SET_BUF_MARK, CPP_GOTO_BUF_MARK, CPP_SET_MARK,
CPP_GOTO_MARK): New macros.
(_cpp_quote_string, _cpp_parse_name, _cpp_skip_rest_of_line,
_cpp_skip_hspace, _cpp_parse_assertion, _cpp_lex_token,
_cpp_read_and_prescan, _cpp_init_input_buffer,
_cpp_grow_token_buffer, _cpp_get_directive_token,
_cpp_handle_directive, _cpp_handle_eof,
_cpp_output_line_command): Prototype them here.
* cpplib.h (enum cpp_token): Add CPP_MACRO.
(CPP_RESERVE, get_directive_token, cpp_grow_buffer,
quote_string, output_line_command): Remove.
From-SVN: r32513
2000-03-13 22:01:08 +00:00
|
|
|
|
return result;
|
1995-03-16 13:59:07 -08:00
|
|
|
|
}
|