X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcpperror.c;h=61763cc1826f7e53c14139c2f84f65a3b657d431;hb=648298e892dac93092649dbe92a8865adbe51748;hp=4a4cc07c1842836f7a797305e09809a9dc565c74;hpb=ab65399b4c8e0f7ab9e88b3b64bbb37d537882ed;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cpperror.c b/gcc/cpperror.c index 4a4cc07c184..61763cc1826 100644 --- a/gcc/cpperror.c +++ b/gcc/cpperror.c @@ -1,5 +1,6 @@ /* Default error handlers for CPP Library. - Copyright (C) 1986, 87, 89, 92-95, 98, 1999 Free Software Foundation, Inc. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998, 1999, 2000, + 2001, 2002 Free Software Foundation, Inc. Written by Per Bothner, 1994. Based on CCCP program by Paul Rubin, June 1986 Adapted to ANSI C, Richard Stallman, Jan 1987 @@ -22,187 +23,155 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. You are forbidden to forbid anyone else to use, share and improve what you give them. Help stamp out software-hoarding! */ -#ifndef EMACS #include "config.h" #include "system.h" -#else -#include -#endif /* not EMACS */ - #include "cpplib.h" +#include "cpphash.h" #include "intl.h" -/* Print the file names and line numbers of the #include - commands which led to the current file. */ +static void print_location (cpp_reader *, fileline, unsigned int); -void -cpp_print_containing_files (pfile) - cpp_reader *pfile; +/* Print the logical file location (LINE, COL) in preparation for a + diagnostic. Outputs the #include chain if it has changed. A line + of zero suppresses the include stack, and outputs the program name + instead. */ +static void +print_location (cpp_reader *pfile, fileline line, unsigned int col) { - cpp_buffer *ip; - int first = 1; + if (line == 0) + fprintf (stderr, "%s: ", progname); + else + { + const struct line_map *map; + unsigned int lin; - /* If stack of files hasn't changed since we last printed - this info, don't repeat it. */ - if (pfile->input_stack_listing_current) - return; + map = linemap_lookup (&pfile->line_maps, line); + linemap_print_containing_files (&pfile->line_maps, map); - ip = cpp_file_buffer (pfile); + lin = SOURCE_LINE (map, line); + if (col == 0) + col = 1; - /* Give up if we don't find a source file. */ - if (ip == NULL) - return; + if (lin == 0) + fprintf (stderr, "%s:", map->to_file); + else if (CPP_OPTION (pfile, show_column) == 0) + fprintf (stderr, "%s:%u:", map->to_file, lin); + else + fprintf (stderr, "%s:%u:%u:", map->to_file, lin, col); - /* Find the other, outer source files. */ - while ((ip = CPP_PREV_BUFFER (ip)), ip != CPP_NULL_BUFFER (pfile)) + fputc (' ', stderr); + } +} + +/* Set up for a diagnostic: print the file and line, bump the error + counter, etc. LINE is the logical line number; zero means to print + at the location of the previously lexed token, which tends to be + the correct place by default. Returns 0 if the error has been + suppressed. */ +int +_cpp_begin_message (cpp_reader *pfile, int code, fileline line, + unsigned int column) +{ + int level = CPP_DL_EXTRACT (code); + + switch (level) { - long line, col; - cpp_buf_line_and_col (ip, &line, &col); - if (ip->fname != NULL) + case CPP_DL_WARNING: + case CPP_DL_PEDWARN: + if (CPP_IN_SYSTEM_HEADER (pfile) + && ! CPP_OPTION (pfile, warn_system_headers)) + return 0; + /* Fall through. */ + + case CPP_DL_WARNING_SYSHDR: + if (CPP_OPTION (pfile, warnings_are_errors) + || (level == CPP_DL_PEDWARN && CPP_OPTION (pfile, pedantic_errors))) { - if (first) - { - first = 0; - cpp_notice ("In file included from "); - } - else - cpp_notice (",\n from "); + if (CPP_OPTION (pfile, inhibit_errors)) + return 0; + level = CPP_DL_ERROR; + pfile->errors++; } + else if (CPP_OPTION (pfile, inhibit_warnings)) + return 0; + break; - fprintf (stderr, " from %s:%ld", ip->nominal_fname, line); + case CPP_DL_ERROR: + if (CPP_OPTION (pfile, inhibit_errors)) + return 0; + /* ICEs cannot be inhibited. */ + case CPP_DL_ICE: + pfile->errors++; + break; } - if (! first) - fprintf (stderr, ":\n"); - /* Record we have printed the status as of this time. */ - pfile->input_stack_listing_current = 1; -} + print_location (pfile, line, column); + if (CPP_DL_WARNING_P (level)) + fputs (_("warning: "), stderr); + else if (level == CPP_DL_ICE) + fputs (_("internal error: "), stderr); -void -cpp_file_line_for_message (pfile, filename, line, column) - cpp_reader *pfile ATTRIBUTE_UNUSED; - char *filename; - int line, column; -{ - if (column > 0) - fprintf (stderr, "%s:%d:%d: ", filename, line, column); - else - fprintf (stderr, "%s:%d: ", filename, line); + return 1; } -/* IS_ERROR is 2 for "fatal" error, 1 for error, 0 for warning, -1 for notice */ +/* Don't remove the blank before do, as otherwise the exgettext + script will mistake this as a function definition */ +#define v_message(msgid, ap) \ + do { vfprintf (stderr, _(msgid), ap); putc ('\n', stderr); } while (0) + +/* Exported interface. */ +/* Print an error at the location of the previously lexed token. */ void -v_cpp_message (pfile, is_error, msgid, ap) - cpp_reader * pfile; - int is_error; - const char *msgid; - va_list ap; +cpp_error (cpp_reader * pfile, int level, const char *msgid, ...) { - switch (is_error) + fileline line; + unsigned int column; + va_list ap; + + va_start (ap, msgid); + + if (CPP_OPTION (pfile, traditional)) { - case -1: - break; - case 0: - fprintf (stderr, _("warning: ")); - break; - case 1: - if (pfile->errors < CPP_FATAL_LIMIT) - pfile->errors++; - break; - case 2: - pfile->errors = CPP_FATAL_LIMIT; - break; - default: - abort (); + if (pfile->state.in_directive) + line = pfile->directive_line; + else + line = pfile->line; + column = 0; + } + else + { + line = pfile->cur_token[-1].line; + column = pfile->cur_token[-1].col; } - vfprintf (stderr, _(msgid), ap); + if (_cpp_begin_message (pfile, level, line, column)) + v_message (msgid, ap); - if (0 <= is_error) - fprintf (stderr, "\n"); + va_end (ap); } +/* Print an error at a specific location. */ void -cpp_message VPROTO ((cpp_reader *pfile, int is_error, const char *msgid, ...)) +cpp_error_with_line (cpp_reader *pfile, int level, + fileline line, unsigned int column, + const char *msgid, ...) { -#ifndef ANSI_PROTOTYPES - cpp_reader *pfile; - int is_error; - const char *msgid; -#endif va_list ap; - VA_START (ap, msgid); - -#ifndef ANSI_PROTOTYPES - pfile = va_arg (ap, cpp_reader *); - is_error = va_arg (ap, int); - msgid = va_arg (ap, const char *); -#endif - - v_cpp_message(pfile, is_error, msgid, ap); - va_end(ap); -} + va_start (ap, msgid); -/* Same as cpp_error, except we consider the error to be "fatal", - such as inconsistent options. I.e. there is little point in continuing. - (We do not exit, to support use of cpplib as a library. - Instead, it is the caller's responsibility to check - CPP_FATAL_ERRORS. */ + if (_cpp_begin_message (pfile, level, line, column)) + v_message (msgid, ap); -void -cpp_fatal VPROTO ((cpp_reader *pfile, const char *msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - cpp_reader *pfile; - const char *msgid; -#endif - va_list ap; - - VA_START (ap, msgid); - -#ifndef ANSI_PROTOTYPES - pfile = va_arg (ap, cpp_reader *); - msgid = va_arg (ap, const char *); -#endif - - fprintf (stderr, "%s: ", progname); - v_cpp_message (pfile, 2, msgid, ap); - va_end(ap); -} - -void -cpp_pfatal_with_name (pfile, name) - cpp_reader *pfile; - const char *name; -{ - cpp_perror_with_name (pfile, name); -#ifdef VMS - exit (vaxc$errno); -#else - exit (FATAL_EXIT_CODE); -#endif + va_end (ap); } -/* Print an error message. */ - void -cpp_notice VPROTO ((const char *msgid, ...)) -{ -#ifndef ANSI_PROTOTYPES - const char *msgid; -#endif - va_list ap; - - VA_START (ap, msgid); - -#ifndef ANSI_PROTOTYPES - msgid = va_arg (ap, const char *); -#endif +cpp_errno (cpp_reader *pfile, int level, const char *msgid) +{ + if (msgid[0] == '\0') + msgid = _("stdout"); - fprintf (stderr, "%s: ", progname); - v_cpp_message ((cpp_reader *) 0, -1, msgid, ap); - va_end(ap); + cpp_error (pfile, level, "%s: %s", msgid, xstrerror (errno)); } -