source: trunk/third/gcc/cp/errfn.c @ 8834

Revision 8834, 4.9 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
Line 
1/* Provide a call-back mechanism for handling error output.
2   Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
3   Contributed by Jason Merrill (jason@cygnus.com)
4
5   This file is part of GNU CC.
6
7GNU CC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU CC 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 GNU CC; see the file COPYING.  If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA.  */
21   
22#include "config.h"
23#include "tree.h"
24#include <ctype.h>
25
26/* cp_printer is the type of a function which converts an argument into
27   a string for digestion by printf.  The cp_printer function should deal
28   with all memory management; the functions in this file will not free
29   the char*s returned.  See error.c for an example use of this code.  */
30
31typedef char* cp_printer PROTO((HOST_WIDE_INT, int));
32extern cp_printer * cp_printers[256];
33
34/* Whether or not we should try to be quiet for errors and warnings; this is
35   used to avoid being too talkative about problems with tentative choices
36   when we're computing the conversion costs for a method call.  */
37int cp_silent = 0;
38
39typedef void errorfn ();        /* deliberately vague */
40
41extern char* cp_file_of PROTO((tree));
42extern int   cp_line_of PROTO((tree));
43
44#define STRDUP(f) (ap = (char *) alloca (strlen (f) +1), strcpy (ap, (f)), ap)
45
46#define NARGS 4
47#define arglist a1, a2, a3, a4
48#define arglist_dcl HOST_WIDE_INT a1, a2, a3, a4;
49#define ARGSINIT args[0] = a1; args[1] = a2; args[2] = a3; args[3] = a4;
50#define ARGSLIST args[0], args[1], args[2], args[3]
51
52static void
53cp_thing (errfn, atarg1, format, arglist)
54     errorfn *errfn;
55     int atarg1;
56     char *format;
57     arglist_dcl
58{
59  char *fmt;
60  char *f;
61  char *ap;
62  int arg;
63  HOST_WIDE_INT atarg = atarg1 ? a1 : 0;
64  HOST_WIDE_INT args[NARGS];
65  ARGSINIT
66
67  fmt = STRDUP(format);
68 
69  for (f = fmt, arg = 0; *f; ++f)
70    {
71      cp_printer * function;
72      int alternate;
73      int maybe_here;
74     
75      /* ignore text */
76      if (*f != '%') continue;
77
78      ++f;
79
80      alternate = 0;
81      maybe_here = 0;
82
83      /* ignore most flags */
84      while (*f == ' ' || *f == '-' || *f == '+' || *f == '#')
85        {
86          if (*f == '+')
87            maybe_here = 1;
88          else if (*f == '#')
89            alternate = 1;
90          ++f;
91        }
92
93      /* ignore field width */
94      if (*f == '*')
95        {
96          ++f;
97          ++arg;
98        }
99      else
100        while (isdigit (*f))
101          ++f;
102
103      /* ignore precision */
104      if (*f == '.')
105        {
106          ++f;
107          if (*f == '*')
108            {
109              ++f;
110              ++arg;
111            }
112          else
113            while (isdigit (*f))
114              ++f;
115        }
116
117      /* ignore "long" */
118      if (*f == 'l')
119        ++f;
120
121      function = cp_printers[(int)*f];
122
123      if (function)
124        {
125          char *p;
126
127          if (arg >= NARGS) abort ();
128         
129          if (maybe_here && atarg1)
130            atarg = args[arg];
131
132          /* Must use a temporary to avoid calling *function twice */
133          p = (*function) (args[arg], alternate);
134          args[arg] = (HOST_WIDE_INT) STRDUP(p);
135          *f = 's';
136        }
137
138      ++arg;                    /* Assume valid format string */
139
140    }
141
142  if (atarg)
143    {
144      char *file = cp_file_of ((tree) atarg);
145      int   line = cp_line_of ((tree) atarg);
146      (*errfn) (file, line, fmt, ARGSLIST);
147    }
148  else
149    (*errfn) (fmt, ARGSLIST);
150
151}
152
153void
154cp_error (format, arglist)
155     char *format;
156     arglist_dcl
157{
158  extern errorfn error;
159  if (! cp_silent)
160    cp_thing (error, 0, format, arglist);
161}
162
163void
164cp_warning (format, arglist)
165     char *format;
166     arglist_dcl
167{
168  extern errorfn warning;
169  if (! cp_silent)
170    cp_thing (warning, 0, format, arglist);
171}
172
173void
174cp_pedwarn (format, arglist)
175     char *format;
176     arglist_dcl
177{
178  extern errorfn pedwarn;
179  if (! cp_silent)
180    cp_thing (pedwarn, 0, format, arglist);
181}
182
183void
184cp_compiler_error (format, arglist)
185     char *format;
186     arglist_dcl
187{
188  extern errorfn compiler_error;
189  if (! cp_silent)
190    cp_thing (compiler_error, 0, format, arglist);
191}
192
193void
194cp_sprintf (format, arglist)
195     char *format;
196     arglist_dcl
197{
198  extern errorfn sprintf;
199  cp_thing (sprintf, 0, format, arglist);
200}
201
202void
203cp_error_at (format, arglist)
204     char *format;
205     arglist_dcl
206{
207  extern errorfn error_with_file_and_line;
208  if (! cp_silent)
209    cp_thing (error_with_file_and_line, 1, format, arglist);
210}
211
212void
213cp_warning_at (format, arglist)
214     char *format;
215     arglist_dcl
216{
217  extern errorfn warning_with_file_and_line;
218  if (! cp_silent)
219    cp_thing (warning_with_file_and_line, 1, format, arglist);
220}
221
222void
223cp_pedwarn_at (format, arglist)
224     char *format;
225     arglist_dcl
226{
227  extern errorfn pedwarn_with_file_and_line;
228  if (! cp_silent)
229    cp_thing (pedwarn_with_file_and_line, 1, format, arglist);
230}
Note: See TracBrowser for help on using the repository browser.