OSDN Git Service

2010-05-16 Manuel López-Ibáñez <manu@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git] / gcc / ada / binderr.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              B I N D E R R                               --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2008, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 with Butil;  use Butil;
27 with Opt;    use Opt;
28 with Output; use Output;
29
30 package body Binderr is
31
32    ---------------
33    -- Error_Msg --
34    ---------------
35
36    procedure Error_Msg (Msg : String) is
37    begin
38       if Msg (Msg'First) = '?' then
39          if Warning_Mode = Suppress then
40             return;
41          end if;
42
43          if Warning_Mode = Treat_As_Error then
44             Errors_Detected := Errors_Detected + 1;
45          else
46             Warnings_Detected := Warnings_Detected + 1;
47          end if;
48
49       else
50          Errors_Detected := Errors_Detected + 1;
51       end if;
52
53       if Brief_Output or else (not Verbose_Mode) then
54          Set_Standard_Error;
55          Error_Msg_Output (Msg, Info => False);
56          Set_Standard_Output;
57       end if;
58
59       if Verbose_Mode then
60          if Errors_Detected + Warnings_Detected = 0 then
61             Write_Eol;
62          end if;
63
64          Error_Msg_Output (Msg, Info => False);
65       end if;
66
67       --  If too many warnings print message and then turn off warnings
68
69       if Warnings_Detected = Maximum_Messages then
70          Set_Standard_Error;
71          Write_Line ("maximum number of warnings reached");
72          Write_Line ("further warnings will be suppressed");
73          Set_Standard_Output;
74          Warning_Mode := Suppress;
75       end if;
76
77       --  If too many errors print message and give fatal error
78
79       if Errors_Detected = Maximum_Messages then
80          Set_Standard_Error;
81          Write_Line ("fatal error: maximum number of errors exceeded");
82          Set_Standard_Output;
83          raise Unrecoverable_Error;
84       end if;
85    end Error_Msg;
86
87    --------------------
88    -- Error_Msg_Info --
89    --------------------
90
91    procedure Error_Msg_Info (Msg : String) is
92    begin
93       if Brief_Output or else (not Verbose_Mode) then
94          Set_Standard_Error;
95          Error_Msg_Output (Msg, Info => True);
96          Set_Standard_Output;
97       end if;
98
99       if Verbose_Mode then
100          Error_Msg_Output (Msg, Info => True);
101       end if;
102
103    end Error_Msg_Info;
104
105    ----------------------
106    -- Error_Msg_Output --
107    ----------------------
108
109    procedure Error_Msg_Output (Msg : String; Info : Boolean) is
110       Use_Second_File : Boolean := False;
111       Use_Second_Unit : Boolean := False;
112       Use_Second_Nat  : Boolean := False;
113       Warning         : Boolean := False;
114
115    begin
116       if Warnings_Detected + Errors_Detected > Maximum_Messages then
117          Write_Str ("error: maximum errors exceeded");
118          Write_Eol;
119          return;
120       end if;
121
122       --  First, check for warnings
123
124       for J in Msg'Range loop
125          if Msg (J) = '?' then
126             Warning := True;
127             exit;
128          end if;
129       end loop;
130
131       if Warning then
132          Write_Str ("warning: ");
133       elsif Info then
134          if not Info_Prefix_Suppress then
135             Write_Str ("info:  ");
136          end if;
137       else
138          Write_Str ("error: ");
139       end if;
140
141       for J in Msg'Range loop
142          if Msg (J) = '%' then
143             Get_Name_String (Error_Msg_Name_1);
144             Write_Char ('"');
145             Write_Str (Name_Buffer (1 .. Name_Len));
146             Write_Char ('"');
147
148          elsif Msg (J) = '{' then
149             if Use_Second_File then
150                Get_Name_String (Error_Msg_File_2);
151             else
152                Use_Second_File := True;
153                Get_Name_String (Error_Msg_File_1);
154             end if;
155
156             Write_Char ('"');
157             Write_Str (Name_Buffer (1 .. Name_Len));
158             Write_Char ('"');
159
160          elsif Msg (J) = '$' then
161             Write_Char ('"');
162
163             if Use_Second_Unit then
164                Write_Unit_Name (Error_Msg_Unit_2);
165             else
166                Use_Second_Unit := True;
167                Write_Unit_Name (Error_Msg_Unit_1);
168             end if;
169
170             Write_Char ('"');
171
172          elsif Msg (J) = '#' then
173             if Use_Second_Nat then
174                Write_Int (Error_Msg_Nat_2);
175             else
176                Use_Second_Nat := True;
177                Write_Int (Error_Msg_Nat_1);
178             end if;
179
180          elsif Msg (J) /= '?' then
181             Write_Char (Msg (J));
182          end if;
183       end loop;
184
185       Write_Eol;
186    end Error_Msg_Output;
187
188    ----------------------
189    -- Finalize_Binderr --
190    ----------------------
191
192    procedure Finalize_Binderr is
193    begin
194       --  Message giving number of errors detected (verbose mode only)
195
196       if Verbose_Mode then
197          Write_Eol;
198
199          if Errors_Detected = 0 then
200             Write_Str ("No errors");
201
202          elsif Errors_Detected = 1 then
203             Write_Str ("1 error");
204
205          else
206             Write_Int (Errors_Detected);
207             Write_Str (" errors");
208          end if;
209
210          if Warnings_Detected = 1 then
211             Write_Str (", 1 warning");
212
213          elsif Warnings_Detected > 1 then
214             Write_Str (", ");
215             Write_Int (Warnings_Detected);
216             Write_Str (" warnings");
217          end if;
218
219          Write_Eol;
220       end if;
221    end Finalize_Binderr;
222
223    ------------------------
224    -- Initialize_Binderr --
225    ------------------------
226
227    procedure Initialize_Binderr is
228    begin
229       Errors_Detected := 0;
230       Warnings_Detected := 0;
231    end Initialize_Binderr;
232
233 end Binderr;