]>
Commit | Line | Data |
---|---|---|
70482933 RK |
1 | ------------------------------------------------------------------------------ |
2 | -- -- | |
3 | -- GNAT COMPILER COMPONENTS -- | |
4 | -- -- | |
5 | -- B I N D E R R -- | |
6 | -- -- | |
7 | -- B o d y -- | |
8 | -- -- | |
4b490c1e | 9 | -- Copyright (C) 1992-2020, Free Software Foundation, Inc. -- |
70482933 RK |
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- -- | |
b5c84c3c | 13 | -- ware Foundation; either version 3, or (at your option) any later ver- -- |
70482933 RK |
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 -- | |
b5c84c3c RD |
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. -- | |
70482933 RK |
20 | -- -- |
21 | -- GNAT was originally developed by the GNAT team at New York University. -- | |
71ff80dc | 22 | -- Extensive contributions were provided by Ada Core Technologies Inc. -- |
70482933 RK |
23 | -- -- |
24 | ------------------------------------------------------------------------------ | |
25 | ||
39f4e199 VC |
26 | with Butil; use Butil; |
27 | with Opt; use Opt; | |
28 | with Output; use Output; | |
70482933 RK |
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 | ||
923e6ff3 RD |
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; | |
70482933 RK |
75 | end if; |
76 | ||
923e6ff3 RD |
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; | |
70482933 RK |
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 | |
39f4e199 VC |
110 | Use_Second_File : Boolean := False; |
111 | Use_Second_Unit : Boolean := False; | |
bcea76b6 | 112 | Use_Second_Nat : Boolean := False; |
39f4e199 | 113 | Warning : Boolean := False; |
70482933 RK |
114 | |
115 | begin | |
923e6ff3 | 116 | if Warnings_Detected + Errors_Detected > Maximum_Messages then |
70482933 RK |
117 | Write_Str ("error: maximum errors exceeded"); |
118 | Write_Eol; | |
119 | return; | |
120 | end if; | |
121 | ||
39f4e199 VC |
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 | |
70482933 RK |
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 | ||
bcea76b6 GB |
141 | for J in Msg'Range loop |
142 | if Msg (J) = '%' then | |
39f4e199 VC |
143 | Get_Name_String (Error_Msg_Name_1); |
144 | Write_Char ('"'); | |
145 | Write_Str (Name_Buffer (1 .. Name_Len)); | |
146 | Write_Char ('"'); | |
70482933 | 147 | |
39f4e199 VC |
148 | elsif Msg (J) = '{' then |
149 | if Use_Second_File then | |
150 | Get_Name_String (Error_Msg_File_2); | |
70482933 | 151 | else |
39f4e199 VC |
152 | Use_Second_File := True; |
153 | Get_Name_String (Error_Msg_File_1); | |
70482933 RK |
154 | end if; |
155 | ||
156 | Write_Char ('"'); | |
157 | Write_Str (Name_Buffer (1 .. Name_Len)); | |
158 | Write_Char ('"'); | |
159 | ||
39f4e199 | 160 | elsif Msg (J) = '$' then |
70482933 RK |
161 | Write_Char ('"'); |
162 | ||
39f4e199 VC |
163 | if Use_Second_Unit then |
164 | Write_Unit_Name (Error_Msg_Unit_2); | |
70482933 | 165 | else |
39f4e199 VC |
166 | Use_Second_Unit := True; |
167 | Write_Unit_Name (Error_Msg_Unit_1); | |
70482933 RK |
168 | end if; |
169 | ||
170 | Write_Char ('"'); | |
171 | ||
bcea76b6 GB |
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)); | |
70482933 RK |
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; |