blob: 71b98f5e3e022d433e5ae84b3a9f56bfaae495bc [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- B I N D E R R --
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2022, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING3. If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
with Butil; use Butil;
with Opt; use Opt;
with Output; use Output;
package body Binderr is
---------------
-- Error_Msg --
---------------
procedure Error_Msg (Msg : String) is
begin
if Msg (Msg'First) = '?' then
if Warning_Mode = Suppress then
return;
end if;
if Warning_Mode = Treat_As_Error then
Errors_Detected := Errors_Detected + 1;
else
Warnings_Detected := Warnings_Detected + 1;
end if;
else
Errors_Detected := Errors_Detected + 1;
end if;
if Brief_Output or else (not Verbose_Mode) then
Set_Standard_Error;
Error_Msg_Output (Msg, Info => False);
Set_Standard_Output;
end if;
if Verbose_Mode then
if Errors_Detected + Warnings_Detected = 0 then
Write_Eol;
end if;
Error_Msg_Output (Msg, Info => False);
end if;
-- If too many warnings print message and then turn off warnings
if Warnings_Detected = Maximum_Messages then
Set_Standard_Error;
Write_Line ("maximum number of warnings reached");
Write_Line ("further warnings will be suppressed");
Set_Standard_Output;
Warning_Mode := Suppress;
end if;
-- If too many errors print message and give fatal error
if Errors_Detected = Maximum_Messages then
Set_Standard_Error;
Write_Line ("fatal error: maximum number of errors exceeded");
Set_Standard_Output;
raise Unrecoverable_Error;
end if;
end Error_Msg;
--------------------
-- Error_Msg_Info --
--------------------
procedure Error_Msg_Info (Msg : String) is
begin
if Brief_Output or else (not Verbose_Mode) then
Set_Standard_Error;
Error_Msg_Output (Msg, Info => True);
Set_Standard_Output;
end if;
if Verbose_Mode then
Error_Msg_Output (Msg, Info => True);
end if;
end Error_Msg_Info;
----------------------
-- Error_Msg_Output --
----------------------
procedure Error_Msg_Output (Msg : String; Info : Boolean) is
Use_Second_File : Boolean := False;
Use_Second_Unit : Boolean := False;
Use_Second_Nat : Boolean := False;
Warning : Boolean := False;
begin
if Warnings_Detected + Errors_Detected > Maximum_Messages then
Write_Str ("error: maximum errors exceeded");
Write_Eol;
return;
end if;
-- First, check for warnings
for J in Msg'Range loop
if Msg (J) = '?' then
Warning := True;
exit;
end if;
end loop;
if Warning then
Write_Str ("warning: ");
elsif Info then
if not Info_Prefix_Suppress then
Write_Str ("info: ");
end if;
else
Write_Str ("error: ");
end if;
for J in Msg'Range loop
if Msg (J) = '%' then
Get_Name_String (Error_Msg_Name_1);
Write_Char ('"');
Write_Str (Name_Buffer (1 .. Name_Len));
Write_Char ('"');
elsif Msg (J) = '{' then
if Use_Second_File then
Get_Name_String (Error_Msg_File_2);
else
Use_Second_File := True;
Get_Name_String (Error_Msg_File_1);
end if;
Write_Char ('"');
Write_Str (Name_Buffer (1 .. Name_Len));
Write_Char ('"');
elsif Msg (J) = '$' then
Write_Char ('"');
if Use_Second_Unit then
Write_Unit_Name (Error_Msg_Unit_2);
else
Use_Second_Unit := True;
Write_Unit_Name (Error_Msg_Unit_1);
end if;
Write_Char ('"');
elsif Msg (J) = '#' then
if Use_Second_Nat then
Write_Int (Error_Msg_Nat_2);
else
Use_Second_Nat := True;
Write_Int (Error_Msg_Nat_1);
end if;
elsif Msg (J) /= '?' then
Write_Char (Msg (J));
end if;
end loop;
Write_Eol;
end Error_Msg_Output;
----------------------
-- Finalize_Binderr --
----------------------
procedure Finalize_Binderr is
begin
-- Message giving number of errors detected (verbose mode only)
if Verbose_Mode then
Write_Eol;
if Errors_Detected = 0 then
Write_Str ("No errors");
elsif Errors_Detected = 1 then
Write_Str ("1 error");
else
Write_Int (Errors_Detected);
Write_Str (" errors");
end if;
if Warnings_Detected = 1 then
Write_Str (", 1 warning");
elsif Warnings_Detected > 1 then
Write_Str (", ");
Write_Int (Warnings_Detected);
Write_Str (" warnings");
end if;
Write_Eol;
end if;
end Finalize_Binderr;
------------------------
-- Initialize_Binderr --
------------------------
procedure Initialize_Binderr is
begin
Errors_Detected := 0;
Warnings_Detected := 0;
end Initialize_Binderr;
end Binderr;