diff options
author | Zack Weinberg <zack@wolery.cumb.org> | 2000-03-01 00:57:09 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2000-03-01 00:57:09 +0000 |
commit | ba412f14ad13a1e71af1aebe1ee97c6591e1f12e (patch) | |
tree | 68077897eecebf1187d9c261fbded410af33eaf4 /gcc/cppexp.c | |
parent | 38769add25b9fb5b4d60e98c60ab2d6fb8bf0854 (diff) | |
download | gcc-ba412f14ad13a1e71af1aebe1ee97c6591e1f12e.zip gcc-ba412f14ad13a1e71af1aebe1ee97c6591e1f12e.tar.gz gcc-ba412f14ad13a1e71af1aebe1ee97c6591e1f12e.tar.bz2 |
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
Diffstat (limited to 'gcc/cppexp.c')
-rw-r--r-- | gcc/cppexp.c | 106 |
1 files changed, 59 insertions, 47 deletions
diff --git a/gcc/cppexp.c b/gcc/cppexp.c index f659559..ec9fecf 100644 --- a/gcc/cppexp.c +++ b/gcc/cppexp.c @@ -81,6 +81,7 @@ static HOST_WIDEST_INT left_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT, int, u static HOST_WIDEST_INT right_shift PARAMS ((cpp_reader *, HOST_WIDEST_INT, int, unsigned HOST_WIDEST_INT)); static struct operation parse_number PARAMS ((cpp_reader *, U_CHAR *, U_CHAR *)); static struct operation parse_charconst PARAMS ((cpp_reader *, U_CHAR *, U_CHAR *)); +static struct operation parse_defined PARAMS ((cpp_reader *)); static struct operation cpp_lex PARAMS ((cpp_reader *, int)); extern HOST_WIDEST_INT cpp_parse_expr PARAMS ((cpp_reader *)); static HOST_WIDEST_INT cpp_parse_escape PARAMS ((cpp_reader *, U_CHAR **, HOST_WIDEST_INT)); @@ -349,6 +350,53 @@ parse_charconst (pfile, start, end) return op; } +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++; + token = get_directive_token (pfile); + if (token == CPP_LPAREN) + { + paren++; + CPP_SET_WRITTEN (pfile, old_written); + token = get_directive_token (pfile); + } + + 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) + { + if (get_directive_token (pfile) != CPP_RPAREN) + 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; +} + struct token { const char *operator; @@ -389,7 +437,7 @@ cpp_lex (pfile, skip_evaluation) tok_end = CPP_PWRITTEN (pfile); CPP_SET_WRITTEN (pfile, old_written); switch (token) - { + { case CPP_EOF: /* Should not happen ... */ case CPP_VSPACE: op.op = 0; @@ -407,51 +455,22 @@ cpp_lex (pfile, skip_evaluation) return parse_charconst (pfile, tok_start, tok_end); case CPP_NAME: + if (!strcmp (tok_start, "defined")) + return parse_defined (pfile); + op.op = INT; op.unsignedp = 0; op.value = 0; - if (strcmp (tok_start, "defined")) - { - if (CPP_WARN_UNDEF (pfile) && !skip_evaluation) - cpp_warning (pfile, "`%.*s' is not defined", - (int) (tok_end - tok_start), tok_start); - } - else - { - int paren = 0, len; - U_CHAR *tok; - - pfile->no_macro_expand++; - token = get_directive_token (pfile); - if (token == CPP_LPAREN) - { - paren++; - CPP_SET_WRITTEN (pfile, old_written); - token = get_directive_token (pfile); - } - if (token != CPP_NAME) - goto oops; - - tok = pfile->token_buffer + old_written; - len = CPP_PWRITTEN (pfile) - tok; - if (cpp_defined (pfile, tok, len)) - op.value = 1; - - if (paren) - { - if (get_directive_token (pfile) != CPP_RPAREN) - goto oops; - } - CPP_SET_WRITTEN (pfile, old_written); - pfile->no_macro_expand--; - } + if (CPP_WARN_UNDEF (pfile) && !skip_evaluation) + cpp_warning (pfile, "`%.*s' is not defined", + (int) (tok_end - tok_start), tok_start); return op; - oops: - CPP_SET_WRITTEN (pfile, old_written); - pfile->no_macro_expand--; - cpp_error (pfile, "`defined' without an identifier"); + case CPP_ASSERTION: + op.op = INT; + op.unsignedp = 0; + op.value = cpp_defined (pfile, tok_start, tok_end - tok_start); return op; case CPP_OTHER: @@ -468,13 +487,6 @@ cpp_lex (pfile, skip_evaluation) op.op = toktab->token; return op; } - else if (tok_start + 1 == tok_end && *tok_start == '#') - { - CPP_FORWARD (CPP_BUFFER (pfile), -1); - op.op = INT; - op.value = cpp_read_check_assertion (pfile); - return op; - } /* fall through */ default: op.op = *tok_start; |