1/* Default error handlers for CPP Library.
2   Copyright (C) 1986, 87, 89, 92-95, 98, 1999 Free Software Foundation, Inc.
3   Written by Per Bothner, 1994.
4   Based on CCCP program by Paul Rubin, June 1986
5   Adapted to ANSI C, Richard Stallman, Jan 1987
6
7This program is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
9Free Software Foundation; either version 2, or (at your option) any
10later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21 In other words, you are welcome to use, share and improve this program.
22 You are forbidden to forbid anyone else to use, share and improve
23 what you give them.   Help stamp out software-hoarding!  */
24
25#ifndef EMACS
26#include "config.h"
27#include "system.h"
28#else
29#include <stdio.h>
30#endif /* not EMACS */
31
32#include "cpplib.h"
33#include "intl.h"
34
35/* Print the file names and line numbers of the #include
36   commands which led to the current file.  */
37
38void
39cpp_print_containing_files (pfile)
40     cpp_reader *pfile;
41{
42  cpp_buffer *ip;
43  int first = 1;
44
45  /* If stack of files hasn't changed since we last printed
46     this info, don't repeat it.  */
47  if (pfile->input_stack_listing_current)
48    return;
49
50  ip = cpp_file_buffer (pfile);
51
52  /* Give up if we don't find a source file.  */
53  if (ip == NULL)
54    return;
55
56  /* Find the other, outer source files.  */
57  while ((ip = CPP_PREV_BUFFER (ip)), ip != CPP_NULL_BUFFER (pfile))
58    {
59      long line, col;
60      cpp_buf_line_and_col (ip, &line, &col);
61      if (ip->fname != NULL)
62	{
63	  if (first)
64	    {
65	      first = 0;
66	      cpp_notice ("In file included from %s:%ld",
67			  ip->nominal_fname, line);
68	    }
69	  else
70	    cpp_message (pfile, -1, ",\n                 from %s:%ld",
71			 ip->nominal_fname, line);
72	}
73    }
74  if (! first)
75    fputs (":\n", stderr);
76
77  /* Record we have printed the status as of this time.  */
78  pfile->input_stack_listing_current = 1;
79}
80
81void
82cpp_file_line_for_message (pfile, filename, line, column)
83     cpp_reader *pfile ATTRIBUTE_UNUSED;
84     char *filename;
85     int line, column;
86{
87  if (column > 0)
88    fprintf (stderr, "%s:%d:%d: ", filename, line, column);
89  else
90    fprintf (stderr, "%s:%d: ", filename, line);
91}
92
93/* IS_ERROR is 2 for "fatal" error, 1 for error, 0 for warning, -1 for notice */
94
95void
96v_cpp_message (pfile, is_error, msgid, ap)
97  cpp_reader * pfile;
98  int is_error;
99  const char *msgid;
100  va_list ap;
101{
102  switch (is_error)
103    {
104    case -1:
105      break;
106    case 0:
107      fprintf (stderr, _("warning: "));
108      break;
109    case 1:
110      if (pfile->errors < CPP_FATAL_LIMIT)
111	pfile->errors++;
112      break;
113    case 2:
114      pfile->errors = CPP_FATAL_LIMIT;
115      break;
116    default:
117      cpp_fatal (pfile, "internal error: bad is_error(%d) in v_cpp_message", is_error);
118    }
119
120  vfprintf (stderr, _(msgid), ap);
121
122  if (0 <= is_error)
123    fprintf (stderr, "\n");
124}
125
126void
127cpp_message VPROTO ((cpp_reader *pfile, int is_error, const char *msgid, ...))
128{
129#ifndef ANSI_PROTOTYPES
130  cpp_reader *pfile;
131  int is_error;
132  const char *msgid;
133#endif
134  va_list ap;
135
136  VA_START (ap, msgid);
137
138#ifndef ANSI_PROTOTYPES
139  pfile = va_arg (ap, cpp_reader *);
140  is_error = va_arg (ap, int);
141  msgid = va_arg (ap, const char *);
142#endif
143
144  v_cpp_message(pfile, is_error, msgid, ap);
145  va_end(ap);
146}
147
148/* Same as cpp_error, except we consider the error to be "fatal",
149   such as inconsistent options.  I.e. there is little point in continuing.
150   (We do not exit, to support use of cpplib as a library.
151   Instead, it is the caller's responsibility to check
152   CPP_FATAL_ERRORS.  */
153
154void
155cpp_fatal VPROTO ((cpp_reader *pfile, const char *msgid, ...))
156{
157#ifndef ANSI_PROTOTYPES
158  cpp_reader *pfile;
159  const char *msgid;
160#endif
161  va_list ap;
162
163  VA_START (ap, msgid);
164
165#ifndef ANSI_PROTOTYPES
166  pfile = va_arg (ap, cpp_reader *);
167  msgid = va_arg (ap, const char *);
168#endif
169
170  fprintf (stderr, "%s: ", progname);
171  v_cpp_message (pfile, 2, msgid, ap);
172  va_end(ap);
173}
174
175void
176cpp_pfatal_with_name (pfile, name)
177     cpp_reader *pfile;
178     const char *name;
179{
180  cpp_perror_with_name (pfile, name);
181#ifdef VMS
182  exit (vaxc$errno);
183#else
184  exit (FATAL_EXIT_CODE);
185#endif
186}
187
188/* Print an error message.  */
189
190void
191cpp_notice VPROTO ((const char *msgid, ...))
192{
193#ifndef ANSI_PROTOTYPES
194  const char *msgid;
195#endif
196  va_list ap;
197
198  VA_START (ap, msgid);
199
200#ifndef ANSI_PROTOTYPES
201  msgid = va_arg (ap, const char *);
202#endif
203
204  fprintf (stderr, "%s: ", progname);
205  v_cpp_message ((cpp_reader *) 0, -1, msgid, ap);
206  va_end(ap);
207}
208
209