------------------------------------------------------------------------------
--                                                                          --
--                           GNAT ncurses Binding                           --
--                                                                          --
--                      Terminal_Interface.Curses.Trace                     --
--                                                                          --
--                                 B O D Y                                  --
--                                                                          --
------------------------------------------------------------------------------
-- Copyright (c) 2000,2004 Free Software Foundation, Inc.                   --
--                                                                          --
-- Permission is hereby granted, free of charge, to any person obtaining a  --
-- copy of this software and associated documentation files (the            --
-- "Software"), to deal in the Software without restriction, including      --
-- without limitation the rights to use, copy, modify, merge, publish,      --
-- distribute, distribute with modifications, sublicense, and/or sell       --
-- copies of the Software, and to permit persons to whom the Software is    --
-- furnished to do so, subject to the following conditions:                 --
--                                                                          --
-- The above copyright notice and this permission notice shall be included  --
-- in all copies or substantial portions of the Software.                   --
--                                                                          --
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
--                                                                          --
-- Except as contained in this notice, the name(s) of the above copyright   --
-- holders shall not be used in advertising or otherwise to promote the     --
-- sale, use or other dealings in this Software without prior written       --
-- authorization.                                                           --
------------------------------------------------------------------------------
--  Author:  Juergen Pfeifer, 1996
--  Version Control:
--  $Revision: 1.5 $
--  Binding Version 01.00
------------------------------------------------------------------------------
#if ADA_TRACE then
with Interfaces.C; use Interfaces.C;
with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
with Ada.Unchecked_Conversion;
#end if;

package body Terminal_Interface.Curses.Trace is

#if ADA_TRACE then
   type C_TraceType is new C_UInt;

   function TraceAda_To_TraceC is new
     Ada.Unchecked_Conversion (Source => Trace_Attribute_Set,
                               Target => C_TraceType);

   procedure Trace_On (x : Trace_Attribute_Set) is
      procedure traceC (y : C_TraceType);
      pragma Import (C, traceC, "trace");
   begin
      traceC (TraceAda_To_TraceC (x));
   end Trace_On;

   --  75. (12) A C function that takes a variable number of arguments can
   --      correspond to several Ada subprograms, taking various specific
   --      numbers and types of parameters.

   procedure Trace_Put (str : String) is
      procedure tracef (format : char_array; s : char_array);
      pragma Import (C, tracef, "_tracef");
      Txt    : char_array (0 .. str'Length);
      Length : size_t;
      formatstr : constant String := "%s" &  ASCII.Nul;
      formattxt : char_array (0 .. formatstr'Length);
   begin
      To_C (formatstr, formattxt, Length);
      To_C (str, Txt, Length);
      tracef (formattxt, Txt);
   end Trace_Put;
#else
   procedure Trace_On (x : Trace_Attribute_Set) is
#if PRAGMA_UNREF
   pragma Unreferenced (x);
#end if;
   begin
      null;
   end Trace_On;

   procedure Trace_Put (str : String) is
#if PRAGMA_UNREF
   pragma Unreferenced (str);
#end if;
   begin
      null;
   end Trace_Put;
#end if;

end Terminal_Interface.Curses.Trace;
