--------------------------------------------------------------------
--
-- tcl-ada.ads -- This package provides the "thick" binding to Tcl.
--
-- Copyright (c) 1995-1996 Terry J. Westley
--
-- See the file "license.htm" for information on usage and
-- redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
--
-- This package is made up primarily of
--
-- 1) extra overloaded subprograms which use the Ada String type in
--    place of the C string type (Interfaces.C.Strings.Chars_Ptr).
--
-- 2) extra overloaded procedures for tcl.h functions which return
--    TCL_OK or TCL_ERROR so that Ada programmers can call them as
--    procedures rather than functions.  The exception Tcl_Error_Exception
--    is raised when the Tcl function returns TCL_ERROR.
--
-- 3) generic packages that allow use of a data type for ClientData
--    rather than a reference to a void or int type as C does.
--
--------------------------------------------------------------------

with CArgv;

package Tcl.Ada is

   Version : constant String := "7.6.0";

   package C renames Interfaces.C;

   Tcl_Error_Exception : exception;

   --------------------------------------------------------------------
   --
   --	Generics for all subprograms which require Client Data
   --
   --------------------------------------------------------------------

--   generic
--      type ClientData is private;
--      -- This must be a type whose size is no greater than 32 bits, e.g.,
--      -- Integer, Short_Float, an access type.
--   package Generic_AssocData is
--
--      type Tcl_InterpDeleteProc is access procedure (
--         data            : ClientData;
--         interp          : Tcl_Interp
--      );
--      pragma Convention (C, Tcl_InterpDeleteProc);
--
--      function Tcl_GetAssocData (
--         interp          : Tcl_Interp;
--         name            : C.Strings.Chars_Ptr;
--         procPtr         : Tcl_InterpDeleteProc
--      ) return ClientData;
--      pragma Import (C, Tcl_GetAssocData, "Tcl_GetAssocData");
--
--      function Tcl_GetAssocData (
--         interp          : in Tcl_Interp;
--         name            : in String;
--         procPtr         : in Tcl_InterpDeleteProc
--      ) return ClientData;
--
--      procedure Tcl_SetAssocData (
--         interp          : Tcl_Interp;
--         name            : C.Strings.Chars_Ptr;
--         proc            : Tcl_InterpDeleteProc;
--         data            : ClientData
--      );
--      pragma Import (C, Tcl_SetAssocData, "Tcl_SetAssocData");
--
--      procedure Tcl_SetAssocData (
--         interp          : in Tcl_Interp;
--         name            : in String;
--         proc            : in Tcl_InterpDeleteProc;
--         data            : in ClientData
--      );
--
--   end Generic_AssocData;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_AsyncEvents is

      type Tcl_AsyncProc is access function (
         data            : ClientData;
         interp          : Tcl_Interp;
         code            : C.Int
      ) return C.Int;
      pragma Convention (C, Tcl_AsyncProc);

      function Tcl_AsyncCreate (
         proc            : Tcl_AsyncProc;
         data            : ClientData
      ) return Tcl_AsyncHandler;
      pragma Import (C, Tcl_AsyncCreate, "Tcl_AsyncCreate");

   end Generic_AsyncEvents;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_CallWhenDeleted is

      type Tcl_InterpDeleteProc is access procedure (
         data            : ClientData;
         interp          : Tcl_Interp
      );
      pragma Convention (C, Tcl_InterpDeleteProc);

      procedure Tcl_CallWhenDeleted (
         interp          : Tcl_Interp;
         proc            : Tcl_InterpDeleteProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CallWhenDeleted, "Tcl_CallWhenDeleted");

      procedure Tcl_DontCallWhenDeleted (
         interp          : Tcl_Interp;
         proc            : Tcl_InterpDeleteProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DontCallWhenDeleted, "Tcl_DontCallWhenDeleted");

   end Generic_CallWhenDeleted;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_Channel is

      function Tcl_MakeFileChannel (
         infile          : ClientData;
         outfile         : ClientData;
         mode            : C.Int
      ) return Tcl_Channel;
      pragma Import (C, Tcl_MakeFileChannel, "Tcl_MakeFileChannel");

   end Generic_Channel;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_ChannelDriver is

      function Tcl_CreateChannel (
         typePtr         : Tcl_ChannelType;
         chanName        : C.Strings.Chars_Ptr;
         instancedata    : ClientData;
         mask            : C.Int
      ) return Tcl_Channel;
      pragma Import (C, Tcl_CreateChannel, "Tcl_CreateChannel");

      function Tcl_CreateChannel (
         typePtr         : in Tcl_ChannelType;
         chanName        : in String;
         instancedata    : in ClientData;
         mask            : in C.Int
      ) return Tcl_Channel;

      function Tcl_GetChannelInstanceData (
         chan            : Tcl_Channel
      ) return ClientData;
      pragma Import (C, Tcl_GetChannelInstanceData, "Tcl_GetChannelInstanceData");

   end Generic_ChannelDriver;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_ChannelHandler is

      type Tcl_ChannelProc is access procedure (
         data            : ClientData;
         mask            : C.Int
      );
      pragma Convention (C, Tcl_ChannelProc);

      procedure Tcl_CreateChannelHandler (
         chan            : Tcl_Channel;
         mask            : C.Int;
         proc            : Tcl_ChannelProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateChannelHandler, "Tcl_CreateChannelHandler");

      procedure Tcl_DeleteChannelHandler (
         chan            : Tcl_Channel;
         proc            : Tcl_ChannelProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DeleteChannelHandler, "Tcl_DeleteChannelHandler");

   end Generic_ChannelHandler;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_CloseHandler is

      type Tcl_CloseProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_CloseProc);

      procedure Tcl_CreateCloseHandler (
         chan            : Tcl_Channel;
         proc            : Tcl_CloseProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateCloseHandler, "Tcl_CreateCloseHandler");

      procedure Tcl_DeleteCloseHandler (
         chan            : Tcl_Channel;
         proc            : Tcl_CloseProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DeleteCloseHandler, "Tcl_DeleteCloseHandler");

   end Generic_CloseHandler;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_Command is

      type Tcl_CmdProc is access function (
         data            : ClientData;
         interp          : Tcl_Interp;
         argc            : C.Int;
         argv            : CArgv.Chars_Ptr_Ptr
      ) return C.Int;
      pragma Convention (C, Tcl_CmdProc);

      type Tcl_CmdDeleteProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_CmdDeleteProc);

      function Tcl_CreateCommand (
         interp          : Tcl_Interp;
         cmdName         : C.Strings.Chars_Ptr;
         proc            : Tcl_CmdProc;
         data            : ClientData;
         deleteProc      : Tcl_CmdDeleteProc
      ) return Tcl_Command;
      pragma Import (C, Tcl_CreateCommand, "Tcl_CreateCommand");

      function Tcl_CreateCommand (
         interp          : in Tcl_Interp;
         cmdName         : in String;
         proc            : in Tcl_CmdProc;
         data            : in ClientData;
         deleteProc      : in Tcl_CmdDeleteProc
      ) return Tcl_Command;

   end Generic_Command;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_EventSource is

      type Tcl_EventSetupProc is access procedure (
         data            : ClientData;
         flags           : C.Int
      );
      pragma Convention (C, Tcl_EventSetupProc);

      type Tcl_EventCheckProc is access procedure (
         data            : ClientData;
         flags           : C.Int
      );
      pragma Convention (C, Tcl_EventCheckProc);

      type Tcl_FileProc is access procedure (
         data            : ClientData;
         mask            : C.Int
      );
      pragma Convention (C, Tcl_FileProc);

      procedure Tcl_CreateEventSource (
         setupProc       : Tcl_EventSetupProc;
         checkProc       : Tcl_EventCheckProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateEventSource, "Tcl_CreateEventSource");

      procedure Tcl_CreateFileHandler (
         file            : Tcl_File;
         mask            : C.Int;
         proc            : Tcl_FileProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateFileHandler, "Tcl_CreateFileHandler");

      procedure Tcl_DeleteEventSource (
         setupProc       : Tcl_EventSetupProc;
         checkProc       : Tcl_EventCheckProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DeleteEventSource, "Tcl_DeleteEventSource");

   end Generic_EventSource;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_ExitHandler is

      type Tcl_ExitProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_ExitProc);

      procedure Tcl_CreateExitHandler (
         proc            : Tcl_ExitProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateExitHandler, "Tcl_CreateExitHandler");

      procedure Tcl_DeleteExitHandler (
         proc            : Tcl_ExitProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DeleteExitHandler, "Tcl_DeleteExitHandler");

   end Generic_ExitHandler;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_FileHandle is

      type Tcl_FileFreeProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_FileFreeProc);

      function Tcl_GetFile (
         filedata        : ClientData;
         typ             : C.Int
      ) return Tcl_File;
      pragma Import (C, Tcl_GetFile, "Tcl_GetFile");

      function Tcl_GetFileInfo (
         file            : Tcl_File;
         typePtr         : access C.Int
      ) return ClientData;
      pragma Import (C, Tcl_GetFileInfo, "Tcl_GetFileInfo");

      function Tcl_GetNotifierData (
         file            : Tcl_File;
         freeProcPtr     : Tcl_FileFreeProc
      ) return ClientData;
      pragma Import (C, Tcl_GetNotifierData, "Tcl_GetNotifierData");

      procedure Tcl_SetNotifierData (
         file            : Tcl_File;
         freeProcPtr     : Tcl_FileFreeProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_SetNotifierData, "Tcl_SetNotifierData");

   end Generic_FileHandle;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_FileHandler is

      type Tcl_FileProc is access procedure (
         data            : ClientData;
         mask            : C.Int
      );
      pragma Convention (C, Tcl_FileProc);

      procedure Tcl_CreateFileHandler (
         file            : Tcl_File;
         mask            : C.Int;
         proc            : Tcl_FileProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateFileHandler, "Tcl_CreateFileHandler");

      function Tcl_GetFile (
         filedata        : ClientData;
         typ             : C.Int
      ) return Tcl_File;
      pragma Import (C, Tcl_GetFile, "Tcl_GetFile");

   end Generic_FileHandler;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_GetOpenFile is

      function Tcl_GetOpenFile (
         interp          : Tcl_Interp;
         strng           : C.Strings.Chars_Ptr;
         write           : C.Int;
         checkUsage      : C.Int;
         fileptr         : ClientData
      ) return C.Int;
      pragma Import (C, Tcl_GetOpenFile, "Tcl_GetOpenFile");

      function Tcl_GetOpenFile (
         interp          : in Tcl_Interp;
         strng           : in String;
         write           : in C.Int;
         checkUsage      : in C.Int;
         fileptr         : in ClientData
      ) return C.Int;

      procedure Tcl_GetOpenFile (
         interp          : in Tcl_Interp;
         strng           : in String;
         write           : in C.Int;
         checkUsage      : in C.Int;
         fileptr         : in ClientData
      );

   end Generic_GetOpenFile;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_Hash is

      function Tcl_GetHashValue (
         HashEntry       : Tcl_HashEntry
      ) return ClientData;
      pragma Import (C, Tcl_GetHashValue, "Tcl_CallGetHashValue");

      procedure Tcl_SetHashValue (
         HashEntry       : Tcl_HashEntry;
         value           : ClientData
      );
      pragma Import (C, Tcl_SetHashValue, "Tcl_CallSetHashValue");

   end Generic_Hash;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_Idle is

      type Tcl_IdleProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_IdleProc);

      procedure Tcl_CancelIdleCall (
         idleProc        : Tcl_IdleProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CancelIdleCall, "Tcl_CancelIdleCall");

      procedure Tcl_DoWhenIdle (
         proc            : Tcl_IdleProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DoWhenIdle, "Tcl_DoWhenIdle");

   end Generic_Idle;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_ManageStorage is

      type Tcl_FreeProc is access procedure (
         blockPtr        : C.Strings.Chars_Ptr
      );
      pragma Convention (C, Tcl_FreeProc);

      procedure Tcl_EventuallyFree (
         data            : ClientData;
         freeProc        : Tcl_FreeProc
      );
      pragma Import (C, Tcl_EventuallyFree, "Tcl_EventuallyFree");

      procedure Tcl_Preserve (
         data            : ClientData
      );
      pragma Import (C, Tcl_Preserve, "Tcl_Preserve");

      procedure Tcl_Release (
         data            : ClientData
      );
      pragma Import (C, Tcl_Release, "Tcl_Release");

   end Generic_ManageStorage;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_MathFunc is

      type Tcl_MathProc is access function (
         data            : ClientData;
         interp          : Tcl_Interp;
         args            : Tcl_Value;
         resultPtr       : Tcl_Value
      ) return C.Int;
      pragma Convention (C, Tcl_MathProc);

      procedure Tcl_CreateMathFunc (
         interp          : Tcl_Interp;
         name            : C.Strings.Chars_Ptr;
         numArgs         : C.Int;
         argTypes        : Tcl_ValueType;
         proc            : Tcl_MathProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateMathFunc, "Tcl_CreateMathFunc");

      procedure Tcl_CreateMathFunc (
         interp          : in Tcl_Interp;
         name            : in String;
         numArgs         : in C.Int;
         argTypes        : in Tcl_ValueType;
         proc            : in Tcl_MathProc;
         data            : in ClientData
      );

   end Generic_MathFunc;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_ModalTimeout is

      type Tcl_TimerProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_TimerProc);

      procedure Tcl_CreateModalTimeout (
         milliseconds    : C.Int;
         proc            : Tcl_TimerProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_CreateModalTimeout, "Tcl_CreateModalTimeout");

      procedure Tcl_DeleteModalTimeout (
         proc            : Tcl_TimerProc;
         data            : ClientData
      );
      pragma Import (C, Tcl_DeleteModalTimeout, "Tcl_DeleteModalTimeout");

   end Generic_ModalTimeout;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_TcpChannel is

      type Tcl_TcpAcceptProc is access procedure (
         callbackdata    : ClientData;
         chan            : Tcl_Channel;
         address         : C.Strings.Chars_Ptr;
         port            : C.Int
      );
      pragma Convention (C, Tcl_TcpAcceptProc);

      function Tcl_MakeTcpClientChannel (
         tcpsocket       : ClientData
      ) return Tcl_Channel;
      pragma Import (C, Tcl_MakeTcpClientChannel, "Tcl_MakeTcpClientChannel");

      function Tcl_OpenTcpServer (
         interp          : Tcl_Interp;
         port            : C.Int;
         host            : C.Strings.Chars_Ptr;
         acceptProc      : Tcl_TcpAcceptProc;
         callbackdata    : ClientData
      ) return Tcl_Channel;
      pragma Import (C, Tcl_OpenTcpServer, "Tcl_OpenTcpServer");

      function Tcl_OpenTcpServer (
         interp          : in Tcl_Interp;
         port            : in C.Int;
         host            : in String;
         acceptProc      : in Tcl_TcpAcceptProc;
         callbackdata    : in ClientData
      ) return Tcl_Channel;

   end Generic_TcpChannel;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_TimerHandler is

      type Tcl_TimerProc is access procedure (
         data            : ClientData
      );
      pragma Convention (C, Tcl_TimerProc);

      function Tcl_CreateTimerHandler (
         milliseconds    : C.Int;
         proc            : Tcl_TimerProc;
         data            : ClientData
      ) return Tcl_TimerToken;
      pragma Import (C, Tcl_CreateTimerHandler, "Tcl_CreateTimerHandler");

   end Generic_TimerHandler;

   generic
      type ClientData is private;
      -- This must be a type whose size is no greater than 32 bits, e.g.,
      -- Integer, Short_Float, an access type.
   package Generic_Trace is

      type Tcl_CmdTraceProc is access procedure (
         data            : ClientData;
         interp          : Tcl_Interp;
         level           : C.Int;
         command         : C.Strings.Chars_Ptr;
         proc            : Tcl_CmdProc;
         cmdclientdata   : ClientData;
         argc            : C.Int;
         argv            : CArgv.Chars_Ptr_Ptr
      );
      pragma Convention (C, Tcl_CmdTraceProc);

      function Tcl_CreateTrace (
         interp          : Tcl_Interp;
         level           : C.Int;
         proc            : Tcl_CmdTraceProc;
         data            : ClientData
      ) return Tcl_Trace;
      pragma Import (C, Tcl_CreateTrace, "Tcl_CreateTrace");

   end Generic_Trace;

--   generic
--      type ClientData is private;
--      -- This must be a type whose size is no greater than 32 bits, e.g.,
--      -- Integer, Short_Float, an access type.
--   package Generic_TraceVar is
--
--      type Tcl_VarTraceProc is access function (
--         data            : ClientData;
--         interp          : Tcl_Interp;
--         part1           : C.Strings.Chars_Ptr;
--         part2           : C.Strings.Chars_Ptr;
--         flags           : C.Int
--      ) return C.Strings.Chars_Ptr;
--      pragma Convention (C, Tcl_VarTraceProc);
--
--      function Tcl_TraceVar (
--         interp          : Tcl_Interp;
--         varName         : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         proc            : Tcl_VarTraceProc;
--         data            : ClientData
--      ) return C.Int;
--      pragma Import (C, Tcl_TraceVar, "Tcl_TraceVar");
--
--      function Tcl_TraceVar (
--         interp          : in Tcl_Interp;
--         varName         : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      ) return C.Int;
--
--      procedure Tcl_TraceVar (
--         interp          : in Tcl_Interp;
--         varName         : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      );
--
--      function Tcl_TraceVar2 (
--         interp          : Tcl_Interp;
--         part1           : C.Strings.Chars_Ptr;
--         part2           : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         proc            : Tcl_VarTraceProc;
--         data            : ClientData
--      ) return C.Int;
--      pragma Import (C, Tcl_TraceVar2, "Tcl_TraceVar2");
--
--      function Tcl_TraceVar2 (
--         interp          : in Tcl_Interp;
--         part1           : in String;
--         part2           : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      ) return C.Int;
--
--      procedure Tcl_TraceVar2 (
--         interp          : in Tcl_Interp;
--         part1           : in String;
--         part2           : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      );
--
--      procedure Tcl_UntraceVar (
--         interp          : Tcl_Interp;
--         varName         : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         proc            : Tcl_VarTraceProc;
--         data            : ClientData
--      );
--      pragma Import (C, Tcl_UntraceVar, "Tcl_UntraceVar");
--
--      procedure Tcl_UntraceVar (
--         interp          : in Tcl_Interp;
--         varName         : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      );
--
--      procedure Tcl_UntraceVar2 (
--         interp          : Tcl_Interp;
--         part1           : C.Strings.Chars_Ptr;
--         part2           : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         proc            : Tcl_VarTraceProc;
--         data            : ClientData
--      );
--      pragma Import (C, Tcl_UntraceVar2, "Tcl_UntraceVar2");
--
--      procedure Tcl_UntraceVar2 (
--         interp          : in Tcl_Interp;
--         part1           : in String;
--         part2           : in String;
--         flags           : in C.Int;
--         proc            : in Tcl_VarTraceProc;
--         data            : in ClientData
--      );
--
--      function Tcl_VarTraceInfo (
--         interp          : Tcl_Interp;
--         varName         : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         procPtr         : Tcl_VarTraceProc;
--         prevclientdata  : ClientData
--      ) return ClientData;
--      pragma Import (C, Tcl_VarTraceInfo, "Tcl_VarTraceInfo");
--
--      function Tcl_VarTraceInfo (
--         interp          : in Tcl_Interp;
--         varName         : in String;
--         flags           : in C.Int;
--         procPtr         : in Tcl_VarTraceProc;
--         prevclientdata  : in ClientData
--      ) return ClientData;
--
--      function Tcl_VarTraceInfo2 (
--         interp          : Tcl_Interp;
--         part1           : C.Strings.Chars_Ptr;
--         part2           : C.Strings.Chars_Ptr;
--         flags           : C.Int;
--         procPtr         : Tcl_VarTraceProc;
--         prevclientdata  : ClientData
--      ) return ClientData;
--      pragma Import (C, Tcl_VarTraceInfo2, "Tcl_VarTraceInfo2");
--
--      function Tcl_VarTraceInfo2 (
--         interp          : in Tcl_Interp;
--         part1           : in String;
--         part2           : in String;
--         flags           : in C.Int;
--         procPtr         : in Tcl_VarTraceProc;
--         prevclientdata  : in ClientData
--      ) return ClientData;
--
--   end Generic_TraceVar;

   function Tcl_DStringValue (
      dsPtr           : in Tcl_DString
   ) return String;

   function Tcl_Alloc (
      size            : in C.Unsigned
   ) return String;

   procedure Tcl_Free (
      ptr             : in String
   );

   function Tcl_Realloc (
      ptr             : in String;
      size            : in C.Unsigned
   ) return String;

   procedure Tcl_AddErrorInfo (
      interp          : in Tcl_Interp;
      message         : in String
   );

   procedure Tcl_AppendElement (
      interp          : in Tcl_Interp;
      strng           : in String
   );

   procedure Tcl_AppendResult (
      interp          : in Tcl_Interp;
      String1         : in String := "";
      String2         : in String := "";
      String3         : in String := "";
      String4         : in String := "";
      String5         : in String := "";
      String6         : in String := "";
      String7         : in String := "";
      String8         : in String := "";
      String9         : in String := ""
   );

   procedure Tcl_Backslash (
      src             : in String;
      readPtr         : access C.Int;
      result          : out C.Char
   );

   function Tcl_CommandComplete (
      cmd             : in String
   ) return C.Int;

   function Tcl_Concat (
      argc            : in C.Int;
      argv            : in CArgv.Chars_Ptr_Ptr
   ) return String;

   function Tcl_ConvertElement (
      src             : in String;
      dst             : in String;
      flags           : in C.Int
   ) return C.Int;

   function Tcl_CreateAlias (
      slave           : in Tcl_Interp;
      slaveCmd        : in String;
      target          : in Tcl_Interp;
      targetCmd       : in String;
      argc            : in C.Int;
      argv            : in CArgv.Chars_Ptr_Ptr
   ) return C.Int;

   function Tcl_CreateSlave (
      interp          : in Tcl_Interp;
      slaveName       : in String;
      isSafe          : in C.Int
   ) return Tcl_Interp;

   function Tcl_DbCkalloc (
      size            : in C.Unsigned;
      file            : in String;
      line            : in C.Int
   ) return String;

   function Tcl_DbCkfree (
      ptr             : in String;
      file            : in String;
      line            : in C.Int
   ) return C.Int;

   function Tcl_DbCkrealloc (
      ptr             : in String;
      size            : in C.Unsigned;
      file            : in String;
      line            : in C.Int
   ) return String;

   function Tcl_DStringAppend (
      dsPtr           : in Tcl_DString;
      strng           : in String;
      length          : in C.Int
   ) return String;

   procedure Tcl_DStringAppend (
      dsPtr           : in Tcl_DString;
      strng           : in String;
      length          : in C.Int
   );

   function Tcl_DStringAppendElement (
      dsPtr           : in Tcl_DString;
      strng           : in String
   ) return String;

   procedure Tcl_DStringAppendElement (
      dsPtr           : in Tcl_DString;
      strng           : in String
   );

   function Tcl_ErrnoId return String;

   function Tcl_ErrnoMsg (
      err             : in C.Int
   ) return String;

   function Tcl_Eval (
      interp          : in Tcl_Interp;
      cmd             : in String
   ) return C.Int;

   procedure Tcl_Eval (
      interp          : in Tcl_Interp;
      cmd             : in String
   );

   function Tcl_EvalFile (
      interp          : in Tcl_Interp;
      fileName        : in String
   ) return C.Int;

   procedure Tcl_EvalFile (
      interp          : in Tcl_Interp;
      fileName        : in String
   );

   function Tcl_ExprBoolean (
      interp          : in Tcl_Interp;
      strng           : in String
   ) return Boolean;

   function Tcl_ExprDouble (
      interp          : in Tcl_Interp;
      strng           : in String
   ) return C.Double;

   function Tcl_ExprLong (
      interp          : in Tcl_Interp;
      strng           : in String
   ) return C.Long;

   function Tcl_ExprString (
      interp          : in Tcl_Interp;
      strng           : in String
   ) return String;

   procedure Tcl_FindExecutable (
      argv0           : in String
   );

   procedure Tcl_GetAlias (
      interp          : in Tcl_Interp;
      slaveCmd        : in String;
      targetInterpPtr : in Tcl_Interp;
      targetCmdPtr    : in CArgv.Chars_Ptr_Ptr;
      argcPtr         : access C.Int;
      argvPtr         : access CArgv.Chars_Ptr_Ptr;
      result          : out C.Int
   );

   procedure Tcl_GetBoolean (
      interp          : in Tcl_Interp;
      strng           : in String;
      boolPtr         : access C.Int;
      result          : out C.Int
   );

   procedure Tcl_GetDouble (
      interp          : in Tcl_Interp;
      strng           : in String;
      doublePtr       : access C.Double;
      result          : out C.Int
   );

   function Tcl_GetHostName return String;

   procedure Tcl_GetInt (
      interp          : in Tcl_Interp;
      strng           : in String;
      intPtr          : access C.Int;
      result          : out C.Int
   );

   function Tcl_GetPathType (
      path            : in String
   ) return Tcl_PathType;

   function Tcl_GetSlave (
      interp          : in Tcl_Interp;
      slaveName       : in String
   ) return Tcl_Interp;

   function Tcl_GetVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      flags           : in C.Int
   ) return String;

   function Tcl_GetVar2 (
      interp          : in Tcl_Interp;
      part1           : in String;
      part2           : in String;
      flags           : in C.Int
   ) return String;

   function Tcl_GlobalEval (
      interp          : in Tcl_Interp;
      command         : in String
   ) return C.Int;

   procedure Tcl_GlobalEval (
      interp          : in Tcl_Interp;
      command         : in String
   );

   function Tcl_JoinPath (
      argc            : in C.Int;
      argv            : in CArgv.Chars_Ptr_Ptr;
      resultPtr       : in Tcl_DString
   ) return String;

   function Tcl_LinkVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      addr            : in String;
      typ             : in C.Int
   ) return C.Int;

   procedure Tcl_LinkVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      addr            : in String;
      typ             : in C.Int
   );

   function Tcl_Merge (
      argc            : in C.Int;
      argv            : in CArgv.Chars_Ptr_Ptr
   ) return String;

   function Tcl_ParseVar (
      interp          : in Tcl_Interp;
      strng           : in String;
      termPtr         : in CArgv.Chars_Ptr_Ptr
   ) return String;

   function Tcl_PkgProvide (
      interp          : in Tcl_Interp;
      name            : in String;
      version         : in String
   ) return C.Int;

   procedure Tcl_PkgProvide (
      interp          : in Tcl_Interp;
      name            : in String;
      version         : in String
   );

   function Tcl_PkgRequire (
      interp          : in Tcl_Interp;
      name            : in String;
      version         : in String;
      exact           : in C.Int
   ) return String;

   function Tcl_PosixError (
      interp          : in Tcl_Interp
   ) return String;

   procedure Tcl_PrintDouble (
      interp          : in Tcl_Interp;
      value           : in C.Double;
      dst             : in String
   );

   function Tcl_PutEnv (
      strng           : in String
   ) return C.Int;

   function Tcl_RecordAndEval (
      interp          : in Tcl_Interp;
      cmd             : in String;
      flags           : in C.Int
   ) return C.Int;

   procedure Tcl_RecordAndEval (
      interp          : in Tcl_Interp;
      cmd             : in String;
      flags           : in C.Int
   );

   function Tcl_RegExpCompile (
      interp          : in Tcl_Interp;
      strng           : in String
   ) return Tcl_RegExp;

   function Tcl_RegExpExec (
      interp          : in Tcl_Interp;
      regexp          : in Tcl_RegExp;
      strng           : in String;
      start           : in String
   ) return C.Int;

   procedure Tcl_RegExpExec (
      interp          : in Tcl_Interp;
      regexp          : in Tcl_RegExp;
      strng           : in String;
      start           : in String
   );

   function Tcl_RegExpMatch (
      interp          : in Tcl_Interp;
      strng           : in String;
      pattern         : in String
   ) return C.Int;

   procedure Tcl_RegExpMatch (
      interp          : in Tcl_Interp;
      strng           : in String;
      pattern         : in String
   );

   procedure Tcl_ScanElement (
      strng           : in String;
      flagPtr         : access C.Int;
      result          : out C.Int
   );

   procedure Tcl_SetErrorCode (
      interp          : in Tcl_Interp;
      String1         : in String := "";
      String2         : in String := "";
      String3         : in String := "";
      String4         : in String := "";
      String5         : in String := "";
      String6         : in String := "";
      String7         : in String := "";
      String8         : in String := "";
      String9         : in String := ""
   );

   procedure Tcl_SetResult (
      interp          : in Tcl_Interp;
      strng           : in String
   );

   function Tcl_SetVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      newValue        : in String;
      flags           : in C.Int
   ) return String;

   procedure Tcl_SetVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      newValue        : in String;
      flags           : in C.Int
   );

   function Tcl_SetVar2 (
      interp          : in Tcl_Interp;
      part1           : in String;
      part2           : in String;
      newValue        : in String;
      flags           : in C.Int
   ) return String;

   procedure Tcl_SetVar2 (
      interp          : in Tcl_Interp;
      part1           : in String;
      part2           : in String;
      newValue        : in String;
      flags           : in C.Int
   );

   function Tcl_SignalId (
      sig             : in C.Int
   ) return String;

   function Tcl_SignalMsg (
      sig             : in C.Int
   ) return String;

   procedure Tcl_SplitList (
      interp          : in Tcl_Interp;
      list            : in String;
      argcPtr         : access C.Int;
      argvPtr         : access CArgv.Chars_Ptr_Ptr;
      result          : out C.Int
   );

   procedure Tcl_SplitPath (
      path            : in String;
      argcPtr         : access C.Int;
      argvPtr         : access CArgv.Chars_Ptr_Ptr
   );

   procedure Tcl_StaticPackage (
      interp          : in Tcl_Interp;
      pkgName         : in String;
      initProc        : in Tcl_PackageInitProc;
      safeInitProc    : in Tcl_PackageInitProc
   );

   function Tcl_StringMatch (
      strng           : in String;
      pattern         : in String
   ) return C.Int;

   procedure Tcl_UnlinkVar (
      interp          : in Tcl_Interp;
      varName         : in String
   );

   function Tcl_UnsetVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      flags           : in C.Int
   ) return C.Int;

   procedure Tcl_UnsetVar (
      interp          : in Tcl_Interp;
      varName         : in String;
      flags           : in C.Int
   );

   function Tcl_UnsetVar2 (
      interp          : in Tcl_Interp;
      part1           : in String;
      part2           : in String;
      flags           : in C.Int
   ) return C.Int;

   procedure Tcl_UnsetVar2 (
      interp          : in Tcl_Interp;
      part1           : in String;
      part2           : in String;
      flags           : in C.Int
   );

   procedure Tcl_UpdateLinkedVar (
      interp          : in Tcl_Interp;
      varName         : in String
   );

   function Tcl_UpVar (
      interp          : in Tcl_Interp;
      frameName       : in String;
      varName         : in String;
      localName       : in String;
      flags           : in C.Int
   ) return C.Int;

   procedure Tcl_UpVar (
      interp          : in Tcl_Interp;
      frameName       : in String;
      varName         : in String;
      localName       : in String;
      flags           : in C.Int
   );

   function Tcl_UpVar2 (
      interp          : in Tcl_Interp;
      frameName       : in String;
      part1           : in String;
      part2           : in String;
      localName       : in String;
      flags           : in C.Int
   ) return C.Int;

   procedure Tcl_UpVar2 (
      interp          : in Tcl_Interp;
      frameName       : in String;
      part1           : in String;
      part2           : in String;
      localName       : in String;
      flags           : in C.Int
   );

   function Tcl_VarEval (
      interp          : in Tcl_Interp;
      String1         : in String := "";
      String2         : in String := "";
      String3         : in String := "";
      String4         : in String := "";
      String5         : in String := "";
      String6         : in String := "";
      String7         : in String := "";
      String8         : in String := "";
      String9         : in String := ""
   ) return C.Int;

   procedure Tcl_VarEval (
      interp          : in Tcl_Interp;
      String1         : in String := "";
      String2         : in String := "";
      String3         : in String := "";
      String4         : in String := "";
      String5         : in String := "";
      String6         : in String := "";
      String7         : in String := "";
      String8         : in String := "";
      String9         : in String := ""
   );

   function Tcl_GetResult (
      interp          : in Tcl_Interp
   ) return String;


end Tcl.Ada;