Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Tcl_Interp(3)		     Tcl Library Procedures		   Tcl_Interp(3)

________________________________________________________________________________

NAME
     Tcl_Interp - client-visible fields of interpreter structures

SYNOPSIS
     #include <tcl.h>

     typedef struct {
	 char *result;
	 Tcl_FreeProc *freeProc;
	 int errorLine;
     } Tcl_Interp;

     typedef void Tcl_FreeProc(
	     char *blockPtr);
________________________________________________________________________________

DESCRIPTION
     The Tcl_CreateInterp procedure returns a pointer to a Tcl_Interp structure.
     Callers  of  Tcl_CreateInterp  should  use this pointer as an opaque token,
     suitable for nothing other than passing back to other routines in	the  Tcl
     interface.   Accessing fields directly through the pointer as described be-
     low is no longer supported.  The supported public	routines  Tcl_SetResult,
     Tcl_GetResult, Tcl_SetErrorLine, Tcl_GetErrorLine must be used instead.

     For  legacy  programs  and  extensions no longer being maintained, compiles
     against the Tcl 8.6 header files are only possible with the compiler direc-
     tives
	    #define USE_INTERP_RESULT
     and/or
	    #define USE_INTERP_ERRORLINE
     depending on which fields of the Tcl_Interp struct are accessed.  These di-
     rectives may be embedded in code or supplied via compiler options.

     The result and freeProc fields are used to return results or error messages
     from commands.  This information is returned by command procedures back  to
     Tcl_Eval,	and by Tcl_Eval back to its callers.  The result field points to
     the string that represents the result or error message,  and  the	freeProc
     field  tells  how	to  dispose of the storage for the string when it is not
     needed anymore.  The easiest way for command procedures to manipulate these
     fields is to call procedures like Tcl_SetResult or Tcl_AppendResult;   they
     will hide all the details of managing the fields.	The description below is
     for those procedures that manipulate the fields directly.

     Whenever  a command procedure returns, it must ensure that the result field
     of its interpreter points to the string being returned by the command.  The
     result field must always point to a valid string.	If a command  wishes  to
     return no result then interp->result should point to an empty string.  Nor-
     mally, results are assumed to be statically allocated, which means that the
     contents  will  not  change before the next time Tcl_Eval is called or some
     other command procedure is invoked.  In this case, the freeProc field  must
     be  zero.	 Alternatively, a command procedure may dynamically allocate its
     return value (e.g. using Tcl_Alloc) and  store  a	pointer  to  it  in  in-
     terp->result.   In  this  case,  the  command  procedure  must also set in-
     terp->freeProc to the address of a procedure that can free  the  value,  or
     TCL_DYNAMIC  if  the  storage was allocated directly by Tcl or by a call to
     Tcl_Alloc.  If interp->freeProc is non-zero, then Tcl will call freeProc to
     free the space pointed to by interp->result before it invokes the next com-
     mand.  If a client procedure overwrites interp->result when  interp->freeP-
     roc  is  non-zero,  then it is responsible for calling freeProc to free the
     old interp->result (the Tcl_FreeResult macro should be used for  this  pur-
     pose).

     FreeProc  should have arguments and result that match the Tcl_FreeProc dec-
     laration above:  it receives a single argument which is a	pointer  to  the
     result  value  to	free.  In most applications TCL_DYNAMIC is the only non-
     zero value ever used for freeProc.  However, an  application  may	store  a
     different procedure address in freeProc in order to use an alternate memory
     allocator or in order to do other cleanup when the result memory is freed.

     As part of processing each command, Tcl_Eval initializes interp->result and
     interp->freeProc just before calling the command procedure for the command.
     The  freeProc  field  will  be initialized to zero, and interp->result will
     point to an empty string.	Commands that do not return any value can simply
     leave the fields alone.  Furthermore, the empty string pointed to by result
     is actually part of an array of TCL_RESULT_SIZE  characters  (approximately
     200).   If a command wishes to return a short string, it can simply copy it
     to the area pointed to by interp->result.	Or, it can use the sprintf  pro-
     cedure  to generate a short result string at the location pointed to by in-
     terp->result.

     It is a general convention in Tcl-based applications that the result of  an
     interpreter  is normally in the initialized state described in the previous
     paragraph.  Procedures that manipulate an interpreter's result (e.g. by re-
     turning an error) will generally assume that the result has  been	initial-
     ized when the procedure is called.  If such a procedure is to be called af-
     ter  the  result  has  been  changed, then Tcl_ResetResult should be called
     first to reset the result to its initialized state.  The direct use of  in-
     terp->result is strongly deprecated (see Tcl_SetResult).

     The errorLine field is valid only after Tcl_Eval returns a TCL_ERROR return
     code.   In this situation the errorLine field identifies the line number of
     the command being executed when the error occurred.  The line  numbers  are
     relative to the command being executed:  1 means the first line of the com-
     mand passed to Tcl_Eval, 2 means the second line, and so on.  The errorLine
     field  is typically used in conjunction with Tcl_AddErrorInfo to report in-
     formation about where an error occurred.  ErrorLine should not normally  be
     modified except by Tcl_Eval.

KEYWORDS
     free, initialized, interpreter, malloc, result

Tcl				       7.5			   Tcl_Interp(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=Tcl_Interp.tcl86&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help