X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libcpp%2Finit.c;h=5ba666650e8e465508e9853f552f06050601336f;hb=c3068ac082e3c5d2efa93da0afb4daf788e4b147;hp=0db167c133c4ed287c741642a2d4e31fd9de94cb;hpb=2ad0b097c1c8904b22684e42942913dd6fbf6308;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libcpp/init.c b/libcpp/init.c index 0db167c133c..5ba666650e8 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -1,13 +1,14 @@ /* CPP Library. Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, + 2009, 2010 Free Software Foundation, Inc. Contributed by Per Bothner, 1994-95. Based on CCCP program by Paul Rubin, June 1986 Adapted to ANSI C, Richard Stallman, Jan 1987 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 +Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,8 +17,8 @@ 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 -Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +along with this program; see the file COPYING3. If not see +. */ #include "config.h" #include "system.h" @@ -25,9 +26,10 @@ Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "internal.h" #include "mkdeps.h" #include "localedir.h" +#include "filenames.h" static void init_library (void); -static void mark_named_operators (cpp_reader *); +static void mark_named_operators (cpp_reader *, int); static void read_original_filename (cpp_reader *); static void read_original_directory (cpp_reader *); static void post_options (cpp_reader *); @@ -83,9 +85,11 @@ static const struct lang_flags lang_defaults[] = { /* c99 c++ xnum xid std // digr ulit */ /* GNUC89 */ { 0, 0, 1, 0, 0, 1, 1, 0 }, /* GNUC99 */ { 1, 0, 1, 0, 0, 1, 1, 1 }, + /* GNUC1X */ { 1, 0, 1, 0, 0, 1, 1, 1 }, /* STDC89 */ { 0, 0, 0, 0, 1, 0, 0, 0 }, /* STDC94 */ { 0, 0, 0, 0, 1, 0, 1, 0 }, /* STDC99 */ { 1, 0, 1, 0, 1, 1, 1, 0 }, + /* STDC1X */ { 1, 0, 1, 0, 1, 1, 1, 0 }, /* GNUCXX */ { 0, 1, 1, 0, 0, 1, 1, 0 }, /* CXX98 */ { 0, 1, 1, 0, 1, 1, 1, 0 }, /* GNUCXX0X */ { 1, 1, 1, 0, 0, 1, 1, 1 }, @@ -153,13 +157,12 @@ cpp_create_reader (enum c_lang lang, hash_table *table, CPP_OPTION (pfile, warn_multichar) = 1; CPP_OPTION (pfile, discard_comments) = 1; CPP_OPTION (pfile, discard_comments_in_macro_exp) = 1; - CPP_OPTION (pfile, show_column) = 1; CPP_OPTION (pfile, tabstop) = 8; CPP_OPTION (pfile, operator_names) = 1; CPP_OPTION (pfile, warn_trigraphs) = 2; CPP_OPTION (pfile, warn_endif_labels) = 1; - CPP_OPTION (pfile, warn_deprecated) = 1; - CPP_OPTION (pfile, warn_long_long) = !CPP_OPTION (pfile, c99); + CPP_OPTION (pfile, cpp_warn_deprecated) = 1; + CPP_OPTION (pfile, cpp_warn_long_long) = 0; CPP_OPTION (pfile, dollars_in_ident) = 1; CPP_OPTION (pfile, warn_dollars) = 1; CPP_OPTION (pfile, warn_variadic_macros) = 1; @@ -215,6 +218,9 @@ cpp_create_reader (enum c_lang lang, hash_table *table, pfile->a_buff = _cpp_get_buff (pfile, 0); pfile->u_buff = _cpp_get_buff (pfile, 0); + /* Initialize table for push_macro/pop_macro. */ + pfile->pushed_macros = 0; + /* The expression parser stack. */ _cpp_expand_op_stack (pfile); @@ -244,15 +250,16 @@ void cpp_destroy (cpp_reader *pfile) { cpp_context *context, *contextn; + struct def_pragma_macro *pmacro; tokenrun *run, *runn; + int i; free (pfile->op_stack); while (CPP_BUFFER (pfile) != NULL) _cpp_pop_buffer (pfile); - if (pfile->out.base) - free (pfile->out.base); + free (pfile->out.base); if (pfile->macro_buffer) { @@ -287,6 +294,25 @@ cpp_destroy (cpp_reader *pfile) free (context); } + if (pfile->comments.entries) + { + for (i = 0; i < pfile->comments.count; i++) + free (pfile->comments.entries[i].comment); + + free (pfile->comments.entries); + } + if (pfile->pushed_macros) + { + do + { + pmacro = pfile->pushed_macros; + pfile->pushed_macros = pmacro->next; + free (pmacro->name); + free (pmacro); + } + while (pfile->pushed_macros); + } + free (pfile); } @@ -297,7 +323,7 @@ cpp_destroy (cpp_reader *pfile) "builtin" macros: these are handled by builtin_macro() in macro.c. Builtin is somewhat of a misnomer -- the property of interest is that these macros require special code to compute their - expansions. The value is a "builtin_type" enumerator. + expansions. The value is a "cpp_builtin_type" enumerator. operator_array holds the C++ named operators. These are keywords which act as aliases for punctuators. In C++, they cannot be @@ -356,7 +382,7 @@ static const struct builtin_operator operator_array[] = /* Mark the C++ named operators in the hash table. */ static void -mark_named_operators (cpp_reader *pfile) +mark_named_operators (cpp_reader *pfile, int flags) { const struct builtin_operator *b; @@ -365,12 +391,30 @@ mark_named_operators (cpp_reader *pfile) b++) { cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len); - hp->flags |= NODE_OPERATOR; + hp->flags |= flags; hp->is_directive = 0; hp->directive_index = b->value; } } +/* Helper function of cpp_type2name. Return the string associated with + named operator TYPE. */ +const char * +cpp_named_operator2name (enum cpp_ttype type) +{ + const struct builtin_operator *b; + + for (b = operator_array; + b < (operator_array + ARRAY_SIZE (operator_array)); + b++) + { + if (type == b->value) + return (const char *) b->name; + } + + return NULL; +} + void cpp_init_special_builtins (cpp_reader *pfile) { @@ -391,7 +435,7 @@ cpp_init_special_builtins (cpp_reader *pfile) if (b->always_warn_if_redefined || CPP_OPTION (pfile, warn_builtin_macro_redefined)) hp->flags |= NODE_WARN; - hp->value.builtin = (enum builtin_type) b->value; + hp->value.builtin = (enum cpp_builtin_type) b->value; } } @@ -414,6 +458,9 @@ cpp_init_builtins (cpp_reader *pfile, int hosted) _cpp_define_builtin (pfile, "__ASSEMBLER__ 1"); else if (CPP_OPTION (pfile, lang) == CLK_STDC94) _cpp_define_builtin (pfile, "__STDC_VERSION__ 199409L"); + else if (CPP_OPTION (pfile, lang) == CLK_STDC1X + || CPP_OPTION (pfile, lang) == CLK_GNUC1X) + _cpp_define_builtin (pfile, "__STDC_VERSION__ 201000L"); else if (CPP_OPTION (pfile, c99)) _cpp_define_builtin (pfile, "__STDC_VERSION__ 199901L"); @@ -484,13 +531,20 @@ static void sanity_checks (cpp_reader *pfile) void cpp_post_options (cpp_reader *pfile) { + int flags; + sanity_checks (pfile); post_options (pfile); /* Mark named operators before handling command line macros. */ + flags = 0; if (CPP_OPTION (pfile, cplusplus) && CPP_OPTION (pfile, operator_names)) - mark_named_operators (pfile); + flags |= NODE_OPERATOR; + if (CPP_OPTION (pfile, warn_cxx_operator_names)) + flags |= NODE_DIAGNOSTIC | NODE_WARN_OPERATOR; + if (flags != 0) + mark_named_operators (pfile, flags); } /* Setup for processing input from the file named FNAME, or stdin if @@ -545,9 +599,9 @@ read_original_filename (cpp_reader *pfile) pfile->state.in_directive = 0; /* If it's a #line directive, handle it. */ - if (token1->type == CPP_NUMBER) + if (token1->type == CPP_NUMBER + && _cpp_handle_directive (pfile, token->flags & PREV_WHITE)) { - _cpp_handle_directive (pfile, token->flags & PREV_WHITE); read_original_directory (pfile); return; } @@ -586,8 +640,8 @@ read_original_directory (cpp_reader *pfile) if (token->type != CPP_STRING || ! (token->val.str.len >= 5 - && token->val.str.text[token->val.str.len-2] == '/' - && token->val.str.text[token->val.str.len-3] == '/')) + && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-2]) + && IS_DIR_SEPARATOR (token->val.str.text[token->val.str.len-3]))) { _cpp_backup_tokens (pfile, 3); return; @@ -606,12 +660,11 @@ read_original_directory (cpp_reader *pfile) } /* This is called at the end of preprocessing. It pops the last - buffer and writes dependency output, and returns the number of - errors. + buffer and writes dependency output. Maybe it should also reset state, such that you could call cpp_start_read with a new filename to restart processing. */ -int +void cpp_finish (cpp_reader *pfile, FILE *deps_stream) { /* Warn about unused macros before popping the final buffer. */ @@ -626,9 +679,8 @@ cpp_finish (cpp_reader *pfile, FILE *deps_stream) while (pfile->buffer) _cpp_pop_buffer (pfile); - /* Don't write the deps file if there are errors. */ if (CPP_OPTION (pfile, deps.style) != DEPS_NONE - && deps_stream && pfile->errors == 0) + && deps_stream) { deps_write (pfile->deps, deps_stream, 72); @@ -639,8 +691,6 @@ cpp_finish (cpp_reader *pfile, FILE *deps_stream) /* Report on headers that could use multiple include guards. */ if (CPP_OPTION (pfile, print_include_names)) _cpp_report_missing_guards (pfile); - - return pfile->errors; } static void @@ -648,7 +698,7 @@ post_options (cpp_reader *pfile) { /* -Wtraditional is not useful in C++ mode. */ if (CPP_OPTION (pfile, cplusplus)) - CPP_OPTION (pfile, warn_traditional) = 0; + CPP_OPTION (pfile, cpp_warn_traditional) = 0; /* Permanently disable macro expansion if we are rescanning preprocessed text. Read preprocesed source in ISO mode. */ @@ -666,8 +716,6 @@ post_options (cpp_reader *pfile) { CPP_OPTION (pfile, cplusplus_comments) = 0; - /* Traditional CPP does not accurately track column information. */ - CPP_OPTION (pfile, show_column) = 0; CPP_OPTION (pfile, trigraphs) = 0; CPP_OPTION (pfile, warn_trigraphs) = 0; }