aboutsummaryrefslogtreecommitdiff
path: root/gcc/cpplex.c
diff options
context:
space:
mode:
authorZack Weinberg <zack@wolery.cumb.org>2000-05-29 16:19:32 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-05-29 16:19:32 +0000
commitea4a453b8909eb0f3612bbf98fe2e6a2a8ee4114 (patch)
tree05d62231cd71e2302cbbf76f31135f52a6e77ba9 /gcc/cpplex.c
parent1b50716d21794f2f69aa2939045fbf1489ff3c19 (diff)
downloadgcc-ea4a453b8909eb0f3612bbf98fe2e6a2a8ee4114.zip
gcc-ea4a453b8909eb0f3612bbf98fe2e6a2a8ee4114.tar.gz
gcc-ea4a453b8909eb0f3612bbf98fe2e6a2a8ee4114.tar.bz2
cpplib.h (cpp_reader): Remove if_stack.
* cpplib.h (cpp_reader): Remove if_stack. Change potential_control_macro to a cpp_hashnode *. Add skipping flag. * cpphash.h (struct ihash): Change control_macro to a cpp_hashnode * and shorten name to cmacro. Add NEVER_REINCLUDE constant. * cppfiles.c (redundant_include_p): Drop cpp_reader argument. Examine the cmacro node directly, no need to call cpp_defined. (_cpp_execute_include, read_include_file): Set cmacro to NEVER_REINCLUDE, not U"". * cpplex.c (cpp_push_buffer): Don't set new->if_stack. (cpp_get_token): If pfile->skipping is true, discard text and keep scanning until we hit a directive; don't expand macros. * cpplib.c (struct if_stack): Remove if_succeeded, add was_skipping. Change control_macro to a cpp_hashnode * and shorten name to cmacro. Remove typedef IF_STACK. (parse_ifdef), detect_if_not_defined): Return a cpp_hashnode *. (conditional_skip, skip_if_group, consider_directive_while_skipping): Delete. (push_conditional): New. (_cpp_handle_directive): Don't process directives other than conditionals if we are skipping. (do_ifdef, do_ifndef, do_if, do_else, do_elif, do_endif): Update to new scheme. (validate_else): Skip rest of line here, unconditionally. (_cpp_unwind_if_stack): The stack is per-buffer. Force pfile->skipping off. (all): Remove `scare quotes' from error messages. * gcc.dg/cpp-mi.c: Add another case, cpp-mix.h, where the guard macro is already defined when the header is first included. * gcc.dg/cpp-mix.h: New file. * gcc.dg/endif-label.c: Update patterns to match compiler. * g++.brendan/complex1.C: Declare abort. * g++.law/refs4.C: Remove XFAIL. * g++.oliva/expr2.C: Declare abort and exit. From-SVN: r34253
Diffstat (limited to 'gcc/cpplex.c')
-rw-r--r--gcc/cpplex.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index 4708382..b35f298 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -193,7 +193,6 @@ cpp_push_buffer (pfile, buffer, length)
new = (cpp_buffer *) xcalloc (1, sizeof (cpp_buffer));
- new->if_stack = pfile->if_stack;
new->buf = new->cur = buffer;
new->rlimit = buffer + length;
new->prev = buf;
@@ -221,7 +220,7 @@ cpp_pop_buffer (pfile)
pfile->system_include_depth--;
if (pfile->potential_control_macro)
{
- buf->ihash->control_macro = pfile->potential_control_macro;
+ buf->ihash->cmacro = pfile->potential_control_macro;
pfile->potential_control_macro = 0;
}
pfile->input_stack_listing_current = 0;
@@ -1743,6 +1742,7 @@ cpp_get_token (pfile)
{
enum cpp_ttype token;
long written = CPP_WRITTEN (pfile);
+ int macro_buffer;
get_next:
token = _cpp_lex_token (pfile);
@@ -1750,24 +1750,26 @@ cpp_get_token (pfile)
switch (token)
{
default:
+ if (pfile->skipping)
+ break;
pfile->potential_control_macro = 0;
pfile->only_seen_white = 0;
- return token;
+ break;
+
+ case CPP_HSPACE:
+ case CPP_COMMENT:
+ break;
case CPP_VSPACE:
if (pfile->only_seen_white == 0)
pfile->only_seen_white = 1;
CPP_BUMP_LINE (pfile);
- return token;
-
- case CPP_HSPACE:
- case CPP_COMMENT:
- return token;
+ break;
case CPP_HASH:
pfile->potential_control_macro = 0;
if (!pfile->only_seen_white)
- return CPP_HASH;
+ break;
/* XXX shouldn't have to do this - remove the hash or %: from
the token buffer. */
if (CPP_PWRITTEN (pfile)[-1] == '#')
@@ -1776,30 +1778,43 @@ cpp_get_token (pfile)
CPP_ADJUST_WRITTEN (pfile, -2);
if (_cpp_handle_directive (pfile))
- return CPP_DIRECTIVE;
+ {
+ token = CPP_DIRECTIVE;
+ break;
+ }
pfile->only_seen_white = 0;
CPP_PUTC (pfile, '#');
- return CPP_HASH;
+ break;
case CPP_MACRO:
+ if (pfile->skipping)
+ break;
pfile->potential_control_macro = 0;
pfile->only_seen_white = 0;
if (! pfile->no_macro_expand
&& maybe_macroexpand (pfile, written))
goto get_next;
- return CPP_NAME;
+ token = CPP_NAME;
+ break;
+ /* Do not run this case through the 'skipping' logic. */
case CPP_EOF:
if (CPP_BUFFER (pfile) == NULL)
return CPP_EOF;
- if (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
- {
- cpp_pop_buffer (pfile);
- goto get_next;
- }
+ macro_buffer = CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile));
+
cpp_pop_buffer (pfile);
+ if (macro_buffer)
+ goto get_next;
return CPP_EOF;
}
+
+ if (pfile->skipping)
+ {
+ CPP_SET_WRITTEN (pfile, written);
+ goto get_next;
+ }
+ return token;
}
/* Like cpp_get_token, but skip spaces and comments. */