Commit 7f2f1a66 by Neil Booth Committed by Neil Booth

cppexp.c (parse_defined): Call cpp_get_token not _cpp_get_token.

	* cppexp.c (parse_defined): Call cpp_get_token not
	_cpp_get_token.
	(lex): Similarly.
	* cpplex.c (cpp_output_line): Similarly.
	* cpplib.c (glue_header_name, do_line, do_ident,
	parse_answer, parse_assertion): Similarly.
	(_cpp_handle_diretive): Don't save to lookaheads
	when processing directives.
	* cppmacro.c (parse_arg, expand_arg): Call cpp_get_token not
	_cpp_get_token.
	(funlike_invocation_p): Don't save to lookaheads
	when pre-expanding arguments.
	(_cpp_get_token): Delete.
	(cpp_get_token): Merge contents of _cpp_get_token.

From-SVN: r37462
parent f36d6244
2000-11-14 Neil Booth <neilb@earthling.net>
* cppexp.c (parse_defined): Call cpp_get_token not
_cpp_get_token.
(lex): Similarly.
* cpplex.c (cpp_output_line): Similarly.
* cpplib.c (glue_header_name, do_line, do_ident,
parse_answer, parse_assertion): Similarly.
(_cpp_handle_diretive): Don't save to lookaheads
when processing directives.
* cppmacro.c (parse_arg, expand_arg): Call cpp_get_token not
_cpp_get_token.
(funlike_invocation_p): Don't save to lookaheads
when pre-expanding arguments.
(_cpp_get_token): Delete.
(cpp_get_token): Merge contents of _cpp_get_token.
2000-11-14 Jakub Jelinek <jakub@redhat.com> 2000-11-14 Jakub Jelinek <jakub@redhat.com>
* builtins.c (expand_builtin_setjmp): Set * builtins.c (expand_builtin_setjmp): Set
......
...@@ -321,11 +321,11 @@ parse_defined (pfile) ...@@ -321,11 +321,11 @@ parse_defined (pfile)
/* Don't expand macros. */ /* Don't expand macros. */
pfile->state.prevent_expansion++; pfile->state.prevent_expansion++;
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
if (token.type == CPP_OPEN_PAREN) if (token.type == CPP_OPEN_PAREN)
{ {
paren = 1; paren = 1;
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
} }
if (token.type == CPP_NAME) if (token.type == CPP_NAME)
...@@ -333,7 +333,7 @@ parse_defined (pfile) ...@@ -333,7 +333,7 @@ parse_defined (pfile)
node = token.val.node; node = token.val.node;
if (paren) if (paren)
{ {
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
if (token.type != CPP_CLOSE_PAREN) if (token.type != CPP_CLOSE_PAREN)
{ {
cpp_error (pfile, "missing ')' after \"defined\""); cpp_error (pfile, "missing ')' after \"defined\"");
...@@ -378,13 +378,14 @@ lex (pfile, skip_evaluation, token) ...@@ -378,13 +378,14 @@ lex (pfile, skip_evaluation, token)
{ {
struct op op; struct op op;
_cpp_get_token (pfile, token); cpp_get_token (pfile, token);
switch (token->type) switch (token->type)
{ {
case CPP_INT: case CPP_INT:
case CPP_NUMBER: case CPP_NUMBER:
return parse_number (pfile, token); return parse_number (pfile, token);
case CPP_CHAR: case CPP_CHAR:
case CPP_WCHAR: case CPP_WCHAR:
return parse_charconst (pfile, token); return parse_charconst (pfile, token);
......
...@@ -158,7 +158,6 @@ extern int _cpp_begin_message PARAMS ((cpp_reader *, enum error_type, ...@@ -158,7 +158,6 @@ extern int _cpp_begin_message PARAMS ((cpp_reader *, enum error_type,
extern void _cpp_free_definition PARAMS ((cpp_hashnode *)); extern void _cpp_free_definition PARAMS ((cpp_hashnode *));
extern int _cpp_create_definition PARAMS ((cpp_reader *, cpp_hashnode *)); extern int _cpp_create_definition PARAMS ((cpp_reader *, cpp_hashnode *));
extern void _cpp_pop_context PARAMS ((cpp_reader *)); extern void _cpp_pop_context PARAMS ((cpp_reader *));
extern void _cpp_get_token PARAMS ((cpp_reader *, cpp_token *));
extern void _cpp_free_lookaheads PARAMS ((cpp_reader *)); extern void _cpp_free_lookaheads PARAMS ((cpp_reader *));
extern void _cpp_release_lookahead PARAMS ((cpp_reader *)); extern void _cpp_release_lookahead PARAMS ((cpp_reader *));
extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token *, extern void _cpp_push_token PARAMS ((cpp_reader *, const cpp_token *,
......
...@@ -1677,12 +1677,12 @@ cpp_output_line (pfile, fp) ...@@ -1677,12 +1677,12 @@ cpp_output_line (pfile, fp)
{ {
cpp_token token; cpp_token token;
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
token.flags &= ~PREV_WHITE; token.flags &= ~PREV_WHITE;
while (token.type != CPP_EOF) while (token.type != CPP_EOF)
{ {
cpp_output_token (&token, fp); cpp_output_token (&token, fp);
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
} }
putc ('\n', fp); putc ('\n', fp);
......
...@@ -183,7 +183,7 @@ skip_rest_of_line (pfile) ...@@ -183,7 +183,7 @@ skip_rest_of_line (pfile)
{ {
cpp_token token; cpp_token token;
/* Discard all lookaheads. */ /* Discard all input lookaheads. */
while (pfile->la_read) while (pfile->la_read)
_cpp_release_lookahead (pfile); _cpp_release_lookahead (pfile);
...@@ -221,18 +221,22 @@ _cpp_handle_directive (pfile, indented) ...@@ -221,18 +221,22 @@ _cpp_handle_directive (pfile, indented)
cpp_reader *pfile; cpp_reader *pfile;
int indented; int indented;
{ {
struct cpp_lookahead *la_saved;
cpp_buffer *buffer = pfile->buffer; cpp_buffer *buffer = pfile->buffer;
const directive *dir = 0; const directive *dir = 0;
cpp_token dname; cpp_token dname;
int not_asm = 1; int not_asm = 1;
/* Setup in-directive state. */
pfile->state.in_directive = 1;
pfile->state.save_comments = 0;
/* Some handlers need the position of the # for diagnostics. */ /* Some handlers need the position of the # for diagnostics. */
pfile->directive_pos = pfile->lexer_pos; pfile->directive_pos = pfile->lexer_pos;
/* We're now in a directive. This ensures we get pedantic warnings /* Don't save directive tokens for external clients. */
about /v and /f in whitespace. */ la_saved = pfile->la_write;
pfile->state.in_directive = 1; pfile->la_write = 0;
pfile->state.save_comments = 0;
/* Lex the directive name directly. */ /* Lex the directive name directly. */
_cpp_lex_token (pfile, &dname); _cpp_lex_token (pfile, &dname);
...@@ -334,6 +338,9 @@ _cpp_handle_directive (pfile, indented) ...@@ -334,6 +338,9 @@ _cpp_handle_directive (pfile, indented)
/* Save the lookahead token for assembler. */ /* Save the lookahead token for assembler. */
if (not_asm) if (not_asm)
skip_rest_of_line (pfile); skip_rest_of_line (pfile);
/* Restore state. */
pfile->la_write = la_saved;
pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
pfile->state.in_directive = 0; pfile->state.in_directive = 0;
pfile->state.angled_headers = 0; pfile->state.angled_headers = 0;
...@@ -496,7 +503,7 @@ glue_header_name (pfile, header) ...@@ -496,7 +503,7 @@ glue_header_name (pfile, header)
buffer = (unsigned char *) xmalloc (capacity); buffer = (unsigned char *) xmalloc (capacity);
for (;;) for (;;)
{ {
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
if (token.type == CPP_GREATER || token.type == CPP_EOF) if (token.type == CPP_GREATER || token.type == CPP_EOF)
break; break;
...@@ -703,7 +710,7 @@ do_line (pfile) ...@@ -703,7 +710,7 @@ do_line (pfile)
cpp_token token; cpp_token token;
/* #line commands expand macros. */ /* #line commands expand macros. */
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
if (token.type != CPP_NUMBER if (token.type != CPP_NUMBER
|| strtoul_for_line (token.val.str.text, token.val.str.len, &new_lineno)) || strtoul_for_line (token.val.str.text, token.val.str.len, &new_lineno))
{ {
...@@ -715,7 +722,7 @@ do_line (pfile) ...@@ -715,7 +722,7 @@ do_line (pfile)
if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap)) if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap))
cpp_pedwarn (pfile, "line number out of range"); cpp_pedwarn (pfile, "line number out of range");
_cpp_get_token (pfile, &token); cpp_get_token (pfile, &token);
if (token.type != CPP_EOF) if (token.type != CPP_EOF)
{ {
...@@ -829,7 +836,7 @@ do_ident (pfile) ...@@ -829,7 +836,7 @@ do_ident (pfile)
{ {
cpp_token str; cpp_token str;
_cpp_get_token (pfile, &str); cpp_get_token (pfile, &str);
if (str.type != CPP_STRING) if (str.type != CPP_STRING)
cpp_error (pfile, "invalid #ident"); cpp_error (pfile, "invalid #ident");
else if (pfile->cb.ident) else if (pfile->cb.ident)
...@@ -1403,7 +1410,7 @@ parse_answer (pfile, answerp, type) ...@@ -1403,7 +1410,7 @@ parse_answer (pfile, answerp, type)
token = &answer->first[answer->count]; token = &answer->first[answer->count];
} }
_cpp_get_token (pfile, token); cpp_get_token (pfile, token);
if (token->type == CPP_CLOSE_PAREN) if (token->type == CPP_CLOSE_PAREN)
break; break;
...@@ -1432,9 +1439,7 @@ parse_answer (pfile, answerp, type) ...@@ -1432,9 +1439,7 @@ parse_answer (pfile, answerp, type)
/* Parses an assertion, returning a pointer to the hash node of the /* Parses an assertion, returning a pointer to the hash node of the
predicate, or 0 on error. If an answer was supplied, it is placed predicate, or 0 on error. If an answer was supplied, it is placed
in ANSWERP, otherwise it is set to 0. We use _cpp_get_raw_token, in ANSWERP, otherwise it is set to 0. */
since we cannot assume tokens are consecutive in a #if statement
(we may be in a macro), and we don't want to macro expand. */
static cpp_hashnode * static cpp_hashnode *
parse_assertion (pfile, answerp, type) parse_assertion (pfile, answerp, type)
cpp_reader *pfile; cpp_reader *pfile;
...@@ -1451,7 +1456,7 @@ parse_assertion (pfile, answerp, type) ...@@ -1451,7 +1456,7 @@ parse_assertion (pfile, answerp, type)
pfile->string_pool = &pfile->ident_pool; pfile->string_pool = &pfile->ident_pool;
*answerp = 0; *answerp = 0;
_cpp_get_token (pfile, &predicate); cpp_get_token (pfile, &predicate);
if (predicate.type == CPP_EOF) if (predicate.type == CPP_EOF)
cpp_error (pfile, "assertion without predicate"); cpp_error (pfile, "assertion without predicate");
else if (predicate.type != CPP_NAME) else if (predicate.type != CPP_NAME)
......
...@@ -488,7 +488,7 @@ parse_arg (pfile, arg, var_args) ...@@ -488,7 +488,7 @@ parse_arg (pfile, arg, var_args)
token = &arg->first[arg->count]; token = &arg->first[arg->count];
} }
_cpp_get_token (pfile, token); cpp_get_token (pfile, token);
result = token->type; result = token->type;
if (result == CPP_OPEN_PAREN) if (result == CPP_OPEN_PAREN)
...@@ -619,7 +619,13 @@ funlike_invocation_p (pfile, node, list) ...@@ -619,7 +619,13 @@ funlike_invocation_p (pfile, node, list)
if (args) if (args)
{ {
if (node->value.macro->paramc > 0) if (node->value.macro->paramc > 0)
replace_args (pfile, node->value.macro, args, list); {
/* Don't save tokens during pre-expansion. */
struct cpp_lookahead *la_saved = pfile->la_write;
pfile->la_write = 0;
replace_args (pfile, node->value.macro, args, list);
pfile->la_write = la_saved;
}
free (args); free (args);
} }
...@@ -846,7 +852,7 @@ expand_arg (pfile, arg) ...@@ -846,7 +852,7 @@ expand_arg (pfile, arg)
xrealloc (arg->expanded, capacity * sizeof (cpp_token)); xrealloc (arg->expanded, capacity * sizeof (cpp_token));
} }
token = &arg->expanded[arg->expanded_count++]; token = &arg->expanded[arg->expanded_count++];
_cpp_get_token (pfile, token); cpp_get_token (pfile, token);
} }
while (token->type != CPP_EOF); while (token->type != CPP_EOF);
...@@ -872,12 +878,19 @@ _cpp_pop_context (pfile) ...@@ -872,12 +878,19 @@ _cpp_pop_context (pfile)
} }
} }
/* Internal routine to return a token, either from an in-progress /* Eternal routine to get a token. Also used nearly everywhere
macro expansion, or from the source file as appropriate. internally, except for places where we know we can safely call
Transparently enters included files. Handles macros, so tokens the lexer directly, such as lexing a directive name.
returned are post-expansion. Returns CPP_EOF at EOL and EOF. */
Macro expansions and directives are transparently handled,
including entering included files. Thus tokens are post-macro
expansion, and after any intervening directives. External callers
see CPP_EOF only at EOF. Internal callers also see it when meeting
a directive inside a macro call, when at the end of a directive and
state.in_directive is still 1, and at the end of argument
pre-expansion. */
void void
_cpp_get_token (pfile, token) cpp_get_token (pfile, token)
cpp_reader *pfile; cpp_reader *pfile;
cpp_token *token; cpp_token *token;
{ {
...@@ -897,6 +910,9 @@ _cpp_get_token (pfile, token) ...@@ -897,6 +910,9 @@ _cpp_get_token (pfile, token)
*token = *context->list.first++; *token = *context->list.first++;
token->flags |= flags; token->flags |= flags;
flags = 0; flags = 0;
/* PASTE_LEFT tokens can only appear in macro expansions. */
if (token->flags & PASTE_LEFT && !pfile->skipping)
paste_all_tokens (pfile, token);
} }
else else
{ {
...@@ -915,9 +931,6 @@ _cpp_get_token (pfile, token) ...@@ -915,9 +931,6 @@ _cpp_get_token (pfile, token)
if (pfile->skipping) if (pfile->skipping)
continue; continue;
if (token->flags & PASTE_LEFT)
paste_all_tokens (pfile, token);
if (token->type != CPP_NAME) if (token->type != CPP_NAME)
break; break;
...@@ -949,27 +962,10 @@ _cpp_get_token (pfile, token) ...@@ -949,27 +962,10 @@ _cpp_get_token (pfile, token)
if (token->val.node != pfile->spec_nodes.n__Pragma) if (token->val.node != pfile->spec_nodes.n__Pragma)
break; break;
/* Handle it, and get another token. */ /* Handle it, and loop back for another token. MI is cleared
pfile->mi_state = MI_FAILED; since this token came from either the lexer or a macro. */
_cpp_do__Pragma (pfile); _cpp_do__Pragma (pfile);
} }
}
/* External interface to get a token. Tokens are returned after macro
expansion and directives have been handled, as a continuous stream.
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.
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;
cpp_token *token;
{
_cpp_get_token (pfile, token);
if (pfile->la_write) if (pfile->la_write)
save_lookahead_token (pfile, token); save_lookahead_token (pfile, token);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment