with Ada.Text_Io; use Ada.Text_Io; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with Ada.Strings.Maps; with Ada.Calendar; use Ada.Calendar; with Ada.Calendar.Formatting; with GNAT.Time_Stamp; package body logging is function Image (level : message_level_type) return String is begin case level is when CRITICAL => return "[C]"; when ERROR => return "[E]"; when WARNING => return "[W]"; when INFORMATIONAL => return "[I]"; when others => return "[" & message_level_type'Image (level) & "]"; end case; end Image; function Time_Stamp return String is ts : Unbounded_String := To_Unbounded_String (GNAT.Time_Stamp.Current_Time); pos : Natural := 0; removeset : Ada.Strings.Maps.Character_Set; begin removeset := Ada.Strings.Maps.To_Set ("-:. "); loop pos := Ada.Strings.Unbounded.Index (ts, removeset); if pos = 0 then exit; end if; Ada.Strings.Unbounded.Delete (ts, pos, pos); end loop; return Ada.Calendar.Formatting.Image (Ada.Calendar.Clock ) ; end Time_Stamp; procedure SetDestination (destination : access Destination_Type'Class) is begin if Current_Destination /= null then Close(Current_Destination.all) ; end if ; Current_Destination := destination; end SetDestination; procedure SendMessage ( message : String ; level : message_level_type := INFORMATIONAL; source : String := Default_Source_Name ; class : String := Default_Message_Class ) is begin SendMessage(Current_Destination.all,message,level,source,class); end SendMessage; overriding procedure SendMessage ( dest : in out StdOutDestination_Type ; message : String ; level : message_level_type := INFORMATIONAL ; source : String := Default_Source_Name ; class : String := Default_Message_Class ) is begin Put_Line(Image(message,level,source,class)); end SendMessage; overriding procedure Close(desg : StdOutDestination_Type) is begin null ; end Close ; function Image ( message : String ; level : message_level_type := INFORMATIONAL; source : String := Default_Source_Name ; class : String := Default_Message_Class ) return String is begin return Ada.Calendar.Formatting.Image (Ada.Calendar.Clock ) & " " & source & " " & class & " " & Image(level) & " " & message ; end Image ; procedure SelfTest is begin for i in 1 .. 10 loop SendMessage (Ada.Calendar.Formatting.Image (Ada.Calendar.Clock)); delay 0.5; end loop; end SelfTest; begin Current_Destination := new StdOutDestination_Type ; end logging;