-- Copyright (C) 1998 Grady Booch and Simon Wright.
-- All Rights Reserved.
--
--      This program is free software; you can redistribute it
--      and/or modify it under the terms of the Ada Community
--      License which comes with this Library.
--
--      This program is distributed in the hope that it will be
--      useful, but WITHOUT ANY WARRANTY; without even the implied
--      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
--      PURPOSE. See the Ada Community License for more details.
--      You should have received a copy of the Ada Community
--      License with this library, in the file named "Ada Community
--      License" or "ACL". If not, contact the author of this library
--      for a copy.
--

-- $Id: bc-support-exceptions.adb,v 1.2 2005/02/11 02:59:34 ken Exp $

package body BC.Support.Exceptions is


  function Reason_Message (For_The_Reason : Reason) return String is
  begin
    case For_The_Reason is
      when No_Reason_Given => return "";
      when Disjoint => return "objects are members of different structures";
      when Duplicate => return "object already exists";
      when Empty => return "object is empty";
      when Full => return "object is full";
      when Illegal => return "illegal pattern";
      when Invalid_Index => return "index is out of range";
      when Invalid_Number => return "string does not denote a valid number";
      when Missing => return "object does not exist";
      when Not_Empty => return "object is not empty";
      when Not_Root => return "object is not at root of structure";
      when Is_Null => return "object is null";
      when Out_Of_Memory => return "storage requested not available";
      when Referenced => return "object is referenced and cannot be destroyed";
      when Timing => return "possible race condition";
      when Too_Large => return "object is too large";
      when Too_Small => return "object is too small";
    end case;
  end Reason_Message;


  procedure Assert (Condition : Boolean;
                    Raising_If_False : Ada.Exceptions.Exception_Id;
                    From_Subprogram : String;
                    With_Reason : Reason := No_Reason_Given) is
  begin
    if not Condition then
      if With_Reason = No_Reason_Given then
        Ada.Exceptions.Raise_Exception
           (Raising_If_False,
            Module & "." & From_Subprogram);
      else
        Ada.Exceptions.Raise_Exception
           (Raising_If_False,
            Module & "." & From_Subprogram & ": "
            & Reason_Message (With_Reason));
      end if;
    end if;
  end Assert;


  procedure Report (The_Exception : Ada.Exceptions.Exception_Occurrence;
                    To : Ada.Text_Io.File_Type := Ada.Text_Io.Standard_Output) is
  begin
    if Ada.Exceptions.Exception_Message (The_Exception)'Length = 0 then
      Ada.Text_Io.Put_Line (File => To,
                            Item => "Exception "
                            & Ada.Exceptions.Exception_Name (The_Exception)
                            & " occurred.");
    else
      Ada.Text_Io.Put_Line (File => To,
                            Item => "Exception "
                            & Ada.Exceptions.Exception_Name (The_Exception)
                            & " ("
                            & Ada.Exceptions.Exception_Message (The_Exception)
                            & ") occurred.");
    end if;
  end Report;


end BC.Support.Exceptions;
