| ------------------------------------------------------------------------------ |
| -- -- |
| -- GNAT COMPILER COMPONENTS -- |
| -- -- |
| -- B I N D E R R -- |
| -- -- |
| -- B o d y -- |
| -- -- |
| -- Copyright (C) 1992-2008, 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; |