-- Reporter bindings for Ada 95
-- Reporter module by Chris Morison & Martin Avison
-- Ada 95 bindings by Stefan Bellon
-- 26/08/2001 MSA Changed/Added swi numbers for Reporter v2.47n  

with Kernel, Interfaces.C, System, System.Storage_Elements;

package body Reporter is

   OS_CLI           : constant Interfaces.C.Unsigned := 16#5#;

-- Reporter Reporting SWIs
   Report_Text0     : constant Interfaces.C.Unsigned := 16#54C80#;
   Report_TextS     : constant Interfaces.C.Unsigned := 16#54C81#;
-- Report_Regs      : constant Interfaces.C.Unsigned := 16#54C82#;
   Report_Registers : constant Interfaces.C.Unsigned := 16#54C83#;
   Report_Where     : constant Interfaces.C.Unsigned := 16#54C84#;
   Report_Poll      : constant Interfaces.C.Unsigned := 16#54C85#;
-- Report_Dump      : constant Interfaces.C.Unsigned := 16#54C86#;
   
-- Reporter Control SWIs
   Report_Quit      : constant Interfaces.C.Unsigned := 16#54C8A#;
   Report_Clear     : constant Interfaces.C.Unsigned := 16#54C8B#;
-- Report_Open      : constant Interfaces.C.Unsigned := 16#54C8C#;
   Report_Close     : constant Interfaces.C.Unsigned := 16#54C8D#;
   Report_On        : constant Interfaces.C.Unsigned := 16#54C8E#;
   Report_Off       : constant Interfaces.C.Unsigned := 16#54C8F#;
-- Report_CmdOn     : constant Interfaces.C.Unsigned := 16#54C90#;
-- Report_CmdOff    : constant Interfaces.C.Unsigned := 16#54C91#;
-- Report_Hide      : constant Interfaces.C.Unsigned := 16#54C92#;
-- Report_UnHide    : constant Interfaces.C.Unsigned := 16#54C93#;
-- Report_ErrOn     : constant Interfaces.C.Unsigned := 16#54C94#;
-- Report_ErrOff    : constant Interfaces.C.Unsigned := 16#54C95#;
-- Report_TaskOn    : constant Interfaces.C.Unsigned := 16#54C96#;
-- Report_TaskOff   : constant Interfaces.C.Unsigned := 16#54C97#;
-- Report_Vdu4On    : constant Interfaces.C.Unsigned := 16#54C98#;
-- Report_Vdu4Off   : constant Interfaces.C.Unsigned := 16#54C99#;
-- Report_RmaOn     : constant Interfaces.C.Unsigned := 16#54C9A#;
-- Report_RmaOff    : constant Interfaces.C.Unsigned := 16#54C9B#;

   Regs : aliased Kernel.SWI_Regs;

   function Address_To_C_Int (Addr : in System.Address)
                              return Interfaces.C.Int is
   begin
      return Interfaces.C.Int (System.Storage_Elements.To_Integer (Addr));
   end Address_To_C_Int;

   procedure Call_OS_CLI (Command : in String) is
      Local_String : String := Command & Character'Val (0);
   begin
      Regs.R(0) := Address_To_C_Int (Local_String'Address);
      Kernel.SWI (OS_CLI, Regs'Access, Regs'Access);
   end Call_OS_CLI;

   procedure Report (Text : in String) is
   begin
      Call_OS_CLI ("Report " & Text);
   end Report;

   procedure Clear (Text : in String := "") is
   begin
      Call_OS_CLI ("ReportClear " & Text);
   end Clear;

   procedure On (Text : in String := "") is
   begin
      Call_OS_CLI ("ReportOn " & Text);
   end On;

   procedure Off (Text : in String := "") is
   begin
      Call_OS_CLI ("ReportOff " & Text);
   end Off;

   procedure Close is
   begin
      Kernel.SWI (Report_Close, Regs'Access, Regs'Access);
   end Close;

   procedure Quit is
   begin
      Kernel.SWI (Report_Quit, Regs'Access, Regs'Access);
   end Quit;

   procedure Where is
   begin
      Kernel.SWI (Report_Where, Regs'Access, Regs'Access);
   end Where;

   procedure Text (Text : in String := "") is
      Local_String : String := Text & Character'Val (0);
   begin
      Regs.R(0) := Address_To_C_Int (Local_String'Address);
      Kernel.SWI (Report_Text0, Regs'Access, Regs'Access);
   end Text;

   procedure Poll (Reason : in Natural := 0) is
   begin
      Regs.R(0) := Interfaces.C.int (Reason);
      Kernel.SWI (Report_Poll, Regs'Access, Regs'Access);
   end Poll;

   procedure Registers (Text : in String := "") is
      Local_String : String := Text & Character'Val (0);
   begin
      Regs.R(0) := Address_To_C_Int (Local_String'Address);
      Regs.R(1) := 0;
      Regs.R(2) := 0;
      Kernel.SWI (Report_Registers, Regs'Access, Regs'Access);
   end Registers;

   procedure Save (Text : in String := "") is
   begin
      Call_OS_CLI ("ReportSave " & Text);
   end Save;

end Reporter;
