tclInt.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:101k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * tclInt.h --
  3.  *
  4.  * Declarations of things used internally by the Tcl interpreter.
  5.  *
  6.  * Copyright (c) 1987-1993 The Regents of the University of California.
  7.  * Copyright (c) 1993-1997 Lucent Technologies.
  8.  * Copyright (c) 1994-1998 Sun Microsystems, Inc.
  9.  * Copyright (c) 1998-1999 by Scriptics Corporation.
  10.  * Copyright (c) 2001, 2002 by Kevin B. Kenny.  All rights reserved.
  11.  * Copyright (c) 2007 Daniel A. Steffen <das@users.sourceforge.net>
  12.  *
  13.  * See the file "license.terms" for information on usage and redistribution
  14.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  15.  *
  16.  * RCS: @(#) $Id: tclInt.h,v 1.118.2.30 2007/09/13 15:28:13 das Exp $
  17.  */
  18. #ifndef _TCLINT
  19. #define _TCLINT
  20. /*
  21.  * Common include files needed by most of the Tcl source files are
  22.  * included here, so that system-dependent personalizations for the
  23.  * include files only have to be made in once place.  This results
  24.  * in a few extra includes, but greater modularity.  The order of
  25.  * the three groups of #includes is important. For example, stdio.h
  26.  * is needed by tcl.h, and the _ANSI_ARGS_ declaration in tcl.h is
  27.  * needed by stdlib.h in some configurations.
  28.  */
  29. #ifndef _TCL
  30. #include "tcl.h"
  31. #endif
  32. #include <stdio.h>
  33. #include <ctype.h>
  34. #ifdef NO_LIMITS_H
  35. #   include "../compat/limits.h"
  36. #else
  37. #   include <limits.h>
  38. #endif
  39. #ifdef NO_STDLIB_H
  40. #   include "../compat/stdlib.h"
  41. #else
  42. #   include <stdlib.h>
  43. #endif
  44. #ifdef NO_STRING_H
  45. #include "../compat/string.h"
  46. #else
  47. #include <string.h>
  48. #endif
  49. /*
  50.  * Ensure WORDS_BIGENDIAN is defined correcly:
  51.  * Needs to happen here in addition to configure to work with fat compiles on
  52.  * Darwin (where configure runs only once for multiple architectures).
  53.  */
  54. #ifdef HAVE_SYS_TYPES_H
  55. #    include <sys/types.h>
  56. #endif
  57. #ifdef HAVE_SYS_PARAM_H
  58. #    include <sys/param.h>
  59. #endif
  60. #ifdef BYTE_ORDER
  61. #    ifdef BIG_ENDIAN
  62. #        if BYTE_ORDER == BIG_ENDIAN
  63. #            undef WORDS_BIGENDIAN
  64. #            define WORDS_BIGENDIAN 1
  65. #        endif
  66. #    endif
  67. #    ifdef LITTLE_ENDIAN
  68. #        if BYTE_ORDER == LITTLE_ENDIAN
  69. #            undef WORDS_BIGENDIAN
  70. #        endif
  71. #    endif
  72. #endif
  73. /*
  74.  * Used to tag functions that are only to be visible within the module being
  75.  * built and not outside it (where this is supported by the linker).
  76.  */
  77. #ifndef MODULE_SCOPE
  78. #   ifdef __cplusplus
  79. # define MODULE_SCOPE extern "C"
  80. #   else
  81. # define MODULE_SCOPE extern
  82. #   endif
  83. #endif
  84. #undef TCL_STORAGE_CLASS
  85. #ifdef BUILD_tcl
  86. # define TCL_STORAGE_CLASS DLLEXPORT
  87. #else
  88. # ifdef USE_TCL_STUBS
  89. #  define TCL_STORAGE_CLASS
  90. # else
  91. #  define TCL_STORAGE_CLASS DLLIMPORT
  92. # endif
  93. #endif
  94. /*
  95.  * The following procedures allow namespaces to be customized to
  96.  * support special name resolution rules for commands/variables.
  97.  * 
  98.  */
  99. struct Tcl_ResolvedVarInfo;
  100. typedef Tcl_Var (Tcl_ResolveRuntimeVarProc) _ANSI_ARGS_((
  101.     Tcl_Interp* interp, struct Tcl_ResolvedVarInfo *vinfoPtr));
  102. typedef void (Tcl_ResolveVarDeleteProc) _ANSI_ARGS_((
  103.     struct Tcl_ResolvedVarInfo *vinfoPtr));
  104. /*
  105.  * The following structure encapsulates the routines needed to resolve a
  106.  * variable reference at runtime.  Any variable specific state will typically
  107.  * be appended to this structure.
  108.  */
  109. typedef struct Tcl_ResolvedVarInfo {
  110.     Tcl_ResolveRuntimeVarProc *fetchProc;
  111.     Tcl_ResolveVarDeleteProc *deleteProc;
  112. } Tcl_ResolvedVarInfo;
  113. typedef int (Tcl_ResolveCompiledVarProc) _ANSI_ARGS_((
  114.     Tcl_Interp* interp, CONST84 char* name, int length,
  115.     Tcl_Namespace *context, Tcl_ResolvedVarInfo **rPtr));
  116. typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_((
  117.     Tcl_Interp* interp, CONST84 char* name, Tcl_Namespace *context,
  118.     int flags, Tcl_Var *rPtr));
  119. typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_((Tcl_Interp* interp,
  120.     CONST84 char* name, Tcl_Namespace *context, int flags,
  121.     Tcl_Command *rPtr));
  122.  
  123. typedef struct Tcl_ResolverInfo {
  124.     Tcl_ResolveCmdProc *cmdResProc; /* Procedure handling command name
  125.  * resolution. */
  126.     Tcl_ResolveVarProc *varResProc; /* Procedure handling variable name
  127.  * resolution for variables that
  128.  * can only be handled at runtime. */
  129.     Tcl_ResolveCompiledVarProc *compiledVarResProc;
  130. /* Procedure handling variable name
  131.  * resolution at compile time. */
  132. } Tcl_ResolverInfo;
  133. /*
  134.  *----------------------------------------------------------------
  135.  * Data structures related to namespaces.
  136.  *----------------------------------------------------------------
  137.  */
  138. /*
  139.  * The structure below defines a namespace.
  140.  * Note: the first five fields must match exactly the fields in a
  141.  * Tcl_Namespace structure (see tcl.h). If you change one, be sure to
  142.  * change the other.
  143.  */
  144. typedef struct Namespace {
  145.     char *name;  /* The namespace's simple (unqualified)
  146.   * name. This contains no ::'s. The name of
  147.   * the global namespace is "" although "::"
  148.   * is an synonym. */
  149.     char *fullName;  /* The namespace's fully qualified name.
  150.   * This starts with ::. */
  151.     ClientData clientData;  /* An arbitrary value associated with this
  152.   * namespace. */
  153.     Tcl_NamespaceDeleteProc *deleteProc;
  154.  /* Procedure invoked when deleting the
  155.   * namespace to, e.g., free clientData. */
  156.     struct Namespace *parentPtr; /* Points to the namespace that contains
  157.   * this one. NULL if this is the global
  158.   * namespace. */
  159.     Tcl_HashTable childTable;  /* Contains any child namespaces. Indexed
  160.   * by strings; values have type
  161.   * (Namespace *). */
  162.     long nsId;  /* Unique id for the namespace. */
  163.     Tcl_Interp *interp;  /* The interpreter containing this
  164.   * namespace. */
  165.     int flags;  /* OR-ed combination of the namespace
  166.   * status flags NS_DYING and NS_DEAD
  167.   * listed below. */
  168.     int activationCount;  /* Number of "activations" or active call
  169.   * frames for this namespace that are on
  170.   * the Tcl call stack. The namespace won't
  171.   * be freed until activationCount becomes
  172.   * zero. */
  173.     int refCount;  /* Count of references by namespaceName *
  174.   * objects. The namespace can't be freed
  175.   * until refCount becomes zero. */
  176.     Tcl_HashTable cmdTable;  /* Contains all the commands currently
  177.   * registered in the namespace. Indexed by
  178.   * strings; values have type (Command *).
  179.   * Commands imported by Tcl_Import have
  180.   * Command structures that point (via an
  181.   * ImportedCmdRef structure) to the
  182.   * Command structure in the source
  183.   * namespace's command table. */
  184.     Tcl_HashTable varTable;  /* Contains all the (global) variables
  185.   * currently in this namespace. Indexed
  186.   * by strings; values have type (Var *). */
  187.     char **exportArrayPtr;  /* Points to an array of string patterns
  188.   * specifying which commands are exported.
  189.   * A pattern may include "string match"
  190.   * style wildcard characters to specify
  191.   * multiple commands; however, no namespace
  192.   * qualifiers are allowed. NULL if no
  193.   * export patterns are registered. */
  194.     int numExportPatterns;  /* Number of export patterns currently
  195.   * registered using "namespace export". */
  196.     int maxExportPatterns;  /* Mumber of export patterns for which
  197.   * space is currently allocated. */
  198.     int cmdRefEpoch;  /* Incremented if a newly added command
  199.   * shadows a command for which this
  200.   * namespace has already cached a Command *
  201.   * pointer; this causes all its cached
  202.   * Command* pointers to be invalidated. */
  203.     int resolverEpoch;  /* Incremented whenever (a) the name resolution
  204.   * rules change for this namespace or (b) a 
  205.   * newly added command shadows a command that
  206.   * is compiled to bytecodes.
  207.   * This invalidates all byte codes compiled
  208.   * in the namespace, causing the code to be
  209.   * recompiled under the new rules.*/
  210.     Tcl_ResolveCmdProc *cmdResProc;
  211.  /* If non-null, this procedure overrides
  212.   * the usual command resolution mechanism
  213.   * in Tcl.  This procedure is invoked
  214.   * within Tcl_FindCommand to resolve all
  215.   * command references within the namespace. */
  216.     Tcl_ResolveVarProc *varResProc;
  217.  /* If non-null, this procedure overrides
  218.   * the usual variable resolution mechanism
  219.   * in Tcl.  This procedure is invoked
  220.   * within Tcl_FindNamespaceVar to resolve all
  221.   * variable references within the namespace
  222.   * at runtime. */
  223.     Tcl_ResolveCompiledVarProc *compiledVarResProc;
  224.  /* If non-null, this procedure overrides
  225.   * the usual variable resolution mechanism
  226.   * in Tcl.  This procedure is invoked
  227.   * within LookupCompiledLocal to resolve
  228.   * variable references within the namespace
  229.   * at compile time. */
  230. } Namespace;
  231. /*
  232.  * Flags used to represent the status of a namespace:
  233.  *
  234.  * NS_DYING - 1 means Tcl_DeleteNamespace has been called to delete the
  235.  * namespace but there are still active call frames on the Tcl
  236.  * stack that refer to the namespace. When the last call frame
  237.  * referring to it has been popped, it's variables and command
  238.  * will be destroyed and it will be marked "dead" (NS_DEAD).
  239.  * The namespace can no longer be looked up by name.
  240.  * NS_DEAD - 1 means Tcl_DeleteNamespace has been called to delete the
  241.  * namespace and no call frames still refer to it. Its
  242.  * variables and command have already been destroyed. This bit
  243.  * allows the namespace resolution code to recognize that the
  244.  * namespace is "deleted". When the last namespaceName object
  245.  * in any byte code code unit that refers to the namespace has
  246.  * been freed (i.e., when the namespace's refCount is 0), the
  247.  * namespace's storage will be freed.
  248.  * NS_KILLED    1 means that TclTeardownNamespace has already been called on
  249.  *              this namespace and it should not be called again [Bug 1355942]
  250.  */
  251. #define NS_DYING 0x01
  252. #define NS_DEAD 0x02
  253. #define NS_KILLED       0x04
  254. /*
  255.  * Flag passed to TclGetNamespaceForQualName to have it create all namespace
  256.  * components of a namespace-qualified name that cannot be found. The new
  257.  * namespaces are created within their specified parent. Note that this
  258.  * flag's value must not conflict with the values of the flags
  259.  * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, and FIND_ONLY_NS (defined in
  260.  * tclNamesp.c).
  261.  */
  262. #define CREATE_NS_IF_UNKNOWN 0x800
  263. /*
  264.  *----------------------------------------------------------------
  265.  * Data structures related to variables.   These are used primarily
  266.  * in tclVar.c
  267.  *----------------------------------------------------------------
  268.  */
  269. /*
  270.  * The following structure defines a variable trace, which is used to
  271.  * invoke a specific C procedure whenever certain operations are performed
  272.  * on a variable.
  273.  */
  274. typedef struct VarTrace {
  275.     Tcl_VarTraceProc *traceProc;/* Procedure to call when operations given
  276.  * by flags are performed on variable. */
  277.     ClientData clientData; /* Argument to pass to proc. */
  278.     int flags; /* What events the trace procedure is
  279.  * interested in:  OR-ed combination of
  280.  * TCL_TRACE_READS, TCL_TRACE_WRITES,
  281.  * TCL_TRACE_UNSETS and TCL_TRACE_ARRAY. */
  282.     struct VarTrace *nextPtr; /* Next in list of traces associated with
  283.  * a particular variable. */
  284. } VarTrace;
  285. /*
  286.  * The following structure defines a command trace, which is used to
  287.  * invoke a specific C procedure whenever certain operations are performed
  288.  * on a command.
  289.  */
  290. typedef struct CommandTrace {
  291.     Tcl_CommandTraceProc *traceProc;/* Procedure to call when operations given
  292.      * by flags are performed on command. */
  293.     ClientData clientData;     /* Argument to pass to proc. */
  294.     int flags;     /* What events the trace procedure is
  295.      * interested in:  OR-ed combination of
  296.      * TCL_TRACE_RENAME, TCL_TRACE_DELETE. */
  297.     struct CommandTrace *nextPtr;   /* Next in list of traces associated with
  298.      * a particular command. */
  299.     int refCount;                   /* Used to ensure this structure is
  300.                                      * not deleted too early.  Keeps track
  301.                                      * of how many pieces of code have
  302.                                      * a pointer to this structure. */
  303. } CommandTrace;
  304. /*
  305.  * When a command trace is active (i.e. its associated procedure is
  306.  * executing), one of the following structures is linked into a list
  307.  * associated with the command's interpreter.  The information in
  308.  * the structure is needed in order for Tcl to behave reasonably
  309.  * if traces are deleted while traces are active.
  310.  */
  311. typedef struct ActiveCommandTrace {
  312.     struct Command *cmdPtr; /* Command that's being traced. */
  313.     struct ActiveCommandTrace *nextPtr;
  314. /* Next in list of all active command
  315.  * traces for the interpreter, or NULL
  316.  * if no more. */
  317.     CommandTrace *nextTracePtr; /* Next trace to check after current
  318.  * trace procedure returns;  if this
  319.  * trace gets deleted, must update pointer
  320.  * to avoid using free'd memory. */
  321.     int reverseScan; /* Boolean set true when the traces
  322.  * are scanning in reverse order. */
  323. } ActiveCommandTrace;
  324. /*
  325.  * When a variable trace is active (i.e. its associated procedure is
  326.  * executing), one of the following structures is linked into a list
  327.  * associated with the variable's interpreter. The information in
  328.  * the structure is needed in order for Tcl to behave reasonably
  329.  * if traces are deleted while traces are active.
  330.  */
  331. typedef struct ActiveVarTrace {
  332.     struct Var *varPtr; /* Variable that's being traced. */
  333.     struct ActiveVarTrace *nextPtr;
  334. /* Next in list of all active variable
  335.  * traces for the interpreter, or NULL
  336.  * if no more. */
  337.     VarTrace *nextTracePtr; /* Next trace to check after current
  338.  * trace procedure returns;  if this
  339.  * trace gets deleted, must update pointer
  340.  * to avoid using free'd memory. */
  341. } ActiveVarTrace;
  342. /*
  343.  * The following structure describes an enumerative search in progress on
  344.  * an array variable;  this are invoked with options to the "array"
  345.  * command.
  346.  */
  347. typedef struct ArraySearch {
  348.     int id; /* Integer id used to distinguish among
  349.  * multiple concurrent searches for the
  350.  * same array. */
  351.     struct Var *varPtr; /* Pointer to array variable that's being
  352.  * searched. */
  353.     Tcl_HashSearch search; /* Info kept by the hash module about
  354.  * progress through the array. */
  355.     Tcl_HashEntry *nextEntry; /* Non-null means this is the next element
  356.  * to be enumerated (it's leftover from
  357.  * the Tcl_FirstHashEntry call or from
  358.  * an "array anymore" command).  NULL
  359.  * means must call Tcl_NextHashEntry
  360.  * to get value to return. */
  361.     struct ArraySearch *nextPtr;/* Next in list of all active searches
  362.  * for this variable, or NULL if this is
  363.  * the last one. */
  364. } ArraySearch;
  365. /*
  366.  * The structure below defines a variable, which associates a string name
  367.  * with a Tcl_Obj value. These structures are kept in procedure call frames
  368.  * (for local variables recognized by the compiler) or in the heap (for
  369.  * global variables and any variable not known to the compiler). For each
  370.  * Var structure in the heap, a hash table entry holds the variable name and
  371.  * a pointer to the Var structure.
  372.  */
  373. typedef struct Var {
  374.     union {
  375. Tcl_Obj *objPtr; /* The variable's object value. Used for 
  376.  * scalar variables and array elements. */
  377. Tcl_HashTable *tablePtr;/* For array variables, this points to
  378.  * information about the hash table used
  379.  * to implement the associative array. 
  380.  * Points to malloc-ed data. */
  381. struct Var *linkPtr; /* If this is a global variable being
  382.  * referred to in a procedure, or a variable
  383.  * created by "upvar", this field points to
  384.  * the referenced variable's Var struct. */
  385.     } value;
  386.     char *name; /* NULL if the variable is in a hashtable,
  387.  * otherwise points to the variable's
  388.  * name. It is used, e.g., by TclLookupVar
  389.  * and "info locals". The storage for the
  390.  * characters of the name is not owned by
  391.  * the Var and must not be freed when
  392.  * freeing the Var. */
  393.     Namespace *nsPtr; /* Points to the namespace that contains
  394.  * this variable or NULL if the variable is
  395.  * a local variable in a Tcl procedure. */
  396.     Tcl_HashEntry *hPtr; /* If variable is in a hashtable, either the
  397.  * hash table entry that refers to this
  398.  * variable or NULL if the variable has been
  399.  * detached from its hash table (e.g. an
  400.  * array is deleted, but some of its
  401.  * elements are still referred to in
  402.  * upvars). NULL if the variable is not in a
  403.  * hashtable. This is used to delete an
  404.  * variable from its hashtable if it is no
  405.  * longer needed. */
  406.     int refCount; /* Counts number of active uses of this
  407.  * variable, not including its entry in the
  408.  * call frame or the hash table: 1 for each
  409.  * additional variable whose linkPtr points
  410.  * here, 1 for each nested trace active on
  411.  * variable, and 1 if the variable is a 
  412.  * namespace variable. This record can't be
  413.  * deleted until refCount becomes 0. */
  414.     VarTrace *tracePtr; /* First in list of all traces set for this
  415.  * variable. */
  416.     ArraySearch *searchPtr; /* First in list of all searches active
  417.  * for this variable, or NULL if none. */
  418.     int flags; /* Miscellaneous bits of information about
  419.  * variable. See below for definitions. */
  420. } Var;
  421. /*
  422.  * Flag bits for variables. The first three (VAR_SCALAR, VAR_ARRAY, and
  423.  * VAR_LINK) are mutually exclusive and give the "type" of the variable.
  424.  * VAR_UNDEFINED is independent of the variable's type. 
  425.  *
  426.  * VAR_SCALAR - 1 means this is a scalar variable and not
  427.  * an array or link. The "objPtr" field points
  428.  * to the variable's value, a Tcl object.
  429.  * VAR_ARRAY - 1 means this is an array variable rather
  430.  * than a scalar variable or link. The
  431.  * "tablePtr" field points to the array's
  432.  * hashtable for its elements.
  433.  * VAR_LINK - 1 means this Var structure contains a
  434.  * pointer to another Var structure that
  435.  * either has the real value or is itself
  436.  * another VAR_LINK pointer. Variables like
  437.  * this come about through "upvar" and "global"
  438.  * commands, or through references to variables
  439.  * in enclosing namespaces.
  440.  * VAR_UNDEFINED - 1 means that the variable is in the process
  441.  * of being deleted. An undefined variable
  442.  * logically does not exist and survives only
  443.  * while it has a trace, or if it is a global
  444.  * variable currently being used by some
  445.  * procedure.
  446.  * VAR_IN_HASHTABLE - 1 means this variable is in a hashtable and
  447.  * the Var structure is malloced. 0 if it is
  448.  * a local variable that was assigned a slot
  449.  * in a procedure frame by the compiler so the
  450.  * Var storage is part of the call frame.
  451.  * VAR_TRACE_ACTIVE - 1 means that trace processing is currently
  452.  * underway for a read or write access, so
  453.  * new read or write accesses should not cause
  454.  * trace procedures to be called and the
  455.  * variable can't be deleted.
  456.  * VAR_ARRAY_ELEMENT - 1 means that this variable is an array
  457.  * element, so it is not legal for it to be
  458.  * an array itself (the VAR_ARRAY flag had
  459.  * better not be set).
  460.  * VAR_NAMESPACE_VAR - 1 means that this variable was declared
  461.  * as a namespace variable. This flag ensures
  462.  * it persists until its namespace is
  463.  * destroyed or until the variable is unset;
  464.  * it will persist even if it has not been
  465.  * initialized and is marked undefined.
  466.  * The variable's refCount is incremented to
  467.  * reflect the "reference" from its namespace.
  468.  *
  469.  * The following additional flags are used with the CompiledLocal type
  470.  * defined below:
  471.  *
  472.  * VAR_ARGUMENT - 1 means that this variable holds a procedure
  473.  * argument. 
  474.  * VAR_TEMPORARY - 1 if the local variable is an anonymous
  475.  * temporary variable. Temporaries have a NULL
  476.  * name.
  477.  * VAR_RESOLVED - 1 if name resolution has been done for this
  478.  * variable.
  479.  */
  480. #define VAR_SCALAR 0x1
  481. #define VAR_ARRAY 0x2
  482. #define VAR_LINK 0x4
  483. #define VAR_UNDEFINED 0x8
  484. #define VAR_IN_HASHTABLE 0x10
  485. #define VAR_TRACE_ACTIVE 0x20
  486. #define VAR_ARRAY_ELEMENT 0x40
  487. #define VAR_NAMESPACE_VAR 0x80
  488. #define VAR_ARGUMENT 0x100
  489. #define VAR_TEMPORARY 0x200
  490. #define VAR_RESOLVED 0x400
  491. /*
  492.  * Macros to ensure that various flag bits are set properly for variables.
  493.  * The ANSI C "prototypes" for these macros are:
  494.  *
  495.  * EXTERN void TclSetVarScalar _ANSI_ARGS_((Var *varPtr));
  496.  * EXTERN void TclSetVarArray _ANSI_ARGS_((Var *varPtr));
  497.  * EXTERN void TclSetVarLink _ANSI_ARGS_((Var *varPtr));
  498.  * EXTERN void TclSetVarArrayElement _ANSI_ARGS_((Var *varPtr));
  499.  * EXTERN void TclSetVarUndefined _ANSI_ARGS_((Var *varPtr));
  500.  * EXTERN void TclClearVarUndefined _ANSI_ARGS_((Var *varPtr));
  501.  */
  502. #define TclSetVarScalar(varPtr) 
  503.     (varPtr)->flags = ((varPtr)->flags & ~(VAR_ARRAY|VAR_LINK)) | VAR_SCALAR
  504. #define TclSetVarArray(varPtr) 
  505.     (varPtr)->flags = ((varPtr)->flags & ~(VAR_SCALAR|VAR_LINK)) | VAR_ARRAY
  506. #define TclSetVarLink(varPtr) 
  507.     (varPtr)->flags = ((varPtr)->flags & ~(VAR_SCALAR|VAR_ARRAY)) | VAR_LINK
  508. #define TclSetVarArrayElement(varPtr) 
  509.     (varPtr)->flags = ((varPtr)->flags & ~VAR_ARRAY) | VAR_ARRAY_ELEMENT
  510. #define TclSetVarUndefined(varPtr) 
  511.     (varPtr)->flags |= VAR_UNDEFINED
  512. #define TclClearVarUndefined(varPtr) 
  513.     (varPtr)->flags &= ~VAR_UNDEFINED
  514. /*
  515.  * Macros to read various flag bits of variables.
  516.  * The ANSI C "prototypes" for these macros are:
  517.  *
  518.  * EXTERN int TclIsVarScalar _ANSI_ARGS_((Var *varPtr));
  519.  * EXTERN int TclIsVarLink _ANSI_ARGS_((Var *varPtr));
  520.  * EXTERN int TclIsVarArray _ANSI_ARGS_((Var *varPtr));
  521.  * EXTERN int TclIsVarUndefined _ANSI_ARGS_((Var *varPtr));
  522.  * EXTERN int TclIsVarArrayElement _ANSI_ARGS_((Var *varPtr));
  523.  * EXTERN int TclIsVarTemporary _ANSI_ARGS_((Var *varPtr));
  524.  * EXTERN int TclIsVarArgument _ANSI_ARGS_((Var *varPtr));
  525.  * EXTERN int TclIsVarResolved _ANSI_ARGS_((Var *varPtr));
  526.  */
  527.     
  528. #define TclIsVarScalar(varPtr) 
  529.     ((varPtr)->flags & VAR_SCALAR)
  530. #define TclIsVarLink(varPtr) 
  531.     ((varPtr)->flags & VAR_LINK)
  532. #define TclIsVarArray(varPtr) 
  533.     ((varPtr)->flags & VAR_ARRAY)
  534. #define TclIsVarUndefined(varPtr) 
  535.     ((varPtr)->flags & VAR_UNDEFINED)
  536. #define TclIsVarArrayElement(varPtr) 
  537.     ((varPtr)->flags & VAR_ARRAY_ELEMENT)
  538. #define TclIsVarTemporary(varPtr) 
  539.     ((varPtr)->flags & VAR_TEMPORARY)
  540.     
  541. #define TclIsVarArgument(varPtr) 
  542.     ((varPtr)->flags & VAR_ARGUMENT)
  543.     
  544. #define TclIsVarResolved(varPtr) 
  545.     ((varPtr)->flags & VAR_RESOLVED)
  546. /*
  547.  *----------------------------------------------------------------
  548.  * Data structures related to procedures.  These are used primarily
  549.  * in tclProc.c, tclCompile.c, and tclExecute.c.
  550.  *----------------------------------------------------------------
  551.  */
  552. /*
  553.  * Forward declaration to prevent an error when the forward reference to
  554.  * Command is encountered in the Proc and ImportRef types declared below.
  555.  */
  556. struct Command;
  557. /*
  558.  * The variable-length structure below describes a local variable of a
  559.  * procedure that was recognized by the compiler. These variables have a
  560.  * name, an element in the array of compiler-assigned local variables in the
  561.  * procedure's call frame, and various other items of information. If the
  562.  * local variable is a formal argument, it may also have a default value.
  563.  * The compiler can't recognize local variables whose names are
  564.  * expressions (these names are only known at runtime when the expressions
  565.  * are evaluated) or local variables that are created as a result of an
  566.  * "upvar" or "uplevel" command. These other local variables are kept
  567.  * separately in a hash table in the call frame.
  568.  */
  569. typedef struct CompiledLocal {
  570.     struct CompiledLocal *nextPtr;
  571. /* Next compiler-recognized local variable
  572.  * for this procedure, or NULL if this is
  573.  * the last local. */
  574.     int nameLength; /* The number of characters in local
  575.  * variable's name. Used to speed up
  576.  * variable lookups. */
  577.     int frameIndex; /* Index in the array of compiler-assigned
  578.  * variables in the procedure call frame. */
  579.     int flags; /* Flag bits for the local variable. Same as
  580.  * the flags for the Var structure above,
  581.  * although only VAR_SCALAR, VAR_ARRAY, 
  582.  * VAR_LINK, VAR_ARGUMENT, VAR_TEMPORARY, and
  583.  * VAR_RESOLVED make sense. */
  584.     Tcl_Obj *defValuePtr; /* Pointer to the default value of an
  585.  * argument, if any. NULL if not an argument
  586.  * or, if an argument, no default value. */
  587.     Tcl_ResolvedVarInfo *resolveInfo;
  588. /* Customized variable resolution info
  589.  * supplied by the Tcl_ResolveCompiledVarProc
  590.  * associated with a namespace. Each variable
  591.  * is marked by a unique ClientData tag
  592.  * during compilation, and that same tag
  593.  * is used to find the variable at runtime. */
  594.     char name[4]; /* Name of the local variable starts here.
  595.  * If the name is NULL, this will just be
  596.  * ''. The actual size of this field will
  597.  * be large enough to hold the name. MUST
  598.  * BE THE LAST FIELD IN THE STRUCTURE! */
  599. } CompiledLocal;
  600. /*
  601.  * The structure below defines a command procedure, which consists of a
  602.  * collection of Tcl commands plus information about arguments and other
  603.  * local variables recognized at compile time.
  604.  */
  605. typedef struct Proc {
  606.     struct Interp *iPtr;   /* Interpreter for which this command
  607.    * is defined. */
  608.     int refCount;   /* Reference count: 1 if still present
  609.    * in command table plus 1 for each call
  610.    * to the procedure that is currently
  611.    * active. This structure can be freed
  612.    * when refCount becomes zero. */
  613.     struct Command *cmdPtr;   /* Points to the Command structure for
  614.    * this procedure. This is used to get
  615.    * the namespace in which to execute
  616.    * the procedure. */
  617.     Tcl_Obj *bodyPtr;   /* Points to the ByteCode object for
  618.    * procedure's body command. */
  619.     int numArgs;   /* Number of formal parameters. */
  620.     int numCompiledLocals;   /* Count of local variables recognized by
  621.    * the compiler including arguments and
  622.    * temporaries. */
  623.     CompiledLocal *firstLocalPtr; /* Pointer to first of the procedure's
  624.    * compiler-allocated local variables, or
  625.    * NULL if none. The first numArgs entries
  626.    * in this list describe the procedure's
  627.    * formal arguments. */
  628.     CompiledLocal *lastLocalPtr;  /* Pointer to the last allocated local
  629.    * variable or NULL if none. This has
  630.    * frame index (numCompiledLocals-1). */
  631. } Proc;
  632. /*
  633.  * The structure below defines a command trace.  This is used to allow Tcl
  634.  * clients to find out whenever a command is about to be executed.
  635.  */
  636. typedef struct Trace {
  637.     int level; /* Only trace commands at nesting level
  638.  * less than or equal to this. */
  639.     Tcl_CmdObjTraceProc *proc; /* Procedure to call to trace command. */
  640.     ClientData clientData; /* Arbitrary value to pass to proc. */
  641.     struct Trace *nextPtr; /* Next in list of traces for this interp. */
  642.     int flags; /* Flags governing the trace - see
  643.  * Tcl_CreateObjTrace for details */
  644.     Tcl_CmdObjTraceDeleteProc* delProc;
  645. /* Procedure to call when trace is deleted */
  646. } Trace;
  647. /*
  648.  * When an interpreter trace is active (i.e. its associated procedure
  649.  * is executing), one of the following structures is linked into a list
  650.  * associated with the interpreter.  The information in the structure
  651.  * is needed in order for Tcl to behave reasonably if traces are
  652.  * deleted while traces are active.
  653.  */
  654. typedef struct ActiveInterpTrace {
  655.     struct ActiveInterpTrace *nextPtr;
  656. /* Next in list of all active command
  657.  * traces for the interpreter, or NULL
  658.  * if no more. */
  659.     Trace *nextTracePtr; /* Next trace to check after current
  660.  * trace procedure returns;  if this
  661.  * trace gets deleted, must update pointer
  662.  * to avoid using free'd memory. */
  663.     int reverseScan; /* Boolean set true when the traces
  664.  * are scanning in reverse order. */
  665. } ActiveInterpTrace;
  666. /*
  667.  * The structure below defines an entry in the assocData hash table which
  668.  * is associated with an interpreter. The entry contains a pointer to a
  669.  * function to call when the interpreter is deleted, and a pointer to
  670.  * a user-defined piece of data.
  671.  */
  672. typedef struct AssocData {
  673.     Tcl_InterpDeleteProc *proc; /* Proc to call when deleting. */
  674.     ClientData clientData; /* Value to pass to proc. */
  675. } AssocData;
  676. /*
  677.  * The structure below defines a call frame. A call frame defines a naming
  678.  * context for a procedure call: its local naming scope (for local
  679.  * variables) and its global naming scope (a namespace, perhaps the global
  680.  * :: namespace). A call frame can also define the naming context for a
  681.  * namespace eval or namespace inscope command: the namespace in which the
  682.  * command's code should execute. The Tcl_CallFrame structures exist only
  683.  * while procedures or namespace eval/inscope's are being executed, and
  684.  * provide a kind of Tcl call stack.
  685.  * 
  686.  * WARNING!! The structure definition must be kept consistent with the
  687.  * Tcl_CallFrame structure in tcl.h. If you change one, change the other.
  688.  */
  689. typedef struct CallFrame {
  690.     Namespace *nsPtr; /* Points to the namespace used to resolve
  691.  * commands and global variables. */
  692.     int isProcCallFrame; /* If nonzero, the frame was pushed to
  693.  * execute a Tcl procedure and may have
  694.  * local vars. If 0, the frame was pushed
  695.  * to execute a namespace command and var
  696.  * references are treated as references to
  697.  * namespace vars; varTablePtr and
  698.  * compiledLocals are ignored. */
  699.     int objc; /* This and objv below describe the
  700.  * arguments for this procedure call. */
  701.     Tcl_Obj *CONST *objv; /* Array of argument objects. */
  702.     struct CallFrame *callerPtr;
  703. /* Value of interp->framePtr when this
  704.  * procedure was invoked (i.e. next higher
  705.  * in stack of all active procedures). */
  706.     struct CallFrame *callerVarPtr;
  707. /* Value of interp->varFramePtr when this
  708.  * procedure was invoked (i.e. determines
  709.  * variable scoping within caller). Same
  710.  * as callerPtr unless an "uplevel" command
  711.  * or something equivalent was active in
  712.  * the caller). */
  713.     int level; /* Level of this procedure, for "uplevel"
  714.  * purposes (i.e. corresponds to nesting of
  715.  * callerVarPtr's, not callerPtr's). 1 for
  716.  * outermost procedure, 0 for top-level. */
  717.     Proc *procPtr; /* Points to the structure defining the
  718.  * called procedure. Used to get information
  719.  * such as the number of compiled local
  720.  * variables (local variables assigned
  721.  * entries ["slots"] in the compiledLocals
  722.  * array below). */
  723.     Tcl_HashTable *varTablePtr; /* Hash table containing local variables not
  724.  * recognized by the compiler, or created at
  725.  * execution time through, e.g., upvar.
  726.  * Initially NULL and created if needed. */
  727.     int numCompiledLocals; /* Count of local variables recognized by
  728.  * the compiler including arguments. */
  729.     Var* compiledLocals; /* Points to the array of local variables
  730.  * recognized by the compiler. The compiler
  731.  * emits code that refers to these variables
  732.  * using an index into this array. */
  733. } CallFrame;
  734. #ifdef TCL_TIP280
  735. /*
  736.  * TIP #280
  737.  * The structure below defines a command frame. A command frame
  738.  * provides location information for all commands executing a tcl
  739.  * script (source, eval, uplevel, procedure bodies, ...). The runtime
  740.  * structure essentially contains the stack trace as it would be if
  741.  * the currently executing command were to throw an error.
  742.  *
  743.  * For commands where it makes sense it refers to the associated
  744.  * CallFrame as well.
  745.  *
  746.  * The structures are chained in a single list, with the top of the
  747.  * stack anchored in the Interp structure.
  748.  *
  749.  * Instances can be allocated on the C stack, or the heap, the former
  750.  * making cleanup a bit simpler.
  751.  */
  752. typedef struct CmdFrame {
  753.   /* General data. Always available. */
  754.   int              type;     /* Values see below */
  755.   int              level;    /* #Frames in stack, prevent O(n) scan of list */
  756.   int*             line;     /* Lines the words of the command start on */
  757.   int              nline;
  758.   CallFrame*       framePtr; /* Procedure activation record, may be NULL */
  759.   struct CmdFrame* nextPtr;  /* Link to calling frame */
  760.   /* Data needed for Eval vs TEBC
  761.    *
  762.    * EXECUTION CONTEXTS and usage of CmdFrame
  763.    *
  764.    * Field      TEBC            EvalEx          EvalObjEx
  765.    * =======    ====            ======          =========
  766.    * level      yes             yes             yes
  767.    * type       BC/PREBC        SRC/EVAL        EVAL_LIST
  768.    * line0      yes             yes             yes
  769.    * framePtr   yes             yes             yes
  770.    * =======    ====            ======          =========
  771.    *
  772.    * =======    ====            ======          ========= union data
  773.    * line1      -               yes             -
  774.    * line3      -               yes             -
  775.    * path       -               yes             -
  776.    * -------    ----            ------          ---------
  777.    * codePtr    yes             -               -
  778.    * pc         yes             -               -
  779.    * =======    ====            ======          =========
  780.    *
  781.    * =======    ====            ======          ========= | union cmd
  782.    * listPtr    -               -               yes       |
  783.    * -------    ----            ------          --------- |
  784.    * cmd        yes             yes             -         |
  785.    * cmdlen     yes             yes             -         |
  786.    * -------    ----            ------          --------- |
  787.    */
  788.   union {
  789.     struct {
  790.       Tcl_Obj*     path;     /* Path of the sourced file the command
  791.       * is in. */
  792.     } eval;
  793.     struct {
  794.       CONST void*  codePtr;  /* Byte code currently executed */
  795.       CONST char*  pc;       /* and instruction pointer.     */
  796.     } tebc;
  797.   } data;
  798.   union {
  799.     struct {
  800.       CONST char*  cmd;      /* The executed command, if possible */
  801.       int          len;      /* And its length */
  802.     } str;
  803.     Tcl_Obj*       listPtr;  /* Tcl_EvalObjEx, cmd list */
  804.   } cmd;
  805. } CmdFrame;
  806. /* The following macros define the allowed values for the type field
  807.  * of the CmdFrame structure above. Some of the values occur only in
  808.  * the extended location data referenced via the 'baseLocPtr'.
  809.  *
  810.  * TCL_LOCATION_EVAL      : Frame is for a script evaluated by EvalEx.
  811.  * TCL_LOCATION_EVAL_LIST : Frame is for a script evaluated by the list
  812.  *                          optimization path of EvalObjEx.
  813.  * TCL_LOCATION_BC        : Frame is for bytecode. 
  814.  * TCL_LOCATION_PREBC     : Frame is for precompiled bytecode.
  815.  * TCL_LOCATION_SOURCE    : Frame is for a script evaluated by EvalEx,
  816.  *                          from a sourced file.
  817.  * TCL_LOCATION_PROC      : Frame is for bytecode of a procedure.
  818.  *
  819.  * A TCL_LOCATION_BC type in a frame can be overridden by _SOURCE and
  820.  * _PROC types, per the context of the byte code in execution.
  821.  */
  822. #define TCL_LOCATION_EVAL      (0) /* Location in a dynamic eval script */
  823. #define TCL_LOCATION_EVAL_LIST (1) /* Location in a dynamic eval script, list-path */
  824. #define TCL_LOCATION_BC        (2) /* Location in byte code */
  825. #define TCL_LOCATION_PREBC     (3) /* Location in precompiled byte code, no location */
  826. #define TCL_LOCATION_SOURCE    (4) /* Location in a file */
  827. #define TCL_LOCATION_PROC      (5) /* Location in a dynamic proc */
  828. #define TCL_LOCATION_LAST      (6) /* Number of values in the enum */
  829. #endif
  830. /*
  831.  *----------------------------------------------------------------
  832.  * Data structures and procedures related to TclHandles, which
  833.  * are a very lightweight method of preserving enough information
  834.  * to determine if an arbitrary malloc'd block has been deleted.
  835.  *----------------------------------------------------------------
  836.  */
  837. typedef VOID **TclHandle;
  838. /*
  839.  *----------------------------------------------------------------
  840.  * Data structures related to expressions.  These are used only in
  841.  * tclExpr.c.
  842.  *----------------------------------------------------------------
  843.  */
  844. /*
  845.  * The data structure below defines a math function (e.g. sin or hypot)
  846.  * for use in Tcl expressions.
  847.  */
  848. #define MAX_MATH_ARGS 5
  849. typedef struct MathFunc {
  850.     int builtinFuncIndex; /* If this is a builtin math function, its
  851.  * index in the array of builtin functions.
  852.  * (tclCompilation.h lists these indices.)
  853.  * The value is -1 if this is a new function
  854.  * defined by Tcl_CreateMathFunc. The value
  855.  * is also -1 if a builtin function is
  856.  * replaced by a Tcl_CreateMathFunc call. */
  857.     int numArgs; /* Number of arguments for function. */
  858.     Tcl_ValueType argTypes[MAX_MATH_ARGS];
  859. /* Acceptable types for each argument. */
  860.     Tcl_MathProc *proc; /* Procedure that implements this function.
  861.  * NULL if isBuiltinFunc is 1. */
  862.     ClientData clientData; /* Additional argument to pass to the
  863.  * function when invoking it. NULL if
  864.  * isBuiltinFunc is 1. */
  865. } MathFunc;
  866. /*
  867.  * These are a thin layer over TclpThreadKeyDataGet and TclpThreadKeyDataSet
  868.  * when threads are used, or an emulation if there are no threads.  These
  869.  * are really internal and Tcl clients should use Tcl_GetThreadData.
  870.  */
  871. EXTERN VOID *TclThreadDataKeyGet _ANSI_ARGS_((Tcl_ThreadDataKey *keyPtr));
  872. EXTERN void TclThreadDataKeySet _ANSI_ARGS_((Tcl_ThreadDataKey *keyPtr, VOID *data));
  873. /*
  874.  * This is a convenience macro used to initialize a thread local storage ptr.
  875.  */
  876. #define TCL_TSD_INIT(keyPtr) (ThreadSpecificData *)Tcl_GetThreadData((keyPtr), sizeof(ThreadSpecificData))
  877. /*
  878.  *----------------------------------------------------------------
  879.  * Data structures related to bytecode compilation and execution.
  880.  * These are used primarily in tclCompile.c, tclExecute.c, and
  881.  * tclBasic.c.
  882.  *----------------------------------------------------------------
  883.  */
  884. /*
  885.  * Forward declaration to prevent errors when the forward references to
  886.  * Tcl_Parse and CompileEnv are encountered in the procedure type
  887.  * CompileProc declared below.
  888.  */
  889. struct CompileEnv;
  890. /*
  891.  * The type of procedures called by the Tcl bytecode compiler to compile
  892.  * commands. Pointers to these procedures are kept in the Command structure
  893.  * describing each command. When a CompileProc returns, the interpreter's
  894.  * result is set to error information, if any. In addition, the CompileProc
  895.  * returns an integer value, which is one of the following:
  896.  *
  897.  * TCL_OK Compilation completed normally.
  898.  * TCL_ERROR Compilation failed because of an error;
  899.  * the interpreter's result describes what went wrong.
  900.  * TCL_OUT_LINE_COMPILE Compilation failed because, e.g., the command is
  901.  * too complex for effective inline compilation. The
  902.  * CompileProc believes the command is legal but 
  903.  * should be compiled "out of line" by emitting code
  904.  * to invoke its command procedure at runtime.
  905.  */
  906. #define TCL_OUT_LINE_COMPILE (TCL_CONTINUE + 1)
  907. typedef int (CompileProc) _ANSI_ARGS_((Tcl_Interp *interp,
  908. Tcl_Parse *parsePtr, struct CompileEnv *compEnvPtr));
  909. /*
  910.  * The type of procedure called from the compilation hook point in
  911.  * SetByteCodeFromAny.
  912.  */
  913. typedef int (CompileHookProc) _ANSI_ARGS_((Tcl_Interp *interp,
  914. struct CompileEnv *compEnvPtr, ClientData clientData));
  915. /*
  916.  * The data structure defining the execution environment for ByteCode's.
  917.  * There is one ExecEnv structure per Tcl interpreter. It holds the
  918.  * evaluation stack that holds command operands and results. The stack grows
  919.  * towards increasing addresses. The "stackTop" member is cached by
  920.  * TclExecuteByteCode in a local variable: it must be set before calling
  921.  * TclExecuteByteCode and will be restored by TclExecuteByteCode before it
  922.  * returns.
  923.  */
  924. typedef struct ExecEnv {
  925.     Tcl_Obj **stackPtr; /* Points to the first item in the
  926.  * evaluation stack on the heap. */
  927.     int stackTop; /* Index of current top of stack; -1 when
  928.  * the stack is empty. */
  929.     int stackEnd; /* Index of last usable item in stack. */
  930.     Tcl_Obj *errorInfo;
  931.     Tcl_Obj *errorCode;
  932. } ExecEnv;
  933. /*
  934.  * The definitions for the LiteralTable and LiteralEntry structures. Each
  935.  * interpreter contains a LiteralTable. It is used to reduce the storage
  936.  * needed for all the Tcl objects that hold the literals of scripts compiled
  937.  * by the interpreter. A literal's object is shared by all the ByteCodes
  938.  * that refer to the literal. Each distinct literal has one LiteralEntry
  939.  * entry in the LiteralTable. A literal table is a specialized hash table
  940.  * that is indexed by the literal's string representation, which may contain
  941.  * null characters.
  942.  *
  943.  * Note that we reduce the space needed for literals by sharing literal
  944.  * objects both within a ByteCode (each ByteCode contains a local
  945.  * LiteralTable) and across all an interpreter's ByteCodes (with the
  946.  * interpreter's global LiteralTable).
  947.  */
  948. typedef struct LiteralEntry {
  949.     struct LiteralEntry *nextPtr; /* Points to next entry in this
  950.  * hash bucket or NULL if end of
  951.  * chain. */
  952.     Tcl_Obj *objPtr; /* Points to Tcl object that
  953.  * holds the literal's bytes and
  954.  * length. */
  955.     int refCount; /* If in an interpreter's global
  956.  * literal table, the number of
  957.  * ByteCode structures that share
  958.  * the literal object; the literal
  959.  * entry can be freed when refCount
  960.  * drops to 0. If in a local literal
  961.  * table, -1. */
  962. } LiteralEntry;
  963. typedef struct LiteralTable {
  964.     LiteralEntry **buckets; /* Pointer to bucket array. Each
  965.  * element points to first entry in
  966.  * bucket's hash chain, or NULL. */
  967.     LiteralEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
  968. /* Bucket array used for small
  969.  * tables to avoid mallocs and
  970.  * frees. */
  971.     int numBuckets; /* Total number of buckets allocated
  972.  * at **buckets. */
  973.     int numEntries; /* Total number of entries present
  974.  * in table. */
  975.     int rebuildSize; /* Enlarge table when numEntries
  976.  * gets to be this large. */
  977.     int mask; /* Mask value used in hashing
  978.  * function. */
  979. } LiteralTable;
  980. /*
  981.  * The following structure defines for each Tcl interpreter various
  982.  * statistics-related information about the bytecode compiler and
  983.  * interpreter's operation in that interpreter.
  984.  */
  985. #ifdef TCL_COMPILE_STATS
  986. typedef struct ByteCodeStats {
  987.     long numExecutions;   /* Number of ByteCodes executed. */
  988.     long numCompilations;   /* Number of ByteCodes created. */
  989.     long numByteCodesFreed;   /* Number of ByteCodes destroyed. */
  990.     long instructionCount[256];   /* Number of times each instruction was
  991.    * executed. */
  992.     double totalSrcBytes;   /* Total source bytes ever compiled. */
  993.     double totalByteCodeBytes;   /* Total bytes for all ByteCodes. */
  994.     double currentSrcBytes;   /* Src bytes for all current ByteCodes. */
  995.     double currentByteCodeBytes;  /* Code bytes in all current ByteCodes. */
  996.     long srcCount[32];   /* Source size distribution: # of srcs of
  997.    * size [2**(n-1)..2**n), n in [0..32). */
  998.     long byteCodeCount[32];   /* ByteCode size distribution. */
  999.     long lifetimeCount[32];   /* ByteCode lifetime distribution (ms). */
  1000.     
  1001.     double currentInstBytes;   /* Instruction bytes-current ByteCodes. */
  1002.     double currentLitBytes;   /* Current literal bytes. */
  1003.     double currentExceptBytes;   /* Current exception table bytes. */
  1004.     double currentAuxBytes;   /* Current auxiliary information bytes. */
  1005.     double currentCmdMapBytes;   /* Current src<->code map bytes. */
  1006.     
  1007.     long numLiteralsCreated;   /* Total literal objects ever compiled. */
  1008.     double totalLitStringBytes;   /* Total string bytes in all literals. */
  1009.     double currentLitStringBytes; /* String bytes in current literals. */
  1010.     long literalCount[32];   /* Distribution of literal string sizes. */
  1011. } ByteCodeStats;
  1012. #endif /* TCL_COMPILE_STATS */
  1013. /*
  1014.  *----------------------------------------------------------------
  1015.  * Data structures related to commands.
  1016.  *----------------------------------------------------------------
  1017.  */
  1018. /*
  1019.  * An imported command is created in an namespace when it imports a "real"
  1020.  * command from another namespace. An imported command has a Command
  1021.  * structure that points (via its ClientData value) to the "real" Command
  1022.  * structure in the source namespace's command table. The real command
  1023.  * records all the imported commands that refer to it in a list of ImportRef
  1024.  * structures so that they can be deleted when the real command is deleted.  */
  1025. typedef struct ImportRef {
  1026.     struct Command *importedCmdPtr;
  1027. /* Points to the imported command created in
  1028.  * an importing namespace; this command
  1029.  * redirects its invocations to the "real"
  1030.  * command. */
  1031.     struct ImportRef *nextPtr; /* Next element on the linked list of
  1032.  * imported commands that refer to the
  1033.  * "real" command. The real command deletes
  1034.  * these imported commands on this list when
  1035.  * it is deleted. */
  1036. } ImportRef;
  1037. /*
  1038.  * Data structure used as the ClientData of imported commands: commands
  1039.  * created in an namespace when it imports a "real" command from another
  1040.  * namespace.
  1041.  */
  1042. typedef struct ImportedCmdData {
  1043.     struct Command *realCmdPtr; /* "Real" command that this imported command
  1044.  * refers to. */
  1045.     struct Command *selfPtr; /* Pointer to this imported command. Needed
  1046.  * only when deleting it in order to remove
  1047.  * it from the real command's linked list of
  1048.  * imported commands that refer to it. */
  1049. } ImportedCmdData;
  1050. /*
  1051.  * A Command structure exists for each command in a namespace. The
  1052.  * Tcl_Command opaque type actually refers to these structures.
  1053.  */
  1054. typedef struct Command {
  1055.     Tcl_HashEntry *hPtr; /* Pointer to the hash table entry that
  1056.  * refers to this command. The hash table is
  1057.  * either a namespace's command table or an
  1058.  * interpreter's hidden command table. This
  1059.  * pointer is used to get a command's name
  1060.  * from its Tcl_Command handle. NULL means
  1061.  * that the hash table entry has been
  1062.  * removed already (this can happen if
  1063.  * deleteProc causes the command to be
  1064.  * deleted or recreated). */
  1065.     Namespace *nsPtr; /* Points to the namespace containing this
  1066.  * command. */
  1067.     int refCount; /* 1 if in command hashtable plus 1 for each
  1068.  * reference from a CmdName Tcl object
  1069.  * representing a command's name in a
  1070.  * ByteCode instruction sequence. This
  1071.  * structure can be freed when refCount
  1072.  * becomes zero. */
  1073.     int cmdEpoch; /* Incremented to invalidate any references
  1074.  * that point to this command when it is
  1075.  * renamed, deleted, hidden, or exposed. */
  1076.     CompileProc *compileProc; /* Procedure called to compile command. NULL
  1077.  * if no compile proc exists for command. */
  1078.     Tcl_ObjCmdProc *objProc; /* Object-based command procedure. */
  1079.     ClientData objClientData; /* Arbitrary value passed to object proc. */
  1080.     Tcl_CmdProc *proc; /* String-based command procedure. */
  1081.     ClientData clientData; /* Arbitrary value passed to string proc. */
  1082.     Tcl_CmdDeleteProc *deleteProc;
  1083. /* Procedure invoked when deleting command
  1084.  * to, e.g., free all client data. */
  1085.     ClientData deleteData; /* Arbitrary value passed to deleteProc. */
  1086.     int flags; /* Miscellaneous bits of information about
  1087.  * command. See below for definitions. */
  1088.     ImportRef *importRefPtr; /* List of each imported Command created in
  1089.  * another namespace when this command is
  1090.  * imported. These imported commands
  1091.  * redirect invocations back to this
  1092.  * command. The list is used to remove all
  1093.  * those imported commands when deleting
  1094.  * this "real" command. */
  1095.     CommandTrace *tracePtr; /* First in list of all traces set for this
  1096.  * command. */
  1097. } Command;
  1098. /*
  1099.  * Flag bits for commands. 
  1100.  *
  1101.  * CMD_IS_DELETED - Means that the command is in the process
  1102.  *                              of being deleted (its deleteProc is
  1103.  *                              currently executing). Other attempts to
  1104.  *                              delete the command should be ignored.
  1105.  * CMD_TRACE_ACTIVE - 1 means that trace processing is currently
  1106.  * underway for a rename/delete change.
  1107.  * See the two flags below for which is
  1108.  * currently being processed.
  1109.  * CMD_HAS_EXEC_TRACES - 1 means that this command has at least
  1110.  *                              one execution trace (as opposed to simple
  1111.  *                              delete/rename traces) in its tracePtr list.
  1112.  * TCL_TRACE_RENAME -           A rename trace is in progress. Further
  1113.  *                              recursive renames will not be traced.
  1114.  * TCL_TRACE_DELETE -           A delete trace is in progress. Further 
  1115.  *                              recursive deletes will not be traced.
  1116.  * (these last two flags are defined in tcl.h)
  1117.  */
  1118. #define CMD_IS_DELETED 0x1
  1119. #define CMD_TRACE_ACTIVE 0x2
  1120. #define CMD_HAS_EXEC_TRACES 0x4
  1121. /*
  1122.  *----------------------------------------------------------------
  1123.  * Data structures related to name resolution procedures.
  1124.  *----------------------------------------------------------------
  1125.  */
  1126. /*
  1127.  * The interpreter keeps a linked list of name resolution schemes.
  1128.  * The scheme for a namespace is consulted first, followed by the
  1129.  * list of schemes in an interpreter, followed by the default
  1130.  * name resolution in Tcl.  Schemes are added/removed from the
  1131.  * interpreter's list by calling Tcl_AddInterpResolver and
  1132.  * Tcl_RemoveInterpResolver.
  1133.  */
  1134. typedef struct ResolverScheme {
  1135.     char *name; /* Name identifying this scheme. */
  1136.     Tcl_ResolveCmdProc *cmdResProc;
  1137. /* Procedure handling command name
  1138.  * resolution. */
  1139.     Tcl_ResolveVarProc *varResProc;
  1140. /* Procedure handling variable name
  1141.  * resolution for variables that
  1142.  * can only be handled at runtime. */
  1143.     Tcl_ResolveCompiledVarProc *compiledVarResProc;
  1144. /* Procedure handling variable name
  1145.  * resolution at compile time. */
  1146.     struct ResolverScheme *nextPtr;
  1147. /* Pointer to next record in linked list. */
  1148. } ResolverScheme;
  1149. #ifdef TCL_TIP268
  1150. /*
  1151.  * TIP #268.
  1152.  * Values for the selection mode, i.e the package require preferences.
  1153.  */
  1154. enum PkgPreferOptions {
  1155.     PKG_PREFER_LATEST, PKG_PREFER_STABLE
  1156. };
  1157. #endif
  1158. /*
  1159.  *----------------------------------------------------------------
  1160.  * This structure defines an interpreter, which is a collection of
  1161.  * commands plus other state information related to interpreting
  1162.  * commands, such as variable storage. Primary responsibility for
  1163.  * this data structure is in tclBasic.c, but almost every Tcl
  1164.  * source file uses something in here.
  1165.  *----------------------------------------------------------------
  1166.  */
  1167. typedef struct Interp {
  1168.     /*
  1169.      * Note:  the first three fields must match exactly the fields in
  1170.      * a Tcl_Interp struct (see tcl.h).  If you change one, be sure to
  1171.      * change the other.
  1172.      *
  1173.      * The interpreter's result is held in both the string and the
  1174.      * objResultPtr fields. These fields hold, respectively, the result's
  1175.      * string or object value. The interpreter's result is always in the
  1176.      * result field if that is non-empty, otherwise it is in objResultPtr.
  1177.      * The two fields are kept consistent unless some C code sets
  1178.      * interp->result directly. Programs should not access result and
  1179.      * objResultPtr directly; instead, they should always get and set the
  1180.      * result using procedures such as Tcl_SetObjResult, Tcl_GetObjResult,
  1181.      * and Tcl_GetStringResult. See the SetResult man page for details.
  1182.      */
  1183.     char *result; /* If the last command returned a string
  1184.  * result, this points to it. Should not be
  1185.  * accessed directly; see comment above. */
  1186.     Tcl_FreeProc *freeProc; /* Zero means a string result is statically
  1187.  * allocated. TCL_DYNAMIC means string
  1188.  * result was allocated with ckalloc and
  1189.  * should be freed with ckfree. Other values
  1190.  * give address of procedure to invoke to
  1191.  * free the string result. Tcl_Eval must
  1192.  * free it before executing next command. */
  1193.     int errorLine; /* When TCL_ERROR is returned, this gives
  1194.  * the line number in the command where the
  1195.  * error occurred (1 means first line). */
  1196.     struct TclStubs *stubTable;
  1197. /* Pointer to the exported Tcl stub table.
  1198.  * On previous versions of Tcl this is a
  1199.  * pointer to the objResultPtr or a pointer
  1200.  * to a buckets array in a hash table. We
  1201.  * therefore have to do some careful checking
  1202.  * before we can use this. */
  1203.     TclHandle handle; /* Handle used to keep track of when this
  1204.  * interp is deleted. */
  1205.     Namespace *globalNsPtr; /* The interpreter's global namespace. */
  1206.     Tcl_HashTable *hiddenCmdTablePtr;
  1207. /* Hash table used by tclBasic.c to keep
  1208.  * track of hidden commands on a per-interp
  1209.  * basis. */
  1210.     ClientData interpInfo; /* Information used by tclInterp.c to keep
  1211.  * track of master/slave interps on
  1212.  * a per-interp basis. */
  1213.     Tcl_HashTable mathFuncTable;/* Contains all the math functions currently
  1214.  * defined for the interpreter.  Indexed by
  1215.  * strings (function names); values have
  1216.  * type (MathFunc *). */
  1217.     /*
  1218.      * Information related to procedures and variables. See tclProc.c
  1219.      * and tclVar.c for usage.
  1220.      */
  1221.     int numLevels; /* Keeps track of how many nested calls to
  1222.  * Tcl_Eval are in progress for this
  1223.  * interpreter.  It's used to delay deletion
  1224.  * of the table until all Tcl_Eval
  1225.  * invocations are completed. */
  1226.     int maxNestingDepth; /* If numLevels exceeds this value then Tcl
  1227.  * assumes that infinite recursion has
  1228.  * occurred and it generates an error. */
  1229.     CallFrame *framePtr; /* Points to top-most in stack of all nested
  1230.  * procedure invocations.  NULL means there
  1231.  * are no active procedures. */
  1232.     CallFrame *varFramePtr; /* Points to the call frame whose variables
  1233.  * are currently in use (same as framePtr
  1234.  * unless an "uplevel" command is
  1235.  * executing). NULL means no procedure is
  1236.  * active or "uplevel 0" is executing. */
  1237.     ActiveVarTrace *activeVarTracePtr;
  1238. /* First in list of active traces for
  1239.  * interp, or NULL if no active traces. */
  1240.     int returnCode; /* Completion code to return if current
  1241.  * procedure exits with TCL_RETURN code. */
  1242.     char *errorInfo; /* Value to store in errorInfo if returnCode
  1243.  * is TCL_ERROR.  Malloc'ed, may be NULL */
  1244.     char *errorCode; /* Value to store in errorCode if returnCode
  1245.  * is TCL_ERROR.  Malloc'ed, may be NULL */
  1246.     /*
  1247.      * Information used by Tcl_AppendResult to keep track of partial
  1248.      * results.  See Tcl_AppendResult code for details.
  1249.      */
  1250.     char *appendResult; /* Storage space for results generated
  1251.  * by Tcl_AppendResult.  Malloc-ed.  NULL
  1252.  * means not yet allocated. */
  1253.     int appendAvl; /* Total amount of space available at
  1254.  * partialResult. */
  1255.     int appendUsed; /* Number of non-null bytes currently
  1256.  * stored at partialResult. */
  1257.     /*
  1258.      * Information about packages.  Used only in tclPkg.c.
  1259.      */
  1260.     Tcl_HashTable packageTable; /* Describes all of the packages loaded
  1261.  * in or available to this interpreter.
  1262.  * Keys are package names, values are
  1263.  * (Package *) pointers. */
  1264.     char *packageUnknown; /* Command to invoke during "package
  1265.  * require" commands for packages that
  1266.  * aren't described in packageTable. 
  1267.  * Malloc'ed, may be NULL. */
  1268.     /*
  1269.      * Miscellaneous information:
  1270.      */
  1271.     int cmdCount; /* Total number of times a command procedure
  1272.  * has been called for this interpreter. */
  1273.     int evalFlags; /* Flags to control next call to Tcl_Eval.
  1274.  * Normally zero, but may be set before
  1275.  * calling Tcl_Eval.  See below for valid
  1276.  * values. */
  1277.     int termOffset; /* Offset of character just after last one
  1278.  * compiled or executed by Tcl_EvalObj. */
  1279.     LiteralTable literalTable; /* Contains LiteralEntry's describing all
  1280.  * Tcl objects holding literals of scripts
  1281.  * compiled by the interpreter. Indexed by
  1282.  * the string representations of literals.
  1283.  * Used to avoid creating duplicate
  1284.  * objects. */
  1285.     int compileEpoch; /* Holds the current "compilation epoch"
  1286.  * for this interpreter. This is
  1287.  * incremented to invalidate existing
  1288.  * ByteCodes when, e.g., a command with a
  1289.  * compile procedure is redefined. */
  1290.     Proc *compiledProcPtr; /* If a procedure is being compiled, a
  1291.  * pointer to its Proc structure; otherwise,
  1292.  * this is NULL. Set by ObjInterpProc in
  1293.  * tclProc.c and used by tclCompile.c to
  1294.  * process local variables appropriately. */
  1295.     ResolverScheme *resolverPtr;
  1296. /* Linked list of name resolution schemes
  1297.  * added to this interpreter.  Schemes
  1298.  * are added/removed by calling
  1299.  * Tcl_AddInterpResolvers and
  1300.  * Tcl_RemoveInterpResolver. */
  1301.     Tcl_Obj *scriptFile; /* NULL means there is no nested source
  1302.  * command active;  otherwise this points to
  1303.  * pathPtr of the file being sourced. */
  1304.     int flags; /* Various flag bits.  See below. */
  1305.     long randSeed; /* Seed used for rand() function. */
  1306.     Trace *tracePtr; /* List of traces for this interpreter. */
  1307.     Tcl_HashTable *assocData; /* Hash table for associating data with
  1308.  * this interpreter. Cleaned up when
  1309.  * this interpreter is deleted. */
  1310.     struct ExecEnv *execEnvPtr; /* Execution environment for Tcl bytecode
  1311.  * execution. Contains a pointer to the
  1312.  * Tcl evaluation stack. */
  1313.     Tcl_Obj *emptyObjPtr; /* Points to an object holding an empty
  1314.  * string. Returned by Tcl_ObjSetVar2 when
  1315.  * variable traces change a variable in a
  1316.  * gross way. */
  1317.     char resultSpace[TCL_RESULT_SIZE+1];
  1318. /* Static space holding small results. */
  1319.     Tcl_Obj *objResultPtr; /* If the last command returned an object
  1320.  * result, this points to it. Should not be
  1321.  * accessed directly; see comment above. */
  1322.     Tcl_ThreadId threadId; /* ID of thread that owns the interpreter */
  1323.     ActiveCommandTrace *activeCmdTracePtr;
  1324. /* First in list of active command traces for
  1325.  * interp, or NULL if no active traces. */
  1326.     ActiveInterpTrace *activeInterpTracePtr;
  1327. /* First in list of active traces for
  1328.  * interp, or NULL if no active traces. */
  1329.     int tracesForbiddingInline; /* Count of traces (in the list headed by
  1330.  * tracePtr) that forbid inline bytecode
  1331.  * compilation */
  1332. #ifdef TCL_TIP280
  1333.     /* TIP #280 */
  1334.     CmdFrame* cmdFramePtr;      /* Points to the command frame containing
  1335.  * the location information for the current
  1336.  * command. */
  1337.     CONST CmdFrame* invokeCmdFramePtr; /* Points to the command frame which is the
  1338.   * invoking context of the bytecode compiler.
  1339.   * NULL when the byte code compiler is not
  1340.   * active */
  1341.     int invokeWord;             /* Index of the word in the command which
  1342.  * is getting compiled. */
  1343.     Tcl_HashTable* linePBodyPtr;
  1344.                                 /* This table remembers for each
  1345.  * statically defined procedure the
  1346.  * location information for its
  1347.  * body. It is keyed by the address of
  1348.  * the Proc structure for a procedure.
  1349.  */
  1350.     Tcl_HashTable* lineBCPtr;
  1351.                                 /* This table remembers for each
  1352.  * ByteCode object the location
  1353.  * information for its body. It is
  1354.  * keyed by the address of the Proc
  1355.  * structure for a procedure.
  1356.  */
  1357. #endif
  1358. #ifdef TCL_TIP268
  1359.     /*
  1360.      * TIP #268.
  1361.      * The currently active selection mode,
  1362.      * i.e the package require preferences.
  1363.      */
  1364.     int packagePrefer;          /* Current package selection mode. */
  1365. #endif
  1366.     /*
  1367.      * Statistical information about the bytecode compiler and interpreter's
  1368.      * operation.
  1369.      */
  1370. #ifdef TCL_COMPILE_STATS
  1371.     ByteCodeStats stats; /* Holds compilation and execution
  1372.  * statistics for this interpreter. */
  1373. #endif /* TCL_COMPILE_STATS */   
  1374. } Interp;
  1375. /*
  1376.  * EvalFlag bits for Interp structures:
  1377.  *
  1378.  * TCL_BRACKET_TERM 1 means that the current script is terminated by
  1379.  * a close bracket rather than the end of the string.
  1380.  * TCL_ALLOW_EXCEPTIONS 1 means it's OK for the script to terminate with
  1381.  * a code other than TCL_OK or TCL_ERROR; 0 means
  1382.  * codes other than these should be turned into errors.
  1383.  */
  1384. #define TCL_BRACKET_TERM   1
  1385. #define TCL_ALLOW_EXCEPTIONS   4
  1386. #ifdef TCL_TIP280
  1387. #define TCL_EVAL_FILE             2
  1388. #define TCL_EVAL_CTX              8
  1389. #endif
  1390. /*
  1391.  * Flag bits for Interp structures:
  1392.  *
  1393.  * DELETED: Non-zero means the interpreter has been deleted:
  1394.  * don't process any more commands for it, and destroy
  1395.  * the structure as soon as all nested invocations of
  1396.  * Tcl_Eval are done.
  1397.  * ERR_IN_PROGRESS: Non-zero means an error unwind is already in
  1398.  * progress. Zero means a command proc has been
  1399.  * invoked since last error occured.
  1400.  * ERR_ALREADY_LOGGED: Non-zero means information has already been logged
  1401.  * in $errorInfo for the current Tcl_Eval instance,
  1402.  * so Tcl_Eval needn't log it (used to implement the
  1403.  * "error message log" command).
  1404.  * ERROR_CODE_SET: Non-zero means that Tcl_SetErrorCode has been
  1405.  * called to record information for the current
  1406.  * error. Zero means Tcl_Eval must clear the
  1407.  * errorCode variable if an error is returned.
  1408.  * EXPR_INITIALIZED: Non-zero means initialization specific to
  1409.  * expressions has been carried out.
  1410.  * DONT_COMPILE_CMDS_INLINE: Non-zero means that the bytecode compiler
  1411.  * should not compile any commands into an inline
  1412.  * sequence of instructions. This is set 1, for
  1413.  * example, when command traces are requested.
  1414.  * RAND_SEED_INITIALIZED: Non-zero means that the randSeed value of the
  1415.  * interp has not be initialized. This is set 1
  1416.  * when we first use the rand() or srand() functions.
  1417.  * SAFE_INTERP: Non zero means that the current interp is a
  1418.  * safe interp (ie it has only the safe commands
  1419.  * installed, less priviledge than a regular interp).
  1420.  * USE_EVAL_DIRECT: Non-zero means don't use the compiler or byte-code
  1421.  * interpreter; instead, have Tcl_EvalObj call
  1422.  * Tcl_EvalEx. Used primarily for testing the
  1423.  * new parser.
  1424.  * INTERP_TRACE_IN_PROGRESS: Non-zero means that an interp trace is currently
  1425.  * active; so no further trace callbacks should be
  1426.  * invoked.
  1427.  */
  1428. #define DELETED     1
  1429. #define ERR_IN_PROGRESS     2
  1430. #define ERR_ALREADY_LOGGED     4
  1431. #define ERROR_CODE_SET     8
  1432. #define EXPR_INITIALIZED  0x10
  1433. #define DONT_COMPILE_CMDS_INLINE  0x20
  1434. #define RAND_SEED_INITIALIZED  0x40
  1435. #define SAFE_INTERP  0x80
  1436. #define USE_EVAL_DIRECT 0x100
  1437. #define INTERP_TRACE_IN_PROGRESS 0x200
  1438. /*
  1439.  * Maximum number of levels of nesting permitted in Tcl commands (used
  1440.  * to catch infinite recursion).
  1441.  */
  1442. #define MAX_NESTING_DEPTH 1000
  1443. /*
  1444.  * The macro below is used to modify a "char" value (e.g. by casting
  1445.  * it to an unsigned character) so that it can be used safely with
  1446.  * macros such as isspace.
  1447.  */
  1448. #define UCHAR(c) ((unsigned char) (c))
  1449. /*
  1450.  * This macro is used to determine the offset needed to safely allocate any
  1451.  * data structure in memory. Given a starting offset or size, it "rounds up"
  1452.  * or "aligns" the offset to the next 8-byte boundary so that any data
  1453.  * structure can be placed at the resulting offset without fear of an
  1454.  * alignment error.
  1455.  *
  1456.  * WARNING!! DO NOT USE THIS MACRO TO ALIGN POINTERS: it will produce
  1457.  * the wrong result on platforms that allocate addresses that are divisible
  1458.  * by 4 or 2. Only use it for offsets or sizes.
  1459.  */
  1460. #define TCL_ALIGN(x) (((int)(x) + 7) & ~7)
  1461. /*
  1462.  * The following enum values are used to specify the runtime platform
  1463.  * setting of the tclPlatform variable.
  1464.  */
  1465. typedef enum {
  1466.     TCL_PLATFORM_UNIX, /* Any Unix-like OS. */
  1467.     TCL_PLATFORM_MAC, /* MacOS. */
  1468.     TCL_PLATFORM_WINDOWS /* Any Microsoft Windows OS. */
  1469. } TclPlatformType;
  1470. /*
  1471.  *  The following enum values are used to indicate the translation
  1472.  *  of a Tcl channel.  Declared here so that each platform can define
  1473.  *  TCL_PLATFORM_TRANSLATION to the native translation on that platform
  1474.  */
  1475. typedef enum TclEolTranslation {
  1476.     TCL_TRANSLATE_AUTO,                 /* Eol == r, n and rn. */
  1477.     TCL_TRANSLATE_CR,                   /* Eol == r. */
  1478.     TCL_TRANSLATE_LF,                   /* Eol == n. */
  1479.     TCL_TRANSLATE_CRLF                  /* Eol == rn. */
  1480. } TclEolTranslation;
  1481. /*
  1482.  * Flags for TclInvoke:
  1483.  *
  1484.  * TCL_INVOKE_HIDDEN Invoke a hidden command; if not set,
  1485.  * invokes an exposed command.
  1486.  * TCL_INVOKE_NO_UNKNOWN If set, "unknown" is not invoked if
  1487.  * the command to be invoked is not found.
  1488.  * Only has an effect if invoking an exposed
  1489.  * command, i.e. if TCL_INVOKE_HIDDEN is not
  1490.  * also set.
  1491.  * TCL_INVOKE_NO_TRACEBACK Does not record traceback information if
  1492.  * the invoked command returns an error.  Used
  1493.  * if the caller plans on recording its own
  1494.  * traceback information.
  1495.  */
  1496. #define TCL_INVOKE_HIDDEN (1<<0)
  1497. #define TCL_INVOKE_NO_UNKNOWN (1<<1)
  1498. #define TCL_INVOKE_NO_TRACEBACK (1<<2)
  1499. /*
  1500.  * The structure used as the internal representation of Tcl list
  1501.  * objects. This is an array of pointers to the element objects. This array
  1502.  * is grown (reallocated and copied) as necessary to hold all the list's
  1503.  * element pointers. The array might contain more slots than currently used
  1504.  * to hold all element pointers. This is done to make append operations
  1505.  * faster.
  1506.  */
  1507. typedef struct List {
  1508.     int maxElemCount; /* Total number of element array slots. */
  1509.     int elemCount; /* Current number of list elements. */
  1510.     Tcl_Obj **elements; /* Array of pointers to element objects. */
  1511. } List;
  1512. /*
  1513.  * The following types are used for getting and storing platform-specific
  1514.  * file attributes in tclFCmd.c and the various platform-versions of
  1515.  * that file. This is done to have as much common code as possible
  1516.  * in the file attributes code. For more information about the callbacks,
  1517.  * see TclFileAttrsCmd in tclFCmd.c.
  1518.  */
  1519. typedef int (TclGetFileAttrProc) _ANSI_ARGS_((Tcl_Interp *interp,
  1520. int objIndex, Tcl_Obj *fileName, Tcl_Obj **attrObjPtrPtr));
  1521. typedef int (TclSetFileAttrProc) _ANSI_ARGS_((Tcl_Interp *interp,
  1522. int objIndex, Tcl_Obj *fileName, Tcl_Obj *attrObjPtr));
  1523. typedef struct TclFileAttrProcs {
  1524.     TclGetFileAttrProc *getProc; /* The procedure for getting attrs. */
  1525.     TclSetFileAttrProc *setProc; /* The procedure for setting attrs. */
  1526. } TclFileAttrProcs;
  1527. /*
  1528.  * Opaque handle used in pipeline routines to encapsulate platform-dependent
  1529.  * state. 
  1530.  */
  1531. typedef struct TclFile_ *TclFile;
  1532.     
  1533. /*
  1534.  * Opaque names for platform specific types.
  1535.  */
  1536. typedef struct TclpTime_t_    *TclpTime_t;
  1537. typedef struct TclpTime_t_    *CONST TclpTime_t_CONST;
  1538. /*
  1539.  * The "globParameters" argument of the function TclGlob is an
  1540.  * or'ed combination of the following values:
  1541.  */
  1542. #define TCL_GLOBMODE_NO_COMPLAIN      1
  1543. #define TCL_GLOBMODE_JOIN             2
  1544. #define TCL_GLOBMODE_DIR              4
  1545. #define TCL_GLOBMODE_TAILS            8
  1546. /*
  1547.  *----------------------------------------------------------------
  1548.  * Data structures related to obsolete filesystem hooks
  1549.  *----------------------------------------------------------------
  1550.  */
  1551. typedef int (TclStatProc_) _ANSI_ARGS_((CONST char *path, struct stat *buf));
  1552. typedef int (TclAccessProc_) _ANSI_ARGS_((CONST char *path, int mode));
  1553. typedef Tcl_Channel (TclOpenFileChannelProc_) _ANSI_ARGS_((Tcl_Interp *interp,
  1554. CONST char *fileName, CONST char *modeString,
  1555. int permissions));
  1556. /*
  1557.  *----------------------------------------------------------------
  1558.  * Data structures related to procedures
  1559.  *----------------------------------------------------------------
  1560.  */
  1561. typedef Tcl_CmdProc *TclCmdProcType;
  1562. typedef Tcl_ObjCmdProc *TclObjCmdProcType;
  1563. /*
  1564.  *----------------------------------------------------------------
  1565.  * Variables shared among Tcl modules but not used by the outside world.
  1566.  *----------------------------------------------------------------
  1567.  */
  1568. extern Tcl_Time tclBlockTime;
  1569. extern int tclBlockTimeSet;
  1570. extern char * tclExecutableName;
  1571. extern char * tclNativeExecutableName;
  1572. extern char * tclDefaultEncodingDir;
  1573. extern Tcl_ChannelType tclFileChannelType;
  1574. extern char * tclMemDumpFileName;
  1575. extern TclPlatformType tclPlatform;
  1576. extern Tcl_NotifierProcs tclOriginalNotifier;
  1577. /*
  1578.  * Variables denoting the Tcl object types defined in the core.
  1579.  */
  1580. extern Tcl_ObjType tclBooleanType;
  1581. extern Tcl_ObjType tclByteArrayType;
  1582. extern Tcl_ObjType tclByteCodeType;
  1583. extern Tcl_ObjType tclDoubleType;
  1584. extern Tcl_ObjType tclEndOffsetType;
  1585. extern Tcl_ObjType tclIntType;
  1586. extern Tcl_ObjType tclListType;
  1587. extern Tcl_ObjType tclProcBodyType;
  1588. extern Tcl_ObjType tclStringType;
  1589. extern Tcl_ObjType tclArraySearchType;
  1590. extern Tcl_ObjType tclIndexType;
  1591. extern Tcl_ObjType tclNsNameType;
  1592. extern Tcl_ObjType tclWideIntType;
  1593. /*
  1594.  * Variables denoting the hash key types defined in the core.
  1595.  */
  1596. extern Tcl_HashKeyType tclArrayHashKeyType;
  1597. extern Tcl_HashKeyType tclOneWordHashKeyType;
  1598. extern Tcl_HashKeyType tclStringHashKeyType;
  1599. extern Tcl_HashKeyType tclObjHashKeyType;
  1600. /*
  1601.  * The head of the list of free Tcl objects, and the total number of Tcl
  1602.  * objects ever allocated and freed.
  1603.  */
  1604. extern Tcl_Obj * tclFreeObjList;
  1605. #ifdef TCL_COMPILE_STATS
  1606. extern long tclObjsAlloced;
  1607. extern long tclObjsFreed;
  1608. #define TCL_MAX_SHARED_OBJ_STATS 5
  1609. extern long tclObjsShared[TCL_MAX_SHARED_OBJ_STATS];
  1610. #endif /* TCL_COMPILE_STATS */
  1611. /*
  1612.  * Pointer to a heap-allocated string of length zero that the Tcl core uses
  1613.  * as the value of an empty string representation for an object. This value
  1614.  * is shared by all new objects allocated by Tcl_NewObj.
  1615.  */
  1616. extern char * tclEmptyStringRep;
  1617. extern char tclEmptyString;
  1618. /*
  1619.  *----------------------------------------------------------------
  1620.  * Procedures shared among Tcl modules but not used by the outside
  1621.  * world:
  1622.  *----------------------------------------------------------------
  1623.  */
  1624. #ifdef TCL_TIP280
  1625. EXTERN void             TclAdvanceLines _ANSI_ARGS_((int* line, CONST char* start,
  1626.      CONST char* end));
  1627. #endif
  1628. EXTERN int TclArraySet _ANSI_ARGS_((Tcl_Interp *interp,
  1629.     Tcl_Obj *arrayNameObj, Tcl_Obj *arrayElemObj));
  1630. EXTERN int TclCheckBadOctal _ANSI_ARGS_((Tcl_Interp *interp,
  1631.     CONST char *value));
  1632. EXTERN void TclDeleteNamespaceVars _ANSI_ARGS_((Namespace *nsPtr));
  1633. #ifdef TCL_TIP280
  1634. EXTERN int              TclEvalObjEx _ANSI_ARGS_((Tcl_Interp *interp,
  1635.   register Tcl_Obj *objPtr,
  1636.   int flags,
  1637.   CONST CmdFrame* invoker,
  1638.   int word));
  1639. #endif
  1640. EXTERN void TclExpandTokenArray _ANSI_ARGS_((
  1641.     Tcl_Parse *parsePtr));
  1642. EXTERN int TclFileAttrsCmd _ANSI_ARGS_((Tcl_Interp *interp,
  1643.     int objc, Tcl_Obj *CONST objv[]));
  1644. EXTERN int TclFileCopyCmd _ANSI_ARGS_((Tcl_Interp *interp, 
  1645.     int objc, Tcl_Obj *CONST objv[])) ;
  1646. EXTERN int TclFileDeleteCmd _ANSI_ARGS_((Tcl_Interp *interp,
  1647.     int objc, Tcl_Obj *CONST objv[]));
  1648. EXTERN int TclFileMakeDirsCmd _ANSI_ARGS_((Tcl_Interp *interp,
  1649.     int objc, Tcl_Obj *CONST objv[])) ;
  1650. EXTERN int TclFileRenameCmd _ANSI_ARGS_((Tcl_Interp *interp,
  1651.     int objc, Tcl_Obj *CONST objv[])) ;
  1652. EXTERN void TclFinalizeAllocSubsystem _ANSI_ARGS_((void));
  1653. EXTERN void TclFinalizeAsync _ANSI_ARGS_((void));
  1654. EXTERN void TclFinalizeCompilation _ANSI_ARGS_((void));
  1655. EXTERN void TclFinalizeEncodingSubsystem _ANSI_ARGS_((void));
  1656. EXTERN void TclFinalizeEnvironment _ANSI_ARGS_((void));
  1657. EXTERN void TclFinalizeExecution _ANSI_ARGS_((void));
  1658. EXTERN void TclFinalizeIOSubsystem _ANSI_ARGS_((void));
  1659. EXTERN void TclFinalizeFilesystem _ANSI_ARGS_((void));
  1660. EXTERN void TclResetFilesystem _ANSI_ARGS_((void));
  1661. EXTERN void TclFinalizeLoad _ANSI_ARGS_((void));
  1662. EXTERN void TclFinalizeLock _ANSI_ARGS_((void));
  1663. EXTERN void TclFinalizeMemorySubsystem _ANSI_ARGS_((void));
  1664. EXTERN void TclFinalizeNotifier _ANSI_ARGS_((void));
  1665. EXTERN void TclFinalizeObjects _ANSI_ARGS_((void));
  1666. EXTERN void TclFinalizePreserve _ANSI_ARGS_((void));
  1667. EXTERN void TclFinalizeSynchronization _ANSI_ARGS_((void));
  1668. EXTERN void TclFinalizeThreadAlloc _ANSI_ARGS_((void));
  1669. EXTERN void TclFinalizeThreadData _ANSI_ARGS_((void));
  1670. EXTERN int TclGetEncodingFromObj _ANSI_ARGS_((Tcl_Interp *interp,
  1671.     Tcl_Obj *objPtr, Tcl_Encoding *encodingPtr));
  1672. #ifdef TCL_TIP280
  1673. EXTERN void             TclGetSrcInfoForPc _ANSI_ARGS_((CmdFrame* cfPtr));
  1674. #endif
  1675. EXTERN int TclGlob _ANSI_ARGS_((Tcl_Interp *interp,
  1676.     char *pattern, Tcl_Obj *unquotedPrefix, 
  1677.     int globFlags, Tcl_GlobTypeData* types));
  1678. EXTERN void TclInitAlloc _ANSI_ARGS_((void));
  1679. EXTERN void TclInitDbCkalloc _ANSI_ARGS_((void));
  1680. EXTERN void TclInitEncodingSubsystem _ANSI_ARGS_((void));
  1681. EXTERN void TclInitIOSubsystem _ANSI_ARGS_((void));
  1682. EXTERN void TclInitNamespaceSubsystem _ANSI_ARGS_((void));
  1683. EXTERN void TclInitNotifier _ANSI_ARGS_((void));
  1684. EXTERN void TclInitObjSubsystem _ANSI_ARGS_((void));
  1685. EXTERN void TclInitSubsystems _ANSI_ARGS_((CONST char *argv0));
  1686. EXTERN int TclIsLocalScalar _ANSI_ARGS_((CONST char *src,
  1687.     int len));
  1688. EXTERN int              TclJoinThread _ANSI_ARGS_((Tcl_ThreadId id,
  1689.     int* result));
  1690. EXTERN Tcl_Obj * TclLindexList _ANSI_ARGS_((Tcl_Interp* interp,
  1691.    Tcl_Obj* listPtr,
  1692.    Tcl_Obj* argPtr ));
  1693. EXTERN Tcl_Obj * TclLindexFlat _ANSI_ARGS_((Tcl_Interp* interp,
  1694.    Tcl_Obj* listPtr,
  1695.    int indexCount,
  1696.    Tcl_Obj *CONST indexArray[]
  1697.    ));
  1698. EXTERN Tcl_Obj * TclLsetList _ANSI_ARGS_((Tcl_Interp* interp,
  1699.  Tcl_Obj* listPtr,
  1700.  Tcl_Obj* indexPtr,
  1701.  Tcl_Obj* valuePtr  
  1702.  ));
  1703. EXTERN Tcl_Obj * TclLsetFlat _ANSI_ARGS_((Tcl_Interp* interp,
  1704.  Tcl_Obj* listPtr,
  1705.  int indexCount,
  1706.  Tcl_Obj *CONST indexArray[],
  1707.  Tcl_Obj* valuePtr
  1708.  ));
  1709. EXTERN int              TclParseBackslash _ANSI_ARGS_((CONST char *src,
  1710.                             int numBytes, int *readPtr, char *dst));
  1711. EXTERN int TclParseHex _ANSI_ARGS_((CONST char *src, int numBytes,
  1712.                             Tcl_UniChar *resultPtr));
  1713. EXTERN int TclParseInteger _ANSI_ARGS_((CONST char *string,
  1714.     int numBytes));
  1715. EXTERN int TclParseWhiteSpace _ANSI_ARGS_((CONST char *src,
  1716.     int numBytes, Tcl_Parse *parsePtr, char *typePtr));
  1717. #ifdef TCL_TIP280
  1718. EXTERN int              TclWordKnownAtCompileTime _ANSI_ARGS_((Tcl_Token* token));
  1719. #endif
  1720. EXTERN int TclpObjAccess _ANSI_ARGS_((Tcl_Obj *filename,
  1721.     int mode));
  1722. EXTERN int              TclpObjLstat _ANSI_ARGS_((Tcl_Obj *pathPtr, 
  1723.     Tcl_StatBuf *buf));
  1724. EXTERN int TclpCheckStackSpace _ANSI_ARGS_((void));
  1725. EXTERN Tcl_Obj*         TclpTempFileName _ANSI_ARGS_((void));
  1726. EXTERN Tcl_Obj*         TclNewFSPathObj _ANSI_ARGS_((Tcl_Obj *dirPtr, 
  1727.     CONST char *addStrRep, int len));
  1728. EXTERN int              TclpDeleteFile _ANSI_ARGS_((CONST char *path));
  1729. EXTERN void TclpFinalizeCondition _ANSI_ARGS_((
  1730.     Tcl_Condition *condPtr));
  1731. EXTERN void TclpFinalizeMutex _ANSI_ARGS_((Tcl_Mutex *mutexPtr));
  1732. EXTERN void TclpFinalizePipes _ANSI_ARGS_((void));
  1733. EXTERN void TclpFinalizeSockets _ANSI_ARGS_((void));
  1734. EXTERN void TclpFinalizeThreadData _ANSI_ARGS_((
  1735.     Tcl_ThreadDataKey *keyPtr));
  1736. EXTERN void TclpFinalizeThreadDataKey _ANSI_ARGS_((
  1737.     Tcl_ThreadDataKey *keyPtr));
  1738. EXTERN char * TclpFindExecutable _ANSI_ARGS_((
  1739.     CONST char *argv0));
  1740. EXTERN int TclpFindVariable _ANSI_ARGS_((CONST char *name,
  1741.     int *lengthPtr));
  1742. EXTERN int TclpInitLibraryPath _ANSI_ARGS_((CONST char *argv0));
  1743. EXTERN void TclpInitLock _ANSI_ARGS_((void));
  1744. EXTERN void TclpInitPlatform _ANSI_ARGS_((void));
  1745. EXTERN void TclpInitUnlock _ANSI_ARGS_((void));
  1746. EXTERN int              TclpLoadFile _ANSI_ARGS_((Tcl_Interp *interp, 
  1747. Tcl_Obj *pathPtr,
  1748. CONST char *sym1, CONST char *sym2, 
  1749. Tcl_PackageInitProc **proc1Ptr,
  1750. Tcl_PackageInitProc **proc2Ptr, 
  1751. ClientData *clientDataPtr,
  1752. Tcl_FSUnloadFileProc **unloadProcPtr));
  1753. EXTERN Tcl_Obj* TclpObjListVolumes _ANSI_ARGS_((void));
  1754. EXTERN void TclpMasterLock _ANSI_ARGS_((void));
  1755. EXTERN void TclpMasterUnlock _ANSI_ARGS_((void));
  1756. EXTERN int TclpMatchFiles _ANSI_ARGS_((Tcl_Interp *interp,
  1757.     char *separators, Tcl_DString *dirPtr,
  1758.     char *pattern, char *tail));
  1759. EXTERN int              TclpObjNormalizePath _ANSI_ARGS_((Tcl_Interp *interp, 
  1760.     Tcl_Obj *pathPtr, int nextCheckpoint));
  1761. EXTERN int TclpObjCreateDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr));
  1762. EXTERN void             TclpNativeJoinPath _ANSI_ARGS_((Tcl_Obj *prefix, 
  1763. char *joining));
  1764. EXTERN Tcl_Obj*         TclpNativeSplitPath _ANSI_ARGS_((Tcl_Obj *pathPtr, 
  1765.  int *lenPtr));
  1766. EXTERN Tcl_PathType     TclpGetNativePathType _ANSI_ARGS_((Tcl_Obj *pathObjPtr,
  1767.     int *driveNameLengthPtr, Tcl_Obj **driveNameRef));
  1768. EXTERN int  TclCrossFilesystemCopy _ANSI_ARGS_((Tcl_Interp *interp, 
  1769.     Tcl_Obj *source, Tcl_Obj *target));
  1770. EXTERN int TclpObjDeleteFile _ANSI_ARGS_((Tcl_Obj *pathPtr));
  1771. EXTERN int TclpObjCopyDirectory _ANSI_ARGS_((Tcl_Obj *srcPathPtr, 
  1772. Tcl_Obj *destPathPtr, Tcl_Obj **errorPtr));
  1773. EXTERN int TclpObjCopyFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, 
  1774. Tcl_Obj *destPathPtr));
  1775. EXTERN int TclpObjRemoveDirectory _ANSI_ARGS_((Tcl_Obj *pathPtr, 
  1776. int recursive, Tcl_Obj **errorPtr));
  1777. EXTERN int TclpObjRenameFile _ANSI_ARGS_((Tcl_Obj *srcPathPtr, 
  1778. Tcl_Obj *destPathPtr));
  1779. EXTERN int TclpMatchInDirectory _ANSI_ARGS_((Tcl_Interp *interp, 
  1780.         Tcl_Obj *resultPtr, Tcl_Obj *pathPtr, 
  1781. CONST char *pattern, Tcl_GlobTypeData *types));
  1782. EXTERN Tcl_Obj* TclpObjGetCwd _ANSI_ARGS_((Tcl_Interp *interp));
  1783. EXTERN Tcl_FSDupInternalRepProc TclNativeDupInternalRep;
  1784. EXTERN Tcl_Obj* TclpObjLink _ANSI_ARGS_((Tcl_Obj *pathPtr, 
  1785. Tcl_Obj *toPtr, int linkType));
  1786. EXTERN int TclpObjChdir _ANSI_ARGS_((Tcl_Obj *pathPtr));
  1787. EXTERN Tcl_Obj*         TclFileDirname _ANSI_ARGS_((Tcl_Interp *interp, 
  1788.     Tcl_Obj*pathPtr));
  1789. EXTERN int TclpObjStat _ANSI_ARGS_((Tcl_Obj *pathPtr, Tcl_StatBuf *buf));
  1790. EXTERN Tcl_Channel TclpOpenFileChannel _ANSI_ARGS_((Tcl_Interp *interp,
  1791.     Tcl_Obj *pathPtr, int mode,
  1792.     int permissions));
  1793. EXTERN void TclpPanic _ANSI_ARGS_(TCL_VARARGS(CONST char *,
  1794.     format));
  1795. EXTERN char * TclpReadlink _ANSI_ARGS_((CONST char *fileName,
  1796.     Tcl_DString *linkPtr));
  1797. EXTERN void TclpReleaseFile _ANSI_ARGS_((TclFile file));
  1798. EXTERN void TclpSetVariables _ANSI_ARGS_((Tcl_Interp *interp));
  1799. EXTERN void TclpUnloadFile _ANSI_ARGS_((Tcl_LoadHandle loadHandle));
  1800. EXTERN VOID * TclpThreadDataKeyGet _ANSI_ARGS_((
  1801.     Tcl_ThreadDataKey *keyPtr));
  1802. EXTERN void TclpThreadDataKeyInit _ANSI_ARGS_((
  1803.     Tcl_ThreadDataKey *keyPtr));
  1804. EXTERN void TclpThreadDataKeySet _ANSI_ARGS_((
  1805.     Tcl_ThreadDataKey *keyPtr, VOID *data));
  1806. EXTERN int TclpThreadCreate _ANSI_ARGS_((
  1807.     Tcl_ThreadId *idPtr,
  1808.     Tcl_ThreadCreateProc proc,
  1809.     ClientData clientData,
  1810.     int stackSize, int flags));
  1811. EXTERN void TclpThreadExit _ANSI_ARGS_((int status));
  1812. EXTERN void TclRememberCondition _ANSI_ARGS_((Tcl_Condition *mutex));
  1813. EXTERN void TclRememberDataKey _ANSI_ARGS_((Tcl_ThreadDataKey *mutex));
  1814. EXTERN VOID             TclRememberJoinableThread _ANSI_ARGS_((Tcl_ThreadId id));
  1815. EXTERN void TclRememberMutex _ANSI_ARGS_((Tcl_Mutex *mutex));
  1816. EXTERN VOID             TclSignalExitThread _ANSI_ARGS_((Tcl_ThreadId id,
  1817.      int result));
  1818. EXTERN void TclTransferResult _ANSI_ARGS_((Tcl_Interp *sourceInterp,
  1819.     int result, Tcl_Interp *targetInterp));
  1820. EXTERN Tcl_Obj*         TclpNativeToNormalized 
  1821.                             _ANSI_ARGS_((ClientData clientData));
  1822. EXTERN Tcl_Obj*         TclpFilesystemPathType
  1823. _ANSI_ARGS_((Tcl_Obj* pathObjPtr));
  1824. EXTERN Tcl_PackageInitProc* TclpFindSymbol _ANSI_ARGS_((Tcl_Interp *interp,
  1825.     Tcl_LoadHandle loadHandle, CONST char *symbol));
  1826. EXTERN int              TclpDlopen _ANSI_ARGS_((Tcl_Interp *interp, 
  1827.     Tcl_Obj *pathPtr, 
  1828.                     Tcl_LoadHandle *loadHandle, 
  1829.             Tcl_FSUnloadFileProc **unloadProcPtr));
  1830. EXTERN int              TclpUtime _ANSI_ARGS_((Tcl_Obj *pathPtr,
  1831.        struct utimbuf *tval));
  1832. #ifdef TCL_LOAD_FROM_MEMORY
  1833. EXTERN void*         TclpLoadMemoryGetBuffer _ANSI_ARGS_((
  1834.     Tcl_Interp *interp, int size));
  1835. EXTERN int         TclpLoadMemory _ANSI_ARGS_((Tcl_Interp *interp, 
  1836.     void *buffer, int size, int codeSize, 
  1837.     Tcl_LoadHandle *loadHandle, 
  1838.     Tcl_FSUnloadFileProc **unloadProcPtr));
  1839. #endif
  1840. /*
  1841.  *----------------------------------------------------------------
  1842.  * Command procedures in the generic core:
  1843.  *----------------------------------------------------------------
  1844.  */
  1845. EXTERN int Tcl_AfterObjCmd _ANSI_ARGS_((ClientData clientData,
  1846.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1847. EXTERN int Tcl_AppendObjCmd _ANSI_ARGS_((ClientData clientData,
  1848.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1849. EXTERN int Tcl_ArrayObjCmd _ANSI_ARGS_((ClientData clientData,
  1850.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1851. EXTERN int Tcl_BinaryObjCmd _ANSI_ARGS_((ClientData clientData,
  1852.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1853. EXTERN int Tcl_BreakObjCmd _ANSI_ARGS_((ClientData clientData,
  1854.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1855. EXTERN int Tcl_CaseObjCmd _ANSI_ARGS_((ClientData clientData,
  1856.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1857. EXTERN int Tcl_CatchObjCmd _ANSI_ARGS_((ClientData clientData,
  1858.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1859. EXTERN int Tcl_CdObjCmd _ANSI_ARGS_((ClientData clientData,
  1860.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1861. EXTERN int Tcl_ClockObjCmd _ANSI_ARGS_((ClientData clientData,
  1862.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1863. EXTERN int Tcl_CloseObjCmd _ANSI_ARGS_((ClientData clientData,
  1864.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1865. EXTERN int Tcl_ConcatObjCmd _ANSI_ARGS_((ClientData clientData,
  1866.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1867. EXTERN int Tcl_ContinueObjCmd _ANSI_ARGS_((ClientData clientData,
  1868.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1869. EXTERN int Tcl_EncodingObjCmd _ANSI_ARGS_((ClientData clientData,
  1870.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1871. EXTERN int Tcl_EofObjCmd _ANSI_ARGS_((ClientData clientData,
  1872.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1873. EXTERN int Tcl_ErrorObjCmd _ANSI_ARGS_((ClientData clientData,
  1874.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1875. EXTERN int Tcl_EvalObjCmd _ANSI_ARGS_((ClientData clientData,
  1876.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1877. EXTERN int Tcl_ExecObjCmd _ANSI_ARGS_((ClientData clientData,
  1878.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1879. EXTERN int Tcl_ExitObjCmd _ANSI_ARGS_((ClientData clientData,
  1880.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1881. EXTERN int Tcl_ExprObjCmd _ANSI_ARGS_((ClientData clientData,
  1882.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1883. EXTERN int Tcl_FblockedObjCmd _ANSI_ARGS_((ClientData clientData,
  1884.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1885. EXTERN int Tcl_FconfigureObjCmd _ANSI_ARGS_((ClientData clientData,
  1886.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1887. EXTERN int Tcl_FcopyObjCmd _ANSI_ARGS_((ClientData dummy,
  1888.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1889. EXTERN int Tcl_FileObjCmd _ANSI_ARGS_((ClientData dummy,
  1890.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1891. EXTERN int Tcl_FileEventObjCmd _ANSI_ARGS_((ClientData clientData,
  1892.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1893. EXTERN int Tcl_FlushObjCmd _ANSI_ARGS_((ClientData clientData,
  1894.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1895. EXTERN int Tcl_ForObjCmd _ANSI_ARGS_((ClientData clientData,
  1896.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1897. EXTERN int Tcl_ForeachObjCmd _ANSI_ARGS_((ClientData clientData,
  1898.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1899. EXTERN int Tcl_FormatObjCmd _ANSI_ARGS_((ClientData dummy,
  1900.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1901. EXTERN int Tcl_GetsObjCmd _ANSI_ARGS_((ClientData clientData,
  1902.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1903. EXTERN int Tcl_GlobalObjCmd _ANSI_ARGS_((ClientData clientData,
  1904.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1905. EXTERN int Tcl_GlobObjCmd _ANSI_ARGS_((ClientData clientData,
  1906.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1907. EXTERN int Tcl_IfObjCmd _ANSI_ARGS_((ClientData clientData,
  1908.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1909. EXTERN int Tcl_IncrObjCmd _ANSI_ARGS_((ClientData clientData,
  1910.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1911. EXTERN int Tcl_InfoObjCmd _ANSI_ARGS_((ClientData clientData,
  1912.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1913. EXTERN int Tcl_InterpObjCmd _ANSI_ARGS_((ClientData clientData,
  1914.     Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[]));
  1915. EXTERN int Tcl_JoinObjCmd _ANSI_ARGS_((ClientData clientData,
  1916.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1917. EXTERN int Tcl_LappendObjCmd _ANSI_ARGS_((ClientData clientData,
  1918.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1919. EXTERN int Tcl_LindexObjCmd _ANSI_ARGS_((ClientData clientData,
  1920.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1921. EXTERN int Tcl_LinsertObjCmd _ANSI_ARGS_((ClientData clientData,
  1922.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1923. EXTERN int Tcl_LlengthObjCmd _ANSI_ARGS_((ClientData clientData,
  1924.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1925. EXTERN int Tcl_ListObjCmd _ANSI_ARGS_((ClientData clientData,
  1926.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1927. EXTERN int Tcl_LoadObjCmd _ANSI_ARGS_((ClientData clientData,
  1928.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1929. EXTERN int Tcl_LrangeObjCmd _ANSI_ARGS_((ClientData clientData,
  1930.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1931. EXTERN int Tcl_LreplaceObjCmd _ANSI_ARGS_((ClientData clientData,
  1932.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1933. EXTERN int Tcl_LsearchObjCmd _ANSI_ARGS_((ClientData clientData,
  1934.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1935. EXTERN int Tcl_LsetObjCmd _ANSI_ARGS_((ClientData clientData,
  1936.                     Tcl_Interp* interp, int objc, Tcl_Obj *CONST objv[]));
  1937. EXTERN int Tcl_LsortObjCmd _ANSI_ARGS_((ClientData clientData,
  1938.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1939. EXTERN int Tcl_NamespaceObjCmd _ANSI_ARGS_((ClientData clientData,
  1940.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1941. EXTERN int Tcl_OpenObjCmd _ANSI_ARGS_((ClientData clientData,
  1942.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1943. EXTERN int Tcl_PackageObjCmd _ANSI_ARGS_((ClientData clientData,
  1944.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1945. EXTERN int Tcl_PidObjCmd _ANSI_ARGS_((ClientData clientData,
  1946.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1947. EXTERN int Tcl_PutsObjCmd _ANSI_ARGS_((ClientData clientData,
  1948.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1949. EXTERN int Tcl_PwdObjCmd _ANSI_ARGS_((ClientData clientData,
  1950.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1951. EXTERN int Tcl_ReadObjCmd _ANSI_ARGS_((ClientData clientData,
  1952.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1953. EXTERN int Tcl_RegexpObjCmd _ANSI_ARGS_((ClientData clientData,
  1954.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1955. EXTERN int Tcl_RegsubObjCmd _ANSI_ARGS_((ClientData clientData,
  1956.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1957. EXTERN int Tcl_RenameObjCmd _ANSI_ARGS_((ClientData clientData,
  1958.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1959. EXTERN int Tcl_ReturnObjCmd _ANSI_ARGS_((ClientData clientData,
  1960.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1961. EXTERN int Tcl_ScanObjCmd _ANSI_ARGS_((ClientData clientData,
  1962.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1963. EXTERN int Tcl_SeekObjCmd _ANSI_ARGS_((ClientData clientData,
  1964.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1965. EXTERN int Tcl_SetObjCmd _ANSI_ARGS_((ClientData clientData,
  1966.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1967. EXTERN int Tcl_SplitObjCmd _ANSI_ARGS_((ClientData clientData,
  1968.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1969. EXTERN int Tcl_SocketObjCmd _ANSI_ARGS_((ClientData clientData,
  1970.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1971. EXTERN int Tcl_SourceObjCmd _ANSI_ARGS_((ClientData clientData,
  1972.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1973. EXTERN int Tcl_StringObjCmd _ANSI_ARGS_((ClientData clientData,
  1974.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1975. EXTERN int Tcl_SubstObjCmd _ANSI_ARGS_((ClientData clientData,
  1976.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1977. EXTERN int Tcl_SwitchObjCmd _ANSI_ARGS_((ClientData clientData,
  1978.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1979. EXTERN int Tcl_TellObjCmd _ANSI_ARGS_((ClientData clientData,
  1980.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1981. EXTERN int Tcl_TimeObjCmd _ANSI_ARGS_((ClientData clientData,
  1982.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1983. EXTERN int Tcl_TraceObjCmd _ANSI_ARGS_((ClientData clientData,
  1984.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1985. EXTERN int Tcl_UnsetObjCmd _ANSI_ARGS_((ClientData clientData,
  1986.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1987. EXTERN int Tcl_UpdateObjCmd _ANSI_ARGS_((ClientData clientData,
  1988.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1989. EXTERN int Tcl_UplevelObjCmd _ANSI_ARGS_((ClientData clientData,
  1990.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1991. EXTERN int Tcl_UpvarObjCmd _ANSI_ARGS_((ClientData clientData,
  1992.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1993. EXTERN int Tcl_VariableObjCmd _ANSI_ARGS_((ClientData clientData,
  1994.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1995. EXTERN int Tcl_VwaitObjCmd _ANSI_ARGS_((ClientData clientData,
  1996.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1997. EXTERN int Tcl_WhileObjCmd _ANSI_ARGS_((ClientData clientData,
  1998.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  1999. /*
  2000.  *----------------------------------------------------------------
  2001.  * Command procedures found only in the Mac version of the core:
  2002.  *----------------------------------------------------------------
  2003.  */
  2004. #ifdef MAC_TCL
  2005. EXTERN int Tcl_EchoCmd _ANSI_ARGS_((ClientData clientData,
  2006.     Tcl_Interp *interp, int argc, CONST84 char **argv));
  2007. EXTERN int Tcl_LsObjCmd _ANSI_ARGS_((ClientData clientData,
  2008.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  2009. EXTERN int Tcl_BeepObjCmd _ANSI_ARGS_((ClientData clientData,
  2010.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  2011. EXTERN int Tcl_MacSourceObjCmd _ANSI_ARGS_((ClientData clientData,
  2012.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  2013. EXTERN int Tcl_ResourceObjCmd _ANSI_ARGS_((ClientData clientData,
  2014.     Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
  2015. #endif
  2016. /*
  2017.  *----------------------------------------------------------------
  2018.  * Compilation procedures for commands in the generic core:
  2019.  *----------------------------------------------------------------
  2020.  */
  2021. EXTERN int TclCompileAppendCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2022.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2023. EXTERN int TclCompileBreakCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2024.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2025. EXTERN int TclCompileCatchCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2026.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2027. EXTERN int TclCompileContinueCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2028.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2029. EXTERN int TclCompileExprCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2030.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2031. EXTERN int TclCompileForCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2032.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2033. EXTERN int TclCompileForeachCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2034.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2035. EXTERN int TclCompileIfCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2036.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2037. EXTERN int TclCompileIncrCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2038.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2039. EXTERN int TclCompileLappendCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2040.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2041. EXTERN int TclCompileLindexCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2042.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2043. EXTERN int TclCompileListCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2044.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2045. EXTERN int TclCompileLlengthCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2046.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2047. EXTERN int TclCompileLsetCmd _ANSI_ARGS_((Tcl_Interp* interp,
  2048.     Tcl_Parse* parsePtr, struct CompileEnv* envPtr));
  2049. EXTERN int TclCompileRegexpCmd _ANSI_ARGS_((Tcl_Interp* interp,
  2050.     Tcl_Parse* parsePtr, struct CompileEnv* envPtr));
  2051. EXTERN int TclCompileReturnCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2052.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2053. EXTERN int TclCompileSetCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2054.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2055. EXTERN int TclCompileStringCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2056.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2057. EXTERN int TclCompileWhileCmd _ANSI_ARGS_((Tcl_Interp *interp,
  2058.     Tcl_Parse *parsePtr, struct CompileEnv *envPtr));
  2059. /*
  2060.  * Functions defined in generic/tclVar.c and currenttly exported only 
  2061.  * for use by the bytecode compiler and engine. Some of these could later 
  2062.  * be placed in the public interface.
  2063.  */
  2064. EXTERN Var * TclLookupArrayElement _ANSI_ARGS_((Tcl_Interp *interp,
  2065.     CONST char *arrayName, CONST char *elName, CONST int flags,
  2066.     CONST char *msg, CONST int createPart1,
  2067.     CONST int createPart2, Var *arrayPtr));
  2068. EXTERN Var *    TclObjLookupVar _ANSI_ARGS_((Tcl_Interp *interp,
  2069.     Tcl_Obj *part1Ptr, CONST char *part2, int flags,
  2070.     CONST char *msg, CONST int createPart1,
  2071.     CONST int createPart2, Var **arrayPtrPtr));
  2072. EXTERN Tcl_Obj *TclPtrGetVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,
  2073.     Var *arrayPtr, CONST char *part1, CONST char *part2,
  2074.     CONST int flags));
  2075. EXTERN Tcl_Obj *TclPtrSetVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,
  2076.     Var *arrayPtr, CONST char *part1, CONST char *part2,
  2077.     Tcl_Obj *newValuePtr, CONST int flags));
  2078. EXTERN Tcl_Obj *TclPtrIncrVar _ANSI_ARGS_((Tcl_Interp *interp, Var *varPtr,
  2079.     Var *arrayPtr, CONST char *part1, CONST char *part2,
  2080.     CONST long i, CONST int flags));
  2081. /*
  2082.  *----------------------------------------------------------------
  2083.  * Macros used by the Tcl core to create and release Tcl objects.
  2084.  * TclNewObj(objPtr) creates a new object denoting an empty string.
  2085.  * TclDecrRefCount(objPtr) decrements the object's reference count,
  2086.  * and frees the object if its reference count is zero.
  2087.  * These macros are inline versions of Tcl_NewObj() and
  2088.  * Tcl_DecrRefCount(). Notice that the names differ in not having
  2089.  * a "_" after the "Tcl". Notice also that these macros reference
  2090.  * their argument more than once, so you should avoid calling them
  2091.  * with an expression that is expensive to compute or has
  2092.  * side effects. The ANSI C "prototypes" for these macros are:
  2093.  *
  2094.  * EXTERN void TclNewObj _ANSI_ARGS_((Tcl_Obj *objPtr));
  2095.  * EXTERN void TclDecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr));
  2096.  *
  2097.  * These macros are defined in terms of two macros that depend on 
  2098.  * memory allocator in use: TclAllocObjStorage, TclFreeObjStorage.
  2099.  * They are defined below.
  2100.  *----------------------------------------------------------------
  2101.  */
  2102. /*
  2103.  * DTrace object allocation probe macros.
  2104.  */
  2105. #ifdef USE_DTRACE
  2106. #include "tclDTrace.h"
  2107. #define TCL_DTRACE_OBJ_CREATE(objPtr) TCL_OBJ_CREATE(objPtr)
  2108. #define TCL_DTRACE_OBJ_FREE(objPtr) TCL_OBJ_FREE(objPtr)
  2109. #else /* USE_DTRACE */
  2110. #define TCL_DTRACE_OBJ_CREATE(objPtr) {}
  2111. #define TCL_DTRACE_OBJ_FREE(objPtr) {}
  2112. #endif /* USE_DTRACE */
  2113. #ifdef TCL_COMPILE_STATS
  2114. #  define TclIncrObjsAllocated() 
  2115.     tclObjsAlloced++
  2116. #  define TclIncrObjsFreed() 
  2117.     tclObjsFreed++
  2118. #else
  2119. #  define TclIncrObjsAllocated()
  2120. #  define TclIncrObjsFreed()
  2121. #endif /* TCL_COMPILE_STATS */
  2122. #define TclNewObj(objPtr) 
  2123.     TclAllocObjStorage(objPtr); 
  2124.     TclIncrObjsAllocated(); 
  2125.     (objPtr)->refCount = 0; 
  2126.     (objPtr)->bytes    = tclEmptyStringRep; 
  2127.     (objPtr)->length   = 0; 
  2128.     (objPtr)->typePtr  = NULL; 
  2129.     TCL_DTRACE_OBJ_CREATE(objPtr)
  2130. #ifdef TCL_MEM_DEBUG
  2131. #   define TclDecrRefCount(objPtr) 
  2132. Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__)
  2133. #else
  2134. #   define TclDecrRefCount(objPtr) 
  2135.     if (--(objPtr)->refCount <= 0) { 
  2136. TCL_DTRACE_OBJ_FREE(objPtr); 
  2137. if (((objPtr)->typePtr != NULL) 
  2138. && ((objPtr)->typePtr->freeIntRepProc != NULL)) { 
  2139.     (objPtr)->typePtr->freeIntRepProc(objPtr); 
  2140. if (((objPtr)->bytes != NULL) 
  2141. && ((objPtr)->bytes != tclEmptyStringRep)) { 
  2142.     ckfree((char *) (objPtr)->bytes); 
  2143.         TclFreeObjStorage(objPtr); 
  2144. TclIncrObjsFreed(); 
  2145.     }
  2146. #endif
  2147. #ifdef TCL_MEM_DEBUG
  2148. #  define TclAllocObjStorage(objPtr) 
  2149.        (objPtr) = (Tcl_Obj *) 
  2150.            Tcl_DbCkalloc(sizeof(Tcl_Obj), __FILE__, __LINE__)
  2151. #  define TclFreeObjStorage(objPtr) 
  2152.        if ((objPtr)->refCount < -1) { 
  2153.            panic("Reference count for %lx was negative: %s line %d", 
  2154.            (objPtr), __FILE__, __LINE__); 
  2155.        } 
  2156.        ckfree((char *) (objPtr))
  2157.      
  2158. #  define TclDbNewObj(objPtr, file, line) 
  2159.        (objPtr) = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), (file), (line)); 
  2160.        (objPtr)->refCount = 0; 
  2161.        (objPtr)->bytes    = tclEmptyStringRep; 
  2162.        (objPtr)->length   = 0; 
  2163.        (objPtr)->typePtr  = NULL; 
  2164.        TclIncrObjsAllocated(); 
  2165.        TCL_DTRACE_OBJ_CREATE(objPtr)
  2166.      
  2167. #elif defined(PURIFY)
  2168. /*
  2169.  * The PURIFY mode is like the regular mode, but instead of doing block
  2170.  * Tcl_Obj allocation and keeping a freed list for efficiency, it always
  2171.  * allocates and frees a single Tcl_Obj so that tools like Purify can
  2172.  * better track memory leaks
  2173.  */
  2174. #  define TclAllocObjStorage(objPtr) 
  2175.        (objPtr) = (Tcl_Obj *) Tcl_Ckalloc(sizeof(Tcl_Obj))
  2176. #  define TclFreeObjStorage(objPtr) 
  2177.        ckfree((char *) (objPtr))
  2178. #elif defined(TCL_THREADS) && defined(USE_THREAD_ALLOC)
  2179. /*
  2180.  * The TCL_THREADS mode is like the regular mode but allocates Tcl_Obj's
  2181.  * from per-thread caches.
  2182.  */
  2183. EXTERN Tcl_Obj *TclThreadAllocObj _ANSI_ARGS_((void));
  2184. EXTERN void TclThreadFreeObj _ANSI_ARGS_((Tcl_Obj *));
  2185. EXTERN void TclFreeAllocCache _ANSI_ARGS_((void *));
  2186. EXTERN void TclpFreeAllocMutex _ANSI_ARGS_((Tcl_Mutex* mutex));
  2187. EXTERN void TclpFreeAllocCache _ANSI_ARGS_((void *));
  2188. #  define TclAllocObjStorage(objPtr) 
  2189.        (objPtr) = TclThreadAllocObj()
  2190. #  define TclFreeObjStorage(objPtr) 
  2191.        TclThreadFreeObj((objPtr))
  2192. #else /* not TCL_MEM_DEBUG */
  2193. #ifdef TCL_THREADS
  2194. /* declared in tclObj.c */
  2195. extern Tcl_Mutex tclObjMutex;
  2196. #endif
  2197. #  define TclAllocObjStorage(objPtr) 
  2198.        Tcl_MutexLock(&tclObjMutex); 
  2199.        if (tclFreeObjList == NULL) { 
  2200.    TclAllocateFreeObjects(); 
  2201.        } 
  2202.        (objPtr) = tclFreeObjList; 
  2203.        tclFreeObjList = (Tcl_Obj *) 
  2204.    tclFreeObjList->internalRep.otherValuePtr; 
  2205.        Tcl_MutexUnlock(&tclObjMutex)
  2206. #  define TclFreeObjStorage(objPtr) 
  2207.        Tcl_MutexLock(&tclObjMutex); 
  2208.        (objPtr)->internalRep.otherValuePtr = (VOID *) tclFreeObjList; 
  2209.        tclFreeObjList = (objPtr); 
  2210.        Tcl_MutexUnlock(&tclObjMutex)
  2211. #endif /* TCL_MEM_DEBUG */
  2212. /*
  2213.  *----------------------------------------------------------------
  2214.  * Macro used by the Tcl core to set a Tcl_Obj's string representation
  2215.  * to a copy of the "len" bytes starting at "bytePtr". This code
  2216.  * works even if the byte array contains NULLs as long as the length
  2217.  * is correct. Because "len" is referenced multiple times, it should
  2218.  * be as simple an expression as possible. The ANSI C "prototype" for
  2219.  * this macro is:
  2220.  *
  2221.  * EXTERN void TclInitStringRep _ANSI_ARGS_((Tcl_Obj *objPtr,
  2222.  *     char *bytePtr, int len));
  2223.  *----------------------------------------------------------------
  2224.  */
  2225. #define TclInitStringRep(objPtr, bytePtr, len) 
  2226.     if ((len) == 0) { 
  2227. (objPtr)->bytes  = tclEmptyStringRep; 
  2228. (objPtr)->length = 0; 
  2229.     } else { 
  2230. (objPtr)->bytes = (char *) ckalloc((unsigned) ((len) + 1)); 
  2231. memcpy((VOID *) (objPtr)->bytes, (VOID *) (bytePtr), 
  2232. (unsigned) (len)); 
  2233. (objPtr)->bytes[len] = ''; 
  2234. (objPtr)->length = (len); 
  2235.     }
  2236. /*
  2237.  *----------------------------------------------------------------
  2238.  * Macro used by the Tcl core to get the string representation's
  2239.  * byte array pointer from a Tcl_Obj. This is an inline version
  2240.  * of Tcl_GetString(). The macro's expression result is the string
  2241.  * rep's byte pointer which might be NULL. The bytes referenced by 
  2242.  * this pointer must not be modified by the caller.
  2243.  * The ANSI C "prototype" for this macro is:
  2244.  *
  2245.  * EXTERN char *  TclGetString _ANSI_ARGS_((Tcl_Obj *objPtr));
  2246.  *----------------------------------------------------------------
  2247.  */
  2248. #define TclGetString(objPtr) 
  2249.     ((objPtr)->bytes? (objPtr)->bytes : Tcl_GetString((objPtr)))
  2250. /*
  2251.  *----------------------------------------------------------------
  2252.  * Macro used by the Tcl core to get a Tcl_WideInt value out of
  2253.  * a Tcl_Obj of the "wideInt" type.  Different implementation on
  2254.  * different platforms depending whether TCL_WIDE_INT_IS_LONG.
  2255.  *----------------------------------------------------------------
  2256.  */
  2257. #ifdef TCL_WIDE_INT_IS_LONG
  2258. #    define TclGetWide(resultVar, objPtr) 
  2259. (resultVar) = (objPtr)->internalRep.longValue
  2260. #    define TclGetLongFromWide(resultVar, objPtr) 
  2261. (resultVar) = (objPtr)->internalRep.longValue
  2262. #else
  2263. #    define TclGetWide(resultVar, objPtr) 
  2264. (resultVar) = (objPtr)->internalRep.wideValue
  2265. #    define TclGetLongFromWide(resultVar, objPtr) 
  2266. (resultVar) = Tcl_WideAsLong((objPtr)->internalRep.wideValue)
  2267. #endif
  2268. /*
  2269.  *----------------------------------------------------------------
  2270.  * Macro used by the Tcl core get a unicode char from a utf string.
  2271.  * It checks to see if we have a one-byte utf char before calling
  2272.  * the real Tcl_UtfToUniChar, as this will save a lot of time for
  2273.  * primarily ascii string handling. The macro's expression result
  2274.  * is 1 for the 1-byte case or the result of Tcl_UtfToUniChar.
  2275.  * The ANSI C "prototype" for this macro is:
  2276.  *
  2277.  * EXTERN int TclUtfToUniChar _ANSI_ARGS_((CONST char *string,
  2278.  *    Tcl_UniChar *ch));
  2279.  *----------------------------------------------------------------
  2280.  */
  2281. #define TclUtfToUniChar(str, chPtr) 
  2282. ((((unsigned char) *(str)) < 0xC0) ? 
  2283.     ((*(chPtr) = (Tcl_UniChar) *(str)), 1) 
  2284.     : Tcl_UtfToUniChar(str, chPtr))
  2285. /*
  2286.  *----------------------------------------------------------------
  2287.  * Macro used by the Tcl core to compare Unicode strings.  On
  2288.  * big-endian systems we can use the more efficient memcmp, but
  2289.  * this would not be lexically correct on little-endian systems.
  2290.  * The ANSI C "prototype" for this macro is:
  2291.  *
  2292.  * EXTERN int TclUniCharNcmp _ANSI_ARGS_((CONST Tcl_UniChar *cs,
  2293.  *         CONST Tcl_UniChar *ct, unsigned long n));
  2294.  *----------------------------------------------------------------
  2295.  */
  2296. #ifdef WORDS_BIGENDIAN
  2297. #   define TclUniCharNcmp(cs,ct,n) memcmp((cs),(ct),(n)*sizeof(Tcl_UniChar))
  2298. #else /* !WORDS_BIGENDIAN */
  2299. #   define TclUniCharNcmp Tcl_UniCharNcmp
  2300. #endif /* WORDS_BIGENDIAN */
  2301. #include "tclIntDecls.h"
  2302. # undef TCL_STORAGE_CLASS
  2303. # define TCL_STORAGE_CLASS DLLIMPORT
  2304. #endif /* _TCLINT */