From a949941cf79dc2bee4e741ce3928e11c4053f257 Mon Sep 17 00:00:00 2001 From: Neil Booth Date: Thu, 9 Nov 2000 21:18:15 +0000 Subject: [PATCH] cpphash.c: Move cpp_defined here from cpplib.c. * cpphash.c: Move cpp_defined here from cpplib.c. * cpplib.c: Update comments, move cpp_defined to cpphash.c. * cpplex.c (_cpp_lex_token): Don't leave the lexer at EOL. * cppmacro.c (cpp_get_token): Update comments, no need now to catch the CPP_EOF meaning EOL case. From-SVN: r37345 --- gcc/ChangeLog | 8 ++++++++ gcc/cpphash.c | 13 +++++++++++++ gcc/cpplex.c | 51 ++++++++++++++++++++++---------------------------- gcc/cpplib.c | 22 ++-------------------- gcc/cppmacro.c | 27 ++++++++++++-------------- 5 files changed, 57 insertions(+), 64 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1d81a64fb9b..3db1d11ed18 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-11-09 Neil Booth + + * cpphash.c: Move cpp_defined here from cpplib.c. + * cpplib.c: Update comments, move cpp_defined to cpphash.c. + * cpplex.c (_cpp_lex_token): Don't leave the lexer at EOL. + * cppmacro.c (cpp_get_token): Update comments, no need now + to catch the CPP_EOF meaning EOL case. + 2000-11-08 Geoffrey Keating * config/sparc/sparc.c (sparc_va_arg): When the required alignment diff --git a/gcc/cpphash.c b/gcc/cpphash.c index 50172d174ce..4804c8fec50 100644 --- a/gcc/cpphash.c +++ b/gcc/cpphash.c @@ -281,3 +281,16 @@ cpp_forall_identifiers (pfile, cb, v) } while (++p < limit); } + +/* Determine whether the identifier ID, of length LEN, is a defined macro. */ +int +cpp_defined (pfile, id, len) + cpp_reader *pfile; + const U_CHAR *id; + int len; +{ + cpp_hashnode *hp = cpp_lookup (pfile, id, len); + + /* If it's of type NT_MACRO, it cannot be poisoned. */ + return hp->type == NT_MACRO; +} diff --git a/gcc/cpplex.c b/gcc/cpplex.c index fb5eec55929..9aff13d82b2 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -846,8 +846,7 @@ _cpp_lex_token (pfile, result) cppchar_t c; cpp_buffer *buffer; const unsigned char *comment_start; - unsigned char was_skip_newlines = pfile->state.skip_newlines; - unsigned char newline_in_args = 0; + unsigned char bol = pfile->state.skip_newlines; done_directive: buffer = pfile->buffer; @@ -884,33 +883,23 @@ _cpp_lex_token (pfile, result) goto next_char2; case '\n': case '\r': - /* Don't let directives spill over to the next line. */ - if (pfile->state.in_directive) - buffer->read_ahead = c; - else + if (!pfile->state.in_directive) { handle_newline (buffer, c); - + bol = 1; pfile->lexer_pos.output_line = buffer->lineno; - /* Skip newlines in macro arguments (except in directives). */ + /* Newlines in arguments are white space (6.10.3.10). + Otherwise, clear any white space flag. */ if (pfile->state.parsing_args) - { - /* Set the whitespace flag. */ - newline_in_args = 1; - result->flags |= PREV_WHITE; - goto next_char; - } - - if (was_skip_newlines) - { - /* Clear any whitespace flag. */ - result->flags &= ~PREV_WHITE; - goto next_char; - } + result->flags |= PREV_WHITE; + else + result->flags &= ~PREV_WHITE; + goto next_char; } - /* Next we're at BOL, so skip new lines. */ + /* Don't let directives spill over to the next line. */ + buffer->read_ahead = c; pfile->state.skip_newlines = 1; result->type = CPP_EOF; break; @@ -1172,12 +1161,16 @@ _cpp_lex_token (pfile, result) c = get_effective_char (buffer); if (c == '#') - ACCEPT_CHAR (CPP_PASTE); - else { - result->type = CPP_HASH; - do_hash: - if (newline_in_args) + ACCEPT_CHAR (CPP_PASTE); + break; + } + + result->type = CPP_HASH; + do_hash: + if (bol) + { + if (pfile->state.parsing_args) { /* 6.10.3 paragraph 11: If there are sequences of preprocessing tokens within the list of arguments that @@ -1200,11 +1193,11 @@ _cpp_lex_token (pfile, result) if (pfile->lexer_pos.col == 1) result->flags &= ~PREV_WHITE; } - else if (was_skip_newlines) + else { /* This is the hash introducing a directive. */ if (_cpp_handle_directive (pfile, result->flags & PREV_WHITE)) - goto done_directive; /* was_skip_newlines still 1. */ + goto done_directive; /* bol still 1. */ /* This is in fact an assembler #. */ } } diff --git a/gcc/cpplib.c b/gcc/cpplib.c index 1a9c483bb1e..fb346808625 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -1,4 +1,4 @@ -/* CPP Library. +/* CPP Library. (Directive handling.) Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. Contributed by Per Bothner, 1994-95. @@ -837,12 +837,7 @@ do_ident (pfile) to the front end. C99 defines three pragmas and says that no macro expansion is to be performed on them; whether or not macro expansion happens for other pragmas is implementation defined. - This implementation never macro-expands the text after #pragma. - - We currently do not support the _Pragma operator. Support for that - has to be coordinated with the front end. Proposed implementation: - both #pragma blah blah and _Pragma("blah blah") become - __builtin_pragma(blah blah) and we teach the parser about that. */ + This implementation never macro-expands the text after #pragma. */ /* Sub-handlers for the pragmas needing treatment here. They return 1 if the token buffer is to be popped, 0 if not. */ @@ -1700,19 +1695,6 @@ handle_assertion (pfile, str, type) run_directive (pfile, type, str, count, 0); } -/* Determine whether the identifier ID, of length LEN, is a defined macro. */ -int -cpp_defined (pfile, id, len) - cpp_reader *pfile; - const U_CHAR *id; - int len; -{ - cpp_hashnode *hp = cpp_lookup (pfile, id, len); - - /* If it's of type NT_MACRO, it cannot be poisoned. */ - return hp->type == NT_MACRO; -} - /* Allocate a new cpp_buffer for PFILE, and push it on the input buffer stack. If BUFFER != NULL, then use the LENGTH characters in BUFFER as the new input buffer. Return the new buffer, or NULL on diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c index 766a7197156..ec3590ea7e6 100644 --- a/gcc/cppmacro.c +++ b/gcc/cppmacro.c @@ -902,9 +902,10 @@ _cpp_pop_context (pfile) } /* Internal routine to return a token, either from an in-progress - macro expansion, or from the source file as appropriate. Handles - macros, so tokens returned are post-expansion. Does not filter - CPP_PLACEMARKER tokens. Returns CPP_EOF at EOL and EOF. */ + macro expansion, or from the source file as appropriate. + Transparently enters included files. Handles macros, so tokens + returned are post-expansion. Does not filter CPP_PLACEMARKER + tokens. Returns CPP_EOF at EOL and EOF. */ void _cpp_get_token (pfile, token) cpp_reader *pfile; @@ -929,6 +930,7 @@ _cpp_get_token (pfile, token) _cpp_pop_context (pfile); continue; } + /* End of argument pre-expansion. */ token->type = CPP_EOF; token->flags = 0; } @@ -981,12 +983,13 @@ _cpp_get_token (pfile, token) /* External interface to get a token. Tokens are returned after macro expansion and directives have been handled, as a continuous stream. - Transparently enters included files. CPP_EOF indicates end of - original source file. Filters out CPP_PLACEMARKER tokens. + Compared to the function above, CPP_EOF means EOF, and placemarker + tokens are filtered out. Also, it skips tokens if we're skipping, + and saves tokens to lookahead. - For the benefit of #pragma callbacks which may want to get the - pragma's tokens, returns CPP_EOF to indicate end-of-directive in - this case. */ + CPP_EOF indicates end of original source file. For the benefit of + #pragma callbacks which may want to get the pragma's tokens, + returns CPP_EOF to indicate end-of-directive in this case. */ void cpp_get_token (pfile, token) cpp_reader *pfile; @@ -997,13 +1000,7 @@ cpp_get_token (pfile, token) _cpp_get_token (pfile, token); if (token->type == CPP_EOF) - { - /* In directives we should pass through EOLs for the callbacks. */ - if (pfile->buffer->cur == pfile->buffer->rlimit - || pfile->state.in_directive || pfile->state.parsing_args) - break; - continue; - } + break; /* We are not merging the PREV_WHITE of CPP_PLACEMARKERS. I don't think it really matters. */ else if (pfile->skipping || token->type == CPP_PLACEMARKER) -- 2.30.2