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) 1994-1997 Sun Microsystems, Inc.
|
---|
8 | * Copyright (c) 1993-1997 Lucent Technologies.
|
---|
9 | * Copyright (c) 1998-1999 by Scriptics Corporation.
|
---|
10 | *
|
---|
11 | * See the file "license.terms" for information on usage and redistribution
|
---|
12 | * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
---|
13 | *
|
---|
14 | * RCS: @(#) $Id: tclInt.h,v 1.1 2008-06-04 13:58:07 demin Exp $
|
---|
15 | */
|
---|
16 |
|
---|
17 | #ifndef _TCLINT
|
---|
18 | #define _TCLINT
|
---|
19 |
|
---|
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 |
|
---|
30 | #include <stdio.h>
|
---|
31 |
|
---|
32 | #ifndef _TCL
|
---|
33 | #include "tcl.h"
|
---|
34 | #endif
|
---|
35 |
|
---|
36 | #include <ctype.h>
|
---|
37 | #ifdef NO_LIMITS_H
|
---|
38 | # include "../compat/limits.h"
|
---|
39 | #else
|
---|
40 | # include <limits.h>
|
---|
41 | #endif
|
---|
42 | #ifdef NO_STDLIB_H
|
---|
43 | # include "../compat/stdlib.h"
|
---|
44 | #else
|
---|
45 | # include <stdlib.h>
|
---|
46 | #endif
|
---|
47 | #ifdef NO_STRING_H
|
---|
48 | #include "../compat/string.h"
|
---|
49 | #else
|
---|
50 | #include <string.h>
|
---|
51 | #endif
|
---|
52 | #if defined(__STDC__) || defined(HAS_STDARG)
|
---|
53 | # include <stdarg.h>
|
---|
54 | #else
|
---|
55 | # include <varargs.h>
|
---|
56 | #endif
|
---|
57 |
|
---|
58 | #ifdef BUILD_tcl
|
---|
59 | # undef TCL_STORAGE_CLASS
|
---|
60 | # define TCL_STORAGE_CLASS DLLEXPORT
|
---|
61 | #endif
|
---|
62 |
|
---|
63 | /*
|
---|
64 | * The following procedures allow namespaces to be customized to
|
---|
65 | * support special name resolution rules for commands/variables.
|
---|
66 | *
|
---|
67 | */
|
---|
68 |
|
---|
69 | struct Tcl_ResolvedVarInfo;
|
---|
70 |
|
---|
71 | typedef Tcl_Var (Tcl_ResolveRuntimeVarProc) _ANSI_ARGS_((
|
---|
72 | Tcl_Interp* interp, struct Tcl_ResolvedVarInfo *vinfoPtr));
|
---|
73 |
|
---|
74 | typedef void (Tcl_ResolveVarDeleteProc) _ANSI_ARGS_((
|
---|
75 | struct Tcl_ResolvedVarInfo *vinfoPtr));
|
---|
76 |
|
---|
77 | /*
|
---|
78 | * The following structure encapsulates the routines needed to resolve a
|
---|
79 | * variable reference at runtime. Any variable specific state will typically
|
---|
80 | * be appended to this structure.
|
---|
81 | */
|
---|
82 |
|
---|
83 |
|
---|
84 | typedef struct Tcl_ResolvedVarInfo {
|
---|
85 | Tcl_ResolveRuntimeVarProc *fetchProc;
|
---|
86 | Tcl_ResolveVarDeleteProc *deleteProc;
|
---|
87 | } Tcl_ResolvedVarInfo;
|
---|
88 |
|
---|
89 |
|
---|
90 |
|
---|
91 | typedef int (Tcl_ResolveCompiledVarProc) _ANSI_ARGS_((
|
---|
92 | Tcl_Interp* interp, char* name, int length,
|
---|
93 | Tcl_Namespace *context, Tcl_ResolvedVarInfo **rPtr));
|
---|
94 |
|
---|
95 | typedef int (Tcl_ResolveVarProc) _ANSI_ARGS_((
|
---|
96 | Tcl_Interp* interp, char* name, Tcl_Namespace *context,
|
---|
97 | int flags, Tcl_Var *rPtr));
|
---|
98 |
|
---|
99 | typedef int (Tcl_ResolveCmdProc) _ANSI_ARGS_((Tcl_Interp* interp,
|
---|
100 | char* name, Tcl_Namespace *context, int flags,
|
---|
101 | Tcl_Command *rPtr));
|
---|
102 |
|
---|
103 | typedef struct Tcl_ResolverInfo {
|
---|
104 | Tcl_ResolveCmdProc *cmdResProc; /* Procedure handling command name
|
---|
105 | * resolution. */
|
---|
106 | Tcl_ResolveVarProc *varResProc; /* Procedure handling variable name
|
---|
107 | * resolution for variables that
|
---|
108 | * can only be handled at runtime. */
|
---|
109 | Tcl_ResolveCompiledVarProc *compiledVarResProc;
|
---|
110 | /* Procedure handling variable name
|
---|
111 | * resolution at compile time. */
|
---|
112 | } Tcl_ResolverInfo;
|
---|
113 |
|
---|
114 | /*
|
---|
115 | *----------------------------------------------------------------
|
---|
116 | * Data structures related to namespaces.
|
---|
117 | *----------------------------------------------------------------
|
---|
118 | */
|
---|
119 |
|
---|
120 | /*
|
---|
121 | * The structure below defines a namespace.
|
---|
122 | * Note: the first five fields must match exactly the fields in a
|
---|
123 | * Tcl_Namespace structure (see tcl.h). If you change one, be sure to
|
---|
124 | * change the other.
|
---|
125 | */
|
---|
126 |
|
---|
127 | typedef struct Namespace {
|
---|
128 | char *name; /* The namespace's simple (unqualified)
|
---|
129 | * name. This contains no ::'s. The name of
|
---|
130 | * the global namespace is "" although "::"
|
---|
131 | * is an synonym. */
|
---|
132 | char *fullName; /* The namespace's fully qualified name.
|
---|
133 | * This starts with ::. */
|
---|
134 | ClientData clientData; /* An arbitrary value associated with this
|
---|
135 | * namespace. */
|
---|
136 | Tcl_NamespaceDeleteProc *deleteProc;
|
---|
137 | /* Procedure invoked when deleting the
|
---|
138 | * namespace to, e.g., free clientData. */
|
---|
139 | struct Namespace *parentPtr; /* Points to the namespace that contains
|
---|
140 | * this one. NULL if this is the global
|
---|
141 | * namespace. */
|
---|
142 | Tcl_HashTable childTable; /* Contains any child namespaces. Indexed
|
---|
143 | * by strings; values have type
|
---|
144 | * (Namespace *). */
|
---|
145 | long nsId; /* Unique id for the namespace. */
|
---|
146 | Tcl_Interp *interp; /* The interpreter containing this
|
---|
147 | * namespace. */
|
---|
148 | int flags; /* OR-ed combination of the namespace
|
---|
149 | * status flags NS_DYING and NS_DEAD
|
---|
150 | * listed below. */
|
---|
151 | int activationCount; /* Number of "activations" or active call
|
---|
152 | * frames for this namespace that are on
|
---|
153 | * the Tcl call stack. The namespace won't
|
---|
154 | * be freed until activationCount becomes
|
---|
155 | * zero. */
|
---|
156 | int refCount; /* Count of references by namespaceName *
|
---|
157 | * objects. The namespace can't be freed
|
---|
158 | * until refCount becomes zero. */
|
---|
159 | Tcl_HashTable cmdTable; /* Contains all the commands currently
|
---|
160 | * registered in the namespace. Indexed by
|
---|
161 | * strings; values have type (Command *).
|
---|
162 | * Commands imported by Tcl_Import have
|
---|
163 | * Command structures that point (via an
|
---|
164 | * ImportedCmdRef structure) to the
|
---|
165 | * Command structure in the source
|
---|
166 | * namespace's command table. */
|
---|
167 | Tcl_HashTable varTable; /* Contains all the (global) variables
|
---|
168 | * currently in this namespace. Indexed
|
---|
169 | * by strings; values have type (Var *). */
|
---|
170 | char **exportArrayPtr; /* Points to an array of string patterns
|
---|
171 | * specifying which commands are exported.
|
---|
172 | * A pattern may include "string match"
|
---|
173 | * style wildcard characters to specify
|
---|
174 | * multiple commands; however, no namespace
|
---|
175 | * qualifiers are allowed. NULL if no
|
---|
176 | * export patterns are registered. */
|
---|
177 | int numExportPatterns; /* Number of export patterns currently
|
---|
178 | * registered using "namespace export". */
|
---|
179 | int maxExportPatterns; /* Mumber of export patterns for which
|
---|
180 | * space is currently allocated. */
|
---|
181 | int cmdRefEpoch; /* Incremented if a newly added command
|
---|
182 | * shadows a command for which this
|
---|
183 | * namespace has already cached a Command *
|
---|
184 | * pointer; this causes all its cached
|
---|
185 | * Command* pointers to be invalidated. */
|
---|
186 | int resolverEpoch; /* Incremented whenever the name resolution
|
---|
187 | * rules change for this namespace; this
|
---|
188 | * invalidates all byte codes compiled in
|
---|
189 | * the namespace, causing the code to be
|
---|
190 | * recompiled under the new rules. */
|
---|
191 | Tcl_ResolveCmdProc *cmdResProc;
|
---|
192 | /* If non-null, this procedure overrides
|
---|
193 | * the usual command resolution mechanism
|
---|
194 | * in Tcl. This procedure is invoked
|
---|
195 | * within Tcl_FindCommand to resolve all
|
---|
196 | * command references within the namespace. */
|
---|
197 | Tcl_ResolveVarProc *varResProc;
|
---|
198 | /* If non-null, this procedure overrides
|
---|
199 | * the usual variable resolution mechanism
|
---|
200 | * in Tcl. This procedure is invoked
|
---|
201 | * within Tcl_FindNamespaceVar to resolve all
|
---|
202 | * variable references within the namespace
|
---|
203 | * at runtime. */
|
---|
204 | Tcl_ResolveCompiledVarProc *compiledVarResProc;
|
---|
205 | /* If non-null, this procedure overrides
|
---|
206 | * the usual variable resolution mechanism
|
---|
207 | * in Tcl. This procedure is invoked
|
---|
208 | * within LookupCompiledLocal to resolve
|
---|
209 | * variable references within the namespace
|
---|
210 | * at compile time. */
|
---|
211 | } Namespace;
|
---|
212 |
|
---|
213 | /*
|
---|
214 | * Flags used to represent the status of a namespace:
|
---|
215 | *
|
---|
216 | * NS_DYING - 1 means Tcl_DeleteNamespace has been called to delete the
|
---|
217 | * namespace but there are still active call frames on the Tcl
|
---|
218 | * stack that refer to the namespace. When the last call frame
|
---|
219 | * referring to it has been popped, it's variables and command
|
---|
220 | * will be destroyed and it will be marked "dead" (NS_DEAD).
|
---|
221 | * The namespace can no longer be looked up by name.
|
---|
222 | * NS_DEAD - 1 means Tcl_DeleteNamespace has been called to delete the
|
---|
223 | * namespace and no call frames still refer to it. Its
|
---|
224 | * variables and command have already been destroyed. This bit
|
---|
225 | * allows the namespace resolution code to recognize that the
|
---|
226 | * namespace is "deleted". When the last namespaceName object
|
---|
227 | * in any byte code code unit that refers to the namespace has
|
---|
228 | * been freed (i.e., when the namespace's refCount is 0), the
|
---|
229 | * namespace's storage will be freed.
|
---|
230 | */
|
---|
231 |
|
---|
232 | #define NS_DYING 0x01
|
---|
233 | #define NS_DEAD 0x02
|
---|
234 |
|
---|
235 | /*
|
---|
236 | * Flag passed to TclGetNamespaceForQualName to have it create all namespace
|
---|
237 | * components of a namespace-qualified name that cannot be found. The new
|
---|
238 | * namespaces are created within their specified parent. Note that this
|
---|
239 | * flag's value must not conflict with the values of the flags
|
---|
240 | * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, and FIND_ONLY_NS (defined in
|
---|
241 | * tclNamesp.c).
|
---|
242 | */
|
---|
243 |
|
---|
244 | #define CREATE_NS_IF_UNKNOWN 0x800
|
---|
245 |
|
---|
246 | /*
|
---|
247 | *----------------------------------------------------------------
|
---|
248 | * Data structures related to variables. These are used primarily
|
---|
249 | * in tclVar.c
|
---|
250 | *----------------------------------------------------------------
|
---|
251 | */
|
---|
252 |
|
---|
253 | /*
|
---|
254 | * The following structure defines a variable trace, which is used to
|
---|
255 | * invoke a specific C procedure whenever certain operations are performed
|
---|
256 | * on a variable.
|
---|
257 | */
|
---|
258 |
|
---|
259 | typedef struct VarTrace {
|
---|
260 | Tcl_VarTraceProc *traceProc;/* Procedure to call when operations given
|
---|
261 | * by flags are performed on variable. */
|
---|
262 | ClientData clientData; /* Argument to pass to proc. */
|
---|
263 | int flags; /* What events the trace procedure is
|
---|
264 | * interested in: OR-ed combination of
|
---|
265 | * TCL_TRACE_READS, TCL_TRACE_WRITES, and
|
---|
266 | * TCL_TRACE_UNSETS. */
|
---|
267 | struct VarTrace *nextPtr; /* Next in list of traces associated with
|
---|
268 | * a particular variable. */
|
---|
269 | } VarTrace;
|
---|
270 |
|
---|
271 | /*
|
---|
272 | * When a variable trace is active (i.e. its associated procedure is
|
---|
273 | * executing), one of the following structures is linked into a list
|
---|
274 | * associated with the variable's interpreter. The information in
|
---|
275 | * the structure is needed in order for Tcl to behave reasonably
|
---|
276 | * if traces are deleted while traces are active.
|
---|
277 | */
|
---|
278 |
|
---|
279 | typedef struct ActiveVarTrace {
|
---|
280 | struct Var *varPtr; /* Variable that's being traced. */
|
---|
281 | struct ActiveVarTrace *nextPtr;
|
---|
282 | /* Next in list of all active variable
|
---|
283 | * traces for the interpreter, or NULL
|
---|
284 | * if no more. */
|
---|
285 | VarTrace *nextTracePtr; /* Next trace to check after current
|
---|
286 | * trace procedure returns; if this
|
---|
287 | * trace gets deleted, must update pointer
|
---|
288 | * to avoid using free'd memory. */
|
---|
289 | } ActiveVarTrace;
|
---|
290 |
|
---|
291 | /*
|
---|
292 | * The following structure describes an enumerative search in progress on
|
---|
293 | * an array variable; this are invoked with options to the "array"
|
---|
294 | * command.
|
---|
295 | */
|
---|
296 |
|
---|
297 | typedef struct ArraySearch {
|
---|
298 | int id; /* Integer id used to distinguish among
|
---|
299 | * multiple concurrent searches for the
|
---|
300 | * same array. */
|
---|
301 | struct Var *varPtr; /* Pointer to array variable that's being
|
---|
302 | * searched. */
|
---|
303 | Tcl_HashSearch search; /* Info kept by the hash module about
|
---|
304 | * progress through the array. */
|
---|
305 | Tcl_HashEntry *nextEntry; /* Non-null means this is the next element
|
---|
306 | * to be enumerated (it's leftover from
|
---|
307 | * the Tcl_FirstHashEntry call or from
|
---|
308 | * an "array anymore" command). NULL
|
---|
309 | * means must call Tcl_NextHashEntry
|
---|
310 | * to get value to return. */
|
---|
311 | struct ArraySearch *nextPtr;/* Next in list of all active searches
|
---|
312 | * for this variable, or NULL if this is
|
---|
313 | * the last one. */
|
---|
314 | } ArraySearch;
|
---|
315 |
|
---|
316 | /*
|
---|
317 | * The structure below defines a variable, which associates a string name
|
---|
318 | * with a Tcl_Obj value. These structures are kept in procedure call frames
|
---|
319 | * (for local variables recognized by the compiler) or in the heap (for
|
---|
320 | * global variables and any variable not known to the compiler). For each
|
---|
321 | * Var structure in the heap, a hash table entry holds the variable name and
|
---|
322 | * a pointer to the Var structure.
|
---|
323 | */
|
---|
324 |
|
---|
325 | typedef struct Var {
|
---|
326 | union {
|
---|
327 | Tcl_Obj *objPtr; /* The variable's object value. Used for
|
---|
328 | * scalar variables and array elements. */
|
---|
329 | Tcl_HashTable *tablePtr;/* For array variables, this points to
|
---|
330 | * information about the hash table used
|
---|
331 | * to implement the associative array.
|
---|
332 | * Points to malloc-ed data. */
|
---|
333 | struct Var *linkPtr; /* If this is a global variable being
|
---|
334 | * referred to in a procedure, or a variable
|
---|
335 | * created by "upvar", this field points to
|
---|
336 | * the referenced variable's Var struct. */
|
---|
337 | } value;
|
---|
338 | char *name; /* NULL if the variable is in a hashtable,
|
---|
339 | * otherwise points to the variable's
|
---|
340 | * name. It is used, e.g., by TclLookupVar
|
---|
341 | * and "info locals". The storage for the
|
---|
342 | * characters of the name is not owned by
|
---|
343 | * the Var and must not be freed when
|
---|
344 | * freeing the Var. */
|
---|
345 | Namespace *nsPtr; /* Points to the namespace that contains
|
---|
346 | * this variable or NULL if the variable is
|
---|
347 | * a local variable in a Tcl procedure. */
|
---|
348 | Tcl_HashEntry *hPtr; /* If variable is in a hashtable, either the
|
---|
349 | * hash table entry that refers to this
|
---|
350 | * variable or NULL if the variable has been
|
---|
351 | * detached from its hash table (e.g. an
|
---|
352 | * array is deleted, but some of its
|
---|
353 | * elements are still referred to in
|
---|
354 | * upvars). NULL if the variable is not in a
|
---|
355 | * hashtable. This is used to delete an
|
---|
356 | * variable from its hashtable if it is no
|
---|
357 | * longer needed. */
|
---|
358 | int refCount; /* Counts number of active uses of this
|
---|
359 | * variable, not including its entry in the
|
---|
360 | * call frame or the hash table: 1 for each
|
---|
361 | * additional variable whose linkPtr points
|
---|
362 | * here, 1 for each nested trace active on
|
---|
363 | * variable, and 1 if the variable is a
|
---|
364 | * namespace variable. This record can't be
|
---|
365 | * deleted until refCount becomes 0. */
|
---|
366 | VarTrace *tracePtr; /* First in list of all traces set for this
|
---|
367 | * variable. */
|
---|
368 | ArraySearch *searchPtr; /* First in list of all searches active
|
---|
369 | * for this variable, or NULL if none. */
|
---|
370 | int flags; /* Miscellaneous bits of information about
|
---|
371 | * variable. See below for definitions. */
|
---|
372 | } Var;
|
---|
373 |
|
---|
374 | /*
|
---|
375 | * Flag bits for variables. The first three (VAR_SCALAR, VAR_ARRAY, and
|
---|
376 | * VAR_LINK) are mutually exclusive and give the "type" of the variable.
|
---|
377 | * VAR_UNDEFINED is independent of the variable's type.
|
---|
378 | *
|
---|
379 | * VAR_SCALAR - 1 means this is a scalar variable and not
|
---|
380 | * an array or link. The "objPtr" field points
|
---|
381 | * to the variable's value, a Tcl object.
|
---|
382 | * VAR_ARRAY - 1 means this is an array variable rather
|
---|
383 | * than a scalar variable or link. The
|
---|
384 | * "tablePtr" field points to the array's
|
---|
385 | * hashtable for its elements.
|
---|
386 | * VAR_LINK - 1 means this Var structure contains a
|
---|
387 | * pointer to another Var structure that
|
---|
388 | * either has the real value or is itself
|
---|
389 | * another VAR_LINK pointer. Variables like
|
---|
390 | * this come about through "upvar" and "global"
|
---|
391 | * commands, or through references to variables
|
---|
392 | * in enclosing namespaces.
|
---|
393 | * VAR_UNDEFINED - 1 means that the variable is in the process
|
---|
394 | * of being deleted. An undefined variable
|
---|
395 | * logically does not exist and survives only
|
---|
396 | * while it has a trace, or if it is a global
|
---|
397 | * variable currently being used by some
|
---|
398 | * procedure.
|
---|
399 | * VAR_IN_HASHTABLE - 1 means this variable is in a hashtable and
|
---|
400 | * the Var structure is malloced. 0 if it is
|
---|
401 | * a local variable that was assigned a slot
|
---|
402 | * in a procedure frame by the compiler so the
|
---|
403 | * Var storage is part of the call frame.
|
---|
404 | * VAR_TRACE_ACTIVE - 1 means that trace processing is currently
|
---|
405 | * underway for a read or write access, so
|
---|
406 | * new read or write accesses should not cause
|
---|
407 | * trace procedures to be called and the
|
---|
408 | * variable can't be deleted.
|
---|
409 | * VAR_ARRAY_ELEMENT - 1 means that this variable is an array
|
---|
410 | * element, so it is not legal for it to be
|
---|
411 | * an array itself (the VAR_ARRAY flag had
|
---|
412 | * better not be set).
|
---|
413 | * VAR_NAMESPACE_VAR - 1 means that this variable was declared
|
---|
414 | * as a namespace variable. This flag ensures
|
---|
415 | * it persists until its namespace is
|
---|
416 | * destroyed or until the variable is unset;
|
---|
417 | * it will persist even if it has not been
|
---|
418 | * initialized and is marked undefined.
|
---|
419 | * The variable's refCount is incremented to
|
---|
420 | * reflect the "reference" from its namespace.
|
---|
421 | *
|
---|
422 | * The following additional flags are used with the CompiledLocal type
|
---|
423 | * defined below:
|
---|
424 | *
|
---|
425 | * VAR_ARGUMENT - 1 means that this variable holds a procedure
|
---|
426 | * argument.
|
---|
427 | * VAR_TEMPORARY - 1 if the local variable is an anonymous
|
---|
428 | * temporary variable. Temporaries have a NULL
|
---|
429 | * name.
|
---|
430 | * VAR_RESOLVED - 1 if name resolution has been done for this
|
---|
431 | * variable.
|
---|
432 | */
|
---|
433 |
|
---|
434 | #define VAR_SCALAR 0x1
|
---|
435 | #define VAR_ARRAY 0x2
|
---|
436 | #define VAR_LINK 0x4
|
---|
437 | #define VAR_UNDEFINED 0x8
|
---|
438 | #define VAR_IN_HASHTABLE 0x10
|
---|
439 | #define VAR_TRACE_ACTIVE 0x20
|
---|
440 | #define VAR_ARRAY_ELEMENT 0x40
|
---|
441 | #define VAR_NAMESPACE_VAR 0x80
|
---|
442 |
|
---|
443 | #define VAR_ARGUMENT 0x100
|
---|
444 | #define VAR_TEMPORARY 0x200
|
---|
445 | #define VAR_RESOLVED 0x400
|
---|
446 |
|
---|
447 | /*
|
---|
448 | * Macros to ensure that various flag bits are set properly for variables.
|
---|
449 | * The ANSI C "prototypes" for these macros are:
|
---|
450 | *
|
---|
451 | * EXTERN void TclSetVarScalar _ANSI_ARGS_((Var *varPtr));
|
---|
452 | * EXTERN void TclSetVarArray _ANSI_ARGS_((Var *varPtr));
|
---|
453 | * EXTERN void TclSetVarLink _ANSI_ARGS_((Var *varPtr));
|
---|
454 | * EXTERN void TclSetVarArrayElement _ANSI_ARGS_((Var *varPtr));
|
---|
455 | * EXTERN void TclSetVarUndefined _ANSI_ARGS_((Var *varPtr));
|
---|
456 | * EXTERN void TclClearVarUndefined _ANSI_ARGS_((Var *varPtr));
|
---|
457 | */
|
---|
458 |
|
---|
459 | #define TclSetVarScalar(varPtr) \
|
---|
460 | (varPtr)->flags = ((varPtr)->flags & ~(VAR_ARRAY|VAR_LINK)) | VAR_SCALAR
|
---|
461 |
|
---|
462 | #define TclSetVarArray(varPtr) \
|
---|
463 | (varPtr)->flags = ((varPtr)->flags & ~(VAR_SCALAR|VAR_LINK)) | VAR_ARRAY
|
---|
464 |
|
---|
465 | #define TclSetVarLink(varPtr) \
|
---|
466 | (varPtr)->flags = ((varPtr)->flags & ~(VAR_SCALAR|VAR_ARRAY)) | VAR_LINK
|
---|
467 |
|
---|
468 | #define TclSetVarArrayElement(varPtr) \
|
---|
469 | (varPtr)->flags = ((varPtr)->flags & ~VAR_ARRAY) | VAR_ARRAY_ELEMENT
|
---|
470 |
|
---|
471 | #define TclSetVarUndefined(varPtr) \
|
---|
472 | (varPtr)->flags |= VAR_UNDEFINED
|
---|
473 |
|
---|
474 | #define TclClearVarUndefined(varPtr) \
|
---|
475 | (varPtr)->flags &= ~VAR_UNDEFINED
|
---|
476 |
|
---|
477 | /*
|
---|
478 | * Macros to read various flag bits of variables.
|
---|
479 | * The ANSI C "prototypes" for these macros are:
|
---|
480 | *
|
---|
481 | * EXTERN int TclIsVarScalar _ANSI_ARGS_((Var *varPtr));
|
---|
482 | * EXTERN int TclIsVarLink _ANSI_ARGS_((Var *varPtr));
|
---|
483 | * EXTERN int TclIsVarArray _ANSI_ARGS_((Var *varPtr));
|
---|
484 | * EXTERN int TclIsVarUndefined _ANSI_ARGS_((Var *varPtr));
|
---|
485 | * EXTERN int TclIsVarArrayElement _ANSI_ARGS_((Var *varPtr));
|
---|
486 | * EXTERN int TclIsVarTemporary _ANSI_ARGS_((Var *varPtr));
|
---|
487 | * EXTERN int TclIsVarArgument _ANSI_ARGS_((Var *varPtr));
|
---|
488 | * EXTERN int TclIsVarResolved _ANSI_ARGS_((Var *varPtr));
|
---|
489 | */
|
---|
490 |
|
---|
491 | #define TclIsVarScalar(varPtr) \
|
---|
492 | ((varPtr)->flags & VAR_SCALAR)
|
---|
493 |
|
---|
494 | #define TclIsVarLink(varPtr) \
|
---|
495 | ((varPtr)->flags & VAR_LINK)
|
---|
496 |
|
---|
497 | #define TclIsVarArray(varPtr) \
|
---|
498 | ((varPtr)->flags & VAR_ARRAY)
|
---|
499 |
|
---|
500 | #define TclIsVarUndefined(varPtr) \
|
---|
501 | ((varPtr)->flags & VAR_UNDEFINED)
|
---|
502 |
|
---|
503 | #define TclIsVarArrayElement(varPtr) \
|
---|
504 | ((varPtr)->flags & VAR_ARRAY_ELEMENT)
|
---|
505 |
|
---|
506 | #define TclIsVarTemporary(varPtr) \
|
---|
507 | ((varPtr)->flags & VAR_TEMPORARY)
|
---|
508 |
|
---|
509 | #define TclIsVarArgument(varPtr) \
|
---|
510 | ((varPtr)->flags & VAR_ARGUMENT)
|
---|
511 |
|
---|
512 | #define TclIsVarResolved(varPtr) \
|
---|
513 | ((varPtr)->flags & VAR_RESOLVED)
|
---|
514 |
|
---|
515 | /*
|
---|
516 | *----------------------------------------------------------------
|
---|
517 | * Data structures related to procedures. These are used primarily
|
---|
518 | * in tclProc.c, tclCompile.c, and tclExecute.c.
|
---|
519 | *----------------------------------------------------------------
|
---|
520 | */
|
---|
521 |
|
---|
522 | /*
|
---|
523 | * Forward declaration to prevent an error when the forward reference to
|
---|
524 | * Command is encountered in the Proc and ImportRef types declared below.
|
---|
525 | */
|
---|
526 |
|
---|
527 | struct Command;
|
---|
528 |
|
---|
529 | /*
|
---|
530 | * The variable-length structure below describes a local variable of a
|
---|
531 | * procedure that was recognized by the compiler. These variables have a
|
---|
532 | * name, an element in the array of compiler-assigned local variables in the
|
---|
533 | * procedure's call frame, and various other items of information. If the
|
---|
534 | * local variable is a formal argument, it may also have a default value.
|
---|
535 | * The compiler can't recognize local variables whose names are
|
---|
536 | * expressions (these names are only known at runtime when the expressions
|
---|
537 | * are evaluated) or local variables that are created as a result of an
|
---|
538 | * "upvar" or "uplevel" command. These other local variables are kept
|
---|
539 | * separately in a hash table in the call frame.
|
---|
540 | */
|
---|
541 |
|
---|
542 | typedef struct CompiledLocal {
|
---|
543 | struct CompiledLocal *nextPtr;
|
---|
544 | /* Next compiler-recognized local variable
|
---|
545 | * for this procedure, or NULL if this is
|
---|
546 | * the last local. */
|
---|
547 | int nameLength; /* The number of characters in local
|
---|
548 | * variable's name. Used to speed up
|
---|
549 | * variable lookups. */
|
---|
550 | int frameIndex; /* Index in the array of compiler-assigned
|
---|
551 | * variables in the procedure call frame. */
|
---|
552 | int flags; /* Flag bits for the local variable. Same as
|
---|
553 | * the flags for the Var structure above,
|
---|
554 | * although only VAR_SCALAR, VAR_ARRAY,
|
---|
555 | * VAR_LINK, VAR_ARGUMENT, VAR_TEMPORARY, and
|
---|
556 | * VAR_RESOLVED make sense. */
|
---|
557 | Tcl_Obj *defValuePtr; /* Pointer to the default value of an
|
---|
558 | * argument, if any. NULL if not an argument
|
---|
559 | * or, if an argument, no default value. */
|
---|
560 | Tcl_ResolvedVarInfo *resolveInfo;
|
---|
561 | /* Customized variable resolution info
|
---|
562 | * supplied by the Tcl_ResolveCompiledVarProc
|
---|
563 | * associated with a namespace. Each variable
|
---|
564 | * is marked by a unique ClientData tag
|
---|
565 | * during compilation, and that same tag
|
---|
566 | * is used to find the variable at runtime. */
|
---|
567 | char name[4]; /* Name of the local variable starts here.
|
---|
568 | * If the name is NULL, this will just be
|
---|
569 | * '\0'. The actual size of this field will
|
---|
570 | * be large enough to hold the name. MUST
|
---|
571 | * BE THE LAST FIELD IN THE STRUCTURE! */
|
---|
572 | } CompiledLocal;
|
---|
573 |
|
---|
574 | /*
|
---|
575 | * The structure below defines a command procedure, which consists of a
|
---|
576 | * collection of Tcl commands plus information about arguments and other
|
---|
577 | * local variables recognized at compile time.
|
---|
578 | */
|
---|
579 |
|
---|
580 | typedef struct Proc {
|
---|
581 | struct Interp *iPtr; /* Interpreter for which this command
|
---|
582 | * is defined. */
|
---|
583 | int refCount; /* Reference count: 1 if still present
|
---|
584 | * in command table plus 1 for each call
|
---|
585 | * to the procedure that is currently
|
---|
586 | * active. This structure can be freed
|
---|
587 | * when refCount becomes zero. */
|
---|
588 | struct Command *cmdPtr; /* Points to the Command structure for
|
---|
589 | * this procedure. This is used to get
|
---|
590 | * the namespace in which to execute
|
---|
591 | * the procedure. */
|
---|
592 | Tcl_Obj *bodyPtr; /* Points to the ByteCode object for
|
---|
593 | * procedure's body command. */
|
---|
594 | int numArgs; /* Number of formal parameters. */
|
---|
595 | int numCompiledLocals; /* Count of local variables recognized by
|
---|
596 | * the compiler including arguments and
|
---|
597 | * temporaries. */
|
---|
598 | CompiledLocal *firstLocalPtr; /* Pointer to first of the procedure's
|
---|
599 | * compiler-allocated local variables, or
|
---|
600 | * NULL if none. The first numArgs entries
|
---|
601 | * in this list describe the procedure's
|
---|
602 | * formal arguments. */
|
---|
603 | CompiledLocal *lastLocalPtr; /* Pointer to the last allocated local
|
---|
604 | * variable or NULL if none. This has
|
---|
605 | * frame index (numCompiledLocals-1). */
|
---|
606 | } Proc;
|
---|
607 |
|
---|
608 | /*
|
---|
609 | * The structure below defines a command trace. This is used to allow Tcl
|
---|
610 | * clients to find out whenever a command is about to be executed.
|
---|
611 | */
|
---|
612 |
|
---|
613 | typedef struct Trace {
|
---|
614 | int level; /* Only trace commands at nesting level
|
---|
615 | * less than or equal to this. */
|
---|
616 | Tcl_CmdTraceProc *proc; /* Procedure to call to trace command. */
|
---|
617 | ClientData clientData; /* Arbitrary value to pass to proc. */
|
---|
618 | struct Trace *nextPtr; /* Next in list of traces for this interp. */
|
---|
619 | } Trace;
|
---|
620 |
|
---|
621 | /*
|
---|
622 | * The structure below defines an entry in the assocData hash table which
|
---|
623 | * is associated with an interpreter. The entry contains a pointer to a
|
---|
624 | * function to call when the interpreter is deleted, and a pointer to
|
---|
625 | * a user-defined piece of data.
|
---|
626 | */
|
---|
627 |
|
---|
628 | typedef struct AssocData {
|
---|
629 | Tcl_InterpDeleteProc *proc; /* Proc to call when deleting. */
|
---|
630 | ClientData clientData; /* Value to pass to proc. */
|
---|
631 | } AssocData;
|
---|
632 |
|
---|
633 | /*
|
---|
634 | * The structure below defines a call frame. A call frame defines a naming
|
---|
635 | * context for a procedure call: its local naming scope (for local
|
---|
636 | * variables) and its global naming scope (a namespace, perhaps the global
|
---|
637 | * :: namespace). A call frame can also define the naming context for a
|
---|
638 | * namespace eval or namespace inscope command: the namespace in which the
|
---|
639 | * command's code should execute. The Tcl_CallFrame structures exist only
|
---|
640 | * while procedures or namespace eval/inscope's are being executed, and
|
---|
641 | * provide a kind of Tcl call stack.
|
---|
642 | *
|
---|
643 | * WARNING!! The structure definition must be kept consistent with the
|
---|
644 | * Tcl_CallFrame structure in tcl.h. If you change one, change the other.
|
---|
645 | */
|
---|
646 |
|
---|
647 | typedef struct CallFrame {
|
---|
648 | Namespace *nsPtr; /* Points to the namespace used to resolve
|
---|
649 | * commands and global variables. */
|
---|
650 | int isProcCallFrame; /* If nonzero, the frame was pushed to
|
---|
651 | * execute a Tcl procedure and may have
|
---|
652 | * local vars. If 0, the frame was pushed
|
---|
653 | * to execute a namespace command and var
|
---|
654 | * references are treated as references to
|
---|
655 | * namespace vars; varTablePtr and
|
---|
656 | * compiledLocals are ignored. */
|
---|
657 | int objc; /* This and objv below describe the
|
---|
658 | * arguments for this procedure call. */
|
---|
659 | Tcl_Obj *CONST *objv; /* Array of argument objects. */
|
---|
660 | struct CallFrame *callerPtr;
|
---|
661 | /* Value of interp->framePtr when this
|
---|
662 | * procedure was invoked (i.e. next higher
|
---|
663 | * in stack of all active procedures). */
|
---|
664 | struct CallFrame *callerVarPtr;
|
---|
665 | /* Value of interp->varFramePtr when this
|
---|
666 | * procedure was invoked (i.e. determines
|
---|
667 | * variable scoping within caller). Same
|
---|
668 | * as callerPtr unless an "uplevel" command
|
---|
669 | * or something equivalent was active in
|
---|
670 | * the caller). */
|
---|
671 | int level; /* Level of this procedure, for "uplevel"
|
---|
672 | * purposes (i.e. corresponds to nesting of
|
---|
673 | * callerVarPtr's, not callerPtr's). 1 for
|
---|
674 | * outermost procedure, 0 for top-level. */
|
---|
675 | Proc *procPtr; /* Points to the structure defining the
|
---|
676 | * called procedure. Used to get information
|
---|
677 | * such as the number of compiled local
|
---|
678 | * variables (local variables assigned
|
---|
679 | * entries ["slots"] in the compiledLocals
|
---|
680 | * array below). */
|
---|
681 | Tcl_HashTable *varTablePtr; /* Hash table containing local variables not
|
---|
682 | * recognized by the compiler, or created at
|
---|
683 | * execution time through, e.g., upvar.
|
---|
684 | * Initially NULL and created if needed. */
|
---|
685 | int numCompiledLocals; /* Count of local variables recognized by
|
---|
686 | * the compiler including arguments. */
|
---|
687 | Var* compiledLocals; /* Points to the array of local variables
|
---|
688 | * recognized by the compiler. The compiler
|
---|
689 | * emits code that refers to these variables
|
---|
690 | * using an index into this array. */
|
---|
691 | } CallFrame;
|
---|
692 |
|
---|
693 | /*
|
---|
694 | *----------------------------------------------------------------
|
---|
695 | * Data structures related to history. These are used primarily
|
---|
696 | * in tclHistory.c
|
---|
697 | *----------------------------------------------------------------
|
---|
698 | */
|
---|
699 |
|
---|
700 | /*
|
---|
701 | * The structure below defines one history event (a previously-executed
|
---|
702 | * command that can be re-executed in whole or in part).
|
---|
703 | */
|
---|
704 |
|
---|
705 | typedef struct {
|
---|
706 | char *command; /* String containing previously-executed
|
---|
707 | * command. */
|
---|
708 | int bytesAvl; /* Total # of bytes available at *event (not
|
---|
709 | * all are necessarily in use now). */
|
---|
710 | } HistoryEvent;
|
---|
711 |
|
---|
712 | /*
|
---|
713 | * The structure below defines a pending revision to the most recent
|
---|
714 | * history event. Changes are linked together into a list and applied
|
---|
715 | * during the next call to Tcl_RecordHistory. See the comments at the
|
---|
716 | * beginning of tclHistory.c for information on revisions.
|
---|
717 | */
|
---|
718 |
|
---|
719 | typedef struct HistoryRev {
|
---|
720 | int firstIndex; /* Index of the first byte to replace in
|
---|
721 | * current history event. */
|
---|
722 | int lastIndex; /* Index of last byte to replace in
|
---|
723 | * current history event. */
|
---|
724 | int newSize; /* Number of bytes in newBytes. */
|
---|
725 | char *newBytes; /* Replacement for the range given by
|
---|
726 | * firstIndex and lastIndex (malloced). */
|
---|
727 | struct HistoryRev *nextPtr; /* Next in chain of revisions to apply, or
|
---|
728 | * NULL for end of list. */
|
---|
729 | } HistoryRev;
|
---|
730 |
|
---|
731 | /*
|
---|
732 | *----------------------------------------------------------------
|
---|
733 | * Data structures related to expressions. These are used only in
|
---|
734 | * tclExpr.c.
|
---|
735 | *----------------------------------------------------------------
|
---|
736 | */
|
---|
737 |
|
---|
738 | /*
|
---|
739 | * The data structure below defines a math function (e.g. sin or hypot)
|
---|
740 | * for use in Tcl expressions.
|
---|
741 | */
|
---|
742 |
|
---|
743 | #define MAX_MATH_ARGS 5
|
---|
744 | typedef struct MathFunc {
|
---|
745 | int builtinFuncIndex; /* If this is a builtin math function, its
|
---|
746 | * index in the array of builtin functions.
|
---|
747 | * (tclCompilation.h lists these indices.)
|
---|
748 | * The value is -1 if this is a new function
|
---|
749 | * defined by Tcl_CreateMathFunc. The value
|
---|
750 | * is also -1 if a builtin function is
|
---|
751 | * replaced by a Tcl_CreateMathFunc call. */
|
---|
752 | int numArgs; /* Number of arguments for function. */
|
---|
753 | Tcl_ValueType argTypes[MAX_MATH_ARGS];
|
---|
754 | /* Acceptable types for each argument. */
|
---|
755 | Tcl_MathProc *proc; /* Procedure that implements this function.
|
---|
756 | * NULL if isBuiltinFunc is 1. */
|
---|
757 | ClientData clientData; /* Additional argument to pass to the
|
---|
758 | * function when invoking it. NULL if
|
---|
759 | * isBuiltinFunc is 1. */
|
---|
760 | } MathFunc;
|
---|
761 |
|
---|
762 | /*
|
---|
763 | *----------------------------------------------------------------
|
---|
764 | * Data structures related to bytecode compilation and execution.
|
---|
765 | * These are used primarily in tclCompile.c, tclExecute.c, and
|
---|
766 | * tclBasic.c.
|
---|
767 | *----------------------------------------------------------------
|
---|
768 | */
|
---|
769 |
|
---|
770 | /*
|
---|
771 | * Forward declaration to prevent an error when the forward reference to
|
---|
772 | * CompileEnv is encountered in the procedure type CompileProc declared
|
---|
773 | * below.
|
---|
774 | */
|
---|
775 |
|
---|
776 | struct CompileEnv;
|
---|
777 |
|
---|
778 | /*
|
---|
779 | * The type of procedures called by the Tcl bytecode compiler to compile
|
---|
780 | * commands. Pointers to these procedures are kept in the Command structure
|
---|
781 | * describing each command. When a CompileProc returns, the interpreter's
|
---|
782 | * result is set to error information, if any. In addition, the CompileProc
|
---|
783 | * returns an integer value, which is one of the following:
|
---|
784 | *
|
---|
785 | * TCL_OK Compilation completed normally.
|
---|
786 | * TCL_ERROR Compilation failed because of an error;
|
---|
787 | * the interpreter's result describes what went wrong.
|
---|
788 | * TCL_OUT_LINE_COMPILE Compilation failed because, e.g., the command is
|
---|
789 | * too complex for effective inline compilation. The
|
---|
790 | * CompileProc believes the command is legal but
|
---|
791 | * should be compiled "out of line" by emitting code
|
---|
792 | * to invoke its command procedure at runtime.
|
---|
793 | */
|
---|
794 |
|
---|
795 | #define TCL_OUT_LINE_COMPILE (TCL_CONTINUE + 1)
|
---|
796 |
|
---|
797 | typedef int (CompileProc) _ANSI_ARGS_((Tcl_Interp *interp, char *string,
|
---|
798 | char *lastChar, int compileFlags, struct CompileEnv *compEnvPtr));
|
---|
799 |
|
---|
800 | /*
|
---|
801 | * The data structure defining the execution environment for ByteCode's.
|
---|
802 | * There is one ExecEnv structure per Tcl interpreter. It holds the
|
---|
803 | * evaluation stack that holds command operands and results. The stack grows
|
---|
804 | * towards increasing addresses. The "stackTop" member is cached by
|
---|
805 | * TclExecuteByteCode in a local variable: it must be set before calling
|
---|
806 | * TclExecuteByteCode and will be restored by TclExecuteByteCode before it
|
---|
807 | * returns.
|
---|
808 | */
|
---|
809 |
|
---|
810 | typedef union StackItem {
|
---|
811 | Tcl_Obj *o; /* Stack item as a pointer to a Tcl_Obj. */
|
---|
812 | int i; /* Stack item as an integer. */
|
---|
813 | VOID *p; /* Stack item as an arbitrary pointer. */
|
---|
814 | } StackItem;
|
---|
815 |
|
---|
816 | typedef struct ExecEnv {
|
---|
817 | StackItem *stackPtr; /* Points to the first item in the
|
---|
818 | * evaluation stack on the heap. */
|
---|
819 | int stackTop; /* Index of current top of stack; -1 when
|
---|
820 | * the stack is empty. */
|
---|
821 | int stackEnd; /* Index of last usable item in stack. */
|
---|
822 | } ExecEnv;
|
---|
823 |
|
---|
824 | /*
|
---|
825 | *----------------------------------------------------------------
|
---|
826 | * Data structures related to commands.
|
---|
827 | *----------------------------------------------------------------
|
---|
828 | */
|
---|
829 |
|
---|
830 | /*
|
---|
831 | * An imported command is created in an namespace when it imports a "real"
|
---|
832 | * command from another namespace. An imported command has a Command
|
---|
833 | * structure that points (via its ClientData value) to the "real" Command
|
---|
834 | * structure in the source namespace's command table. The real command
|
---|
835 | * records all the imported commands that refer to it in a list of ImportRef
|
---|
836 | * structures so that they can be deleted when the real command is deleted. */
|
---|
837 |
|
---|
838 | typedef struct ImportRef {
|
---|
839 | struct Command *importedCmdPtr;
|
---|
840 | /* Points to the imported command created in
|
---|
841 | * an importing namespace; this command
|
---|
842 | * redirects its invocations to the "real"
|
---|
843 | * command. */
|
---|
844 | struct ImportRef *nextPtr; /* Next element on the linked list of
|
---|
845 | * imported commands that refer to the
|
---|
846 | * "real" command. The real command deletes
|
---|
847 | * these imported commands on this list when
|
---|
848 | * it is deleted. */
|
---|
849 | } ImportRef;
|
---|
850 |
|
---|
851 | /*
|
---|
852 | * Data structure used as the ClientData of imported commands: commands
|
---|
853 | * created in an namespace when it imports a "real" command from another
|
---|
854 | * namespace.
|
---|
855 | */
|
---|
856 |
|
---|
857 | typedef struct ImportedCmdData {
|
---|
858 | struct Command *realCmdPtr; /* "Real" command that this imported command
|
---|
859 | * refers to. */
|
---|
860 | struct Command *selfPtr; /* Pointer to this imported command. Needed
|
---|
861 | * only when deleting it in order to remove
|
---|
862 | * it from the real command's linked list of
|
---|
863 | * imported commands that refer to it. */
|
---|
864 | } ImportedCmdData;
|
---|
865 |
|
---|
866 | /*
|
---|
867 | * A Command structure exists for each command in a namespace. The
|
---|
868 | * Tcl_Command opaque type actually refers to these structures.
|
---|
869 | */
|
---|
870 |
|
---|
871 | typedef struct Command {
|
---|
872 | Tcl_HashEntry *hPtr; /* Pointer to the hash table entry that
|
---|
873 | * refers to this command. The hash table is
|
---|
874 | * either a namespace's command table or an
|
---|
875 | * interpreter's hidden command table. This
|
---|
876 | * pointer is used to get a command's name
|
---|
877 | * from its Tcl_Command handle. NULL means
|
---|
878 | * that the hash table entry has been
|
---|
879 | * removed already (this can happen if
|
---|
880 | * deleteProc causes the command to be
|
---|
881 | * deleted or recreated). */
|
---|
882 | Namespace *nsPtr; /* Points to the namespace containing this
|
---|
883 | * command. */
|
---|
884 | int refCount; /* 1 if in command hashtable plus 1 for each
|
---|
885 | * reference from a CmdName Tcl object
|
---|
886 | * representing a command's name in a
|
---|
887 | * ByteCode instruction sequence. This
|
---|
888 | * structure can be freed when refCount
|
---|
889 | * becomes zero. */
|
---|
890 | int cmdEpoch; /* Incremented to invalidate any references
|
---|
891 | * that point to this command when it is
|
---|
892 | * renamed, deleted, hidden, or exposed. */
|
---|
893 | CompileProc *compileProc; /* Procedure called to compile command. NULL
|
---|
894 | * if no compile proc exists for command. */
|
---|
895 | Tcl_ObjCmdProc *objProc; /* Object-based command procedure. */
|
---|
896 | ClientData objClientData; /* Arbitrary value passed to object proc. */
|
---|
897 | Tcl_CmdProc *proc; /* String-based command procedure. */
|
---|
898 | ClientData clientData; /* Arbitrary value passed to string proc. */
|
---|
899 | Tcl_CmdDeleteProc *deleteProc;
|
---|
900 | /* Procedure invoked when deleting command
|
---|
901 | * to, e.g., free all client data. */
|
---|
902 | ClientData deleteData; /* Arbitrary value passed to deleteProc. */
|
---|
903 | int deleted; /* Means that the command is in the process
|
---|
904 | * of being deleted (its deleteProc is
|
---|
905 | * currently executing). Other attempts to
|
---|
906 | * delete the command should be ignored. */
|
---|
907 | ImportRef *importRefPtr; /* List of each imported Command created in
|
---|
908 | * another namespace when this command is
|
---|
909 | * imported. These imported commands
|
---|
910 | * redirect invocations back to this
|
---|
911 | * command. The list is used to remove all
|
---|
912 | * those imported commands when deleting
|
---|
913 | * this "real" command. */
|
---|
914 | } Command;
|
---|
915 |
|
---|
916 | /*
|
---|
917 | *----------------------------------------------------------------
|
---|
918 | * Data structures related to name resolution procedures.
|
---|
919 | *----------------------------------------------------------------
|
---|
920 | */
|
---|
921 |
|
---|
922 | /*
|
---|
923 | * The interpreter keeps a linked list of name resolution schemes.
|
---|
924 | * The scheme for a namespace is consulted first, followed by the
|
---|
925 | * list of schemes in an interpreter, followed by the default
|
---|
926 | * name resolution in Tcl. Schemes are added/removed from the
|
---|
927 | * interpreter's list by calling Tcl_AddInterpResolver and
|
---|
928 | * Tcl_RemoveInterpResolver.
|
---|
929 | */
|
---|
930 |
|
---|
931 | typedef struct ResolverScheme {
|
---|
932 | char *name; /* Name identifying this scheme. */
|
---|
933 | Tcl_ResolveCmdProc *cmdResProc;
|
---|
934 | /* Procedure handling command name
|
---|
935 | * resolution. */
|
---|
936 | Tcl_ResolveVarProc *varResProc;
|
---|
937 | /* Procedure handling variable name
|
---|
938 | * resolution for variables that
|
---|
939 | * can only be handled at runtime. */
|
---|
940 | Tcl_ResolveCompiledVarProc *compiledVarResProc;
|
---|
941 | /* Procedure handling variable name
|
---|
942 | * resolution at compile time. */
|
---|
943 |
|
---|
944 | struct ResolverScheme *nextPtr;
|
---|
945 | /* Pointer to next record in linked list. */
|
---|
946 | } ResolverScheme;
|
---|
947 |
|
---|
948 | /*
|
---|
949 | *----------------------------------------------------------------
|
---|
950 | * This structure defines an interpreter, which is a collection of
|
---|
951 | * commands plus other state information related to interpreting
|
---|
952 | * commands, such as variable storage. Primary responsibility for
|
---|
953 | * this data structure is in tclBasic.c, but almost every Tcl
|
---|
954 | * source file uses something in here.
|
---|
955 | *----------------------------------------------------------------
|
---|
956 | */
|
---|
957 |
|
---|
958 | typedef struct Interp {
|
---|
959 |
|
---|
960 | /*
|
---|
961 | * Note: the first three fields must match exactly the fields in
|
---|
962 | * a Tcl_Interp struct (see tcl.h). If you change one, be sure to
|
---|
963 | * change the other.
|
---|
964 | *
|
---|
965 | * The interpreter's result is held in both the string and the
|
---|
966 | * objResultPtr fields. These fields hold, respectively, the result's
|
---|
967 | * string or object value. The interpreter's result is always in the
|
---|
968 | * result field if that is non-empty, otherwise it is in objResultPtr.
|
---|
969 | * The two fields are kept consistent unless some C code sets
|
---|
970 | * interp->result directly. Programs should not access result and
|
---|
971 | * objResultPtr directly; instead, they should always get and set the
|
---|
972 | * result using procedures such as Tcl_SetObjResult, Tcl_GetObjResult,
|
---|
973 | * and Tcl_GetStringResult. See the SetResult man page for details.
|
---|
974 | */
|
---|
975 |
|
---|
976 | char *result; /* If the last command returned a string
|
---|
977 | * result, this points to it. Should not be
|
---|
978 | * accessed directly; see comment above. */
|
---|
979 | Tcl_FreeProc *freeProc; /* Zero means a string result is statically
|
---|
980 | * allocated. TCL_DYNAMIC means string
|
---|
981 | * result was allocated with ckalloc and
|
---|
982 | * should be freed with ckfree. Other values
|
---|
983 | * give address of procedure to invoke to
|
---|
984 | * free the string result. Tcl_Eval must
|
---|
985 | * free it before executing next command. */
|
---|
986 | int errorLine; /* When TCL_ERROR is returned, this gives
|
---|
987 | * the line number in the command where the
|
---|
988 | * error occurred (1 means first line). */
|
---|
989 | Tcl_Obj *objResultPtr; /* If the last command returned an object
|
---|
990 | * result, this points to it. Should not be
|
---|
991 | * accessed directly; see comment above. */
|
---|
992 | Namespace *globalNsPtr; /* The interpreter's global namespace. */
|
---|
993 | Tcl_HashTable mathFuncTable;/* Contains all the math functions currently
|
---|
994 | * defined for the interpreter. Indexed by
|
---|
995 | * strings (function names); values have
|
---|
996 | * type (MathFunc *). */
|
---|
997 |
|
---|
998 | /*
|
---|
999 | * Information related to procedures and variables. See tclProc.c
|
---|
1000 | * and tclvar.c for usage.
|
---|
1001 | */
|
---|
1002 |
|
---|
1003 | int numLevels; /* Keeps track of how many nested calls to
|
---|
1004 | * Tcl_Eval are in progress for this
|
---|
1005 | * interpreter. It's used to delay deletion
|
---|
1006 | * of the table until all Tcl_Eval
|
---|
1007 | * invocations are completed. */
|
---|
1008 | int maxNestingDepth; /* If numLevels exceeds this value then Tcl
|
---|
1009 | * assumes that infinite recursion has
|
---|
1010 | * occurred and it generates an error. */
|
---|
1011 | CallFrame *framePtr; /* Points to top-most in stack of all nested
|
---|
1012 | * procedure invocations. NULL means there
|
---|
1013 | * are no active procedures. */
|
---|
1014 | CallFrame *varFramePtr; /* Points to the call frame whose variables
|
---|
1015 | * are currently in use (same as framePtr
|
---|
1016 | * unless an "uplevel" command is
|
---|
1017 | * executing). NULL means no procedure is
|
---|
1018 | * active or "uplevel 0" is executing. */
|
---|
1019 | ActiveVarTrace *activeTracePtr;
|
---|
1020 | /* First in list of active traces for
|
---|
1021 | * interp, or NULL if no active traces. */
|
---|
1022 | int returnCode; /* Completion code to return if current
|
---|
1023 | * procedure exits with TCL_RETURN code. */
|
---|
1024 | char *errorInfo; /* Value to store in errorInfo if returnCode
|
---|
1025 | * is TCL_ERROR. Malloc'ed, may be NULL */
|
---|
1026 | char *errorCode; /* Value to store in errorCode if returnCode
|
---|
1027 | * is TCL_ERROR. Malloc'ed, may be NULL */
|
---|
1028 |
|
---|
1029 | /*
|
---|
1030 | * Information used by Tcl_AppendResult to keep track of partial
|
---|
1031 | * results. See Tcl_AppendResult code for details.
|
---|
1032 | */
|
---|
1033 |
|
---|
1034 | char *appendResult; /* Storage space for results generated
|
---|
1035 | * by Tcl_AppendResult. Malloc-ed. NULL
|
---|
1036 | * means not yet allocated. */
|
---|
1037 | int appendAvl; /* Total amount of space available at
|
---|
1038 | * partialResult. */
|
---|
1039 | int appendUsed; /* Number of non-null bytes currently
|
---|
1040 | * stored at partialResult. */
|
---|
1041 |
|
---|
1042 | /*
|
---|
1043 | * Miscellaneous information:
|
---|
1044 | */
|
---|
1045 |
|
---|
1046 | int cmdCount; /* Total number of times a command procedure
|
---|
1047 | * has been called for this interpreter. */
|
---|
1048 | int evalFlags; /* Flags to control next call to Tcl_Eval.
|
---|
1049 | * Normally zero, but may be set before
|
---|
1050 | * calling Tcl_Eval. See below for valid
|
---|
1051 | * values. */
|
---|
1052 | int termOffset; /* Offset of character just after last one
|
---|
1053 | * compiled or executed by Tcl_EvalObj. */
|
---|
1054 | int compileEpoch; /* Holds the current "compilation epoch"
|
---|
1055 | * for this interpreter. This is
|
---|
1056 | * incremented to invalidate existing
|
---|
1057 | * ByteCodes when, e.g., a command with a
|
---|
1058 | * compile procedure is redefined. */
|
---|
1059 | Proc *compiledProcPtr; /* If a procedure is being compiled, a
|
---|
1060 | * pointer to its Proc structure; otherwise,
|
---|
1061 | * this is NULL. Set by ObjInterpProc in
|
---|
1062 | * tclProc.c and used by tclCompile.c to
|
---|
1063 | * process local variables appropriately. */
|
---|
1064 | ResolverScheme *resolverPtr;
|
---|
1065 | /* Linked list of name resolution schemes
|
---|
1066 | * added to this interpreter. Schemes
|
---|
1067 | * are added/removed by calling
|
---|
1068 | * Tcl_AddInterpResolver and
|
---|
1069 | * Tcl_RemoveInterpResolver. */
|
---|
1070 | char *scriptFile; /* NULL means there is no nested source
|
---|
1071 | * command active; otherwise this points to
|
---|
1072 | * the name of the file being sourced (it's
|
---|
1073 | * not malloc-ed: it points to an argument
|
---|
1074 | * to Tcl_EvalFile. */
|
---|
1075 | int flags; /* Various flag bits. See below. */
|
---|
1076 | long randSeed; /* Seed used for rand() function. */
|
---|
1077 | Trace *tracePtr; /* List of traces for this interpreter. */
|
---|
1078 | Tcl_HashTable *assocData; /* Hash table for associating data with
|
---|
1079 | * this interpreter. Cleaned up when
|
---|
1080 | * this interpreter is deleted. */
|
---|
1081 | struct ExecEnv *execEnvPtr; /* Execution environment for Tcl bytecode
|
---|
1082 | * execution. Contains a pointer to the
|
---|
1083 | * Tcl evaluation stack. */
|
---|
1084 | Tcl_Obj *emptyObjPtr; /* Points to an object holding an empty
|
---|
1085 | * string. Returned by Tcl_ObjSetVar2 when
|
---|
1086 | * variable traces change a variable in a
|
---|
1087 | * gross way. */
|
---|
1088 | char resultSpace[TCL_RESULT_SIZE+1];
|
---|
1089 | /* Static space holding small results. */
|
---|
1090 | } Interp;
|
---|
1091 |
|
---|
1092 | /*
|
---|
1093 | * EvalFlag bits for Interp structures:
|
---|
1094 | *
|
---|
1095 | * TCL_BRACKET_TERM 1 means that the current script is terminated by
|
---|
1096 | * a close bracket rather than the end of the string.
|
---|
1097 | * TCL_ALLOW_EXCEPTIONS 1 means it's OK for the script to terminate with
|
---|
1098 | * a code other than TCL_OK or TCL_ERROR; 0 means
|
---|
1099 | * codes other than these should be turned into errors.
|
---|
1100 | */
|
---|
1101 |
|
---|
1102 | #define TCL_BRACKET_TERM 1
|
---|
1103 | #define TCL_ALLOW_EXCEPTIONS 4
|
---|
1104 |
|
---|
1105 | /*
|
---|
1106 | * Flag bits for Interp structures:
|
---|
1107 | *
|
---|
1108 | * DELETED: Non-zero means the interpreter has been deleted:
|
---|
1109 | * don't process any more commands for it, and destroy
|
---|
1110 | * the structure as soon as all nested invocations of
|
---|
1111 | * Tcl_Eval are done.
|
---|
1112 | * ERR_IN_PROGRESS: Non-zero means an error unwind is already in
|
---|
1113 | * progress. Zero means a command proc has been
|
---|
1114 | * invoked since last error occured.
|
---|
1115 | * ERR_ALREADY_LOGGED: Non-zero means information has already been logged
|
---|
1116 | * in $errorInfo for the current Tcl_Eval instance,
|
---|
1117 | * so Tcl_Eval needn't log it (used to implement the
|
---|
1118 | * "error message log" command).
|
---|
1119 | * ERROR_CODE_SET: Non-zero means that Tcl_SetErrorCode has been
|
---|
1120 | * called to record information for the current
|
---|
1121 | * error. Zero means Tcl_Eval must clear the
|
---|
1122 | * errorCode variable if an error is returned.
|
---|
1123 | * EXPR_INITIALIZED: Non-zero means initialization specific to
|
---|
1124 | * expressions has been carried out.
|
---|
1125 | * DONT_COMPILE_CMDS_INLINE: Non-zero means that the bytecode compiler
|
---|
1126 | * should not compile any commands into an inline
|
---|
1127 | * sequence of instructions. This is set 1, for
|
---|
1128 | * example, when command traces are requested.
|
---|
1129 | * RAND_SEED_INITIALIZED: Non-zero means that the randSeed value of the
|
---|
1130 | * interp has not be initialized. This is set 1
|
---|
1131 | * when we first use the rand() or srand() functions.
|
---|
1132 | * SAFE_INTERP: Non zero means that the current interp is a
|
---|
1133 | * safe interp (ie it has only the safe commands
|
---|
1134 | * installed, less priviledge than a regular interp).
|
---|
1135 | */
|
---|
1136 |
|
---|
1137 | #define DELETED 1
|
---|
1138 | #define ERR_IN_PROGRESS 2
|
---|
1139 | #define ERR_ALREADY_LOGGED 4
|
---|
1140 | #define ERROR_CODE_SET 8
|
---|
1141 | #define EXPR_INITIALIZED 0x10
|
---|
1142 | #define DONT_COMPILE_CMDS_INLINE 0x20
|
---|
1143 | #define RAND_SEED_INITIALIZED 0x40
|
---|
1144 | #define SAFE_INTERP 0x80
|
---|
1145 |
|
---|
1146 | /*
|
---|
1147 | *----------------------------------------------------------------
|
---|
1148 | * Data structures related to command parsing. These are used in
|
---|
1149 | * tclParse.c and its clients.
|
---|
1150 | *----------------------------------------------------------------
|
---|
1151 | */
|
---|
1152 |
|
---|
1153 | /*
|
---|
1154 | * The following data structure is used by various parsing procedures
|
---|
1155 | * to hold information about where to store the results of parsing
|
---|
1156 | * (e.g. the substituted contents of a quoted argument, or the result
|
---|
1157 | * of a nested command). At any given time, the space available
|
---|
1158 | * for output is fixed, but a procedure may be called to expand the
|
---|
1159 | * space available if the current space runs out.
|
---|
1160 | */
|
---|
1161 |
|
---|
1162 | typedef struct ParseValue {
|
---|
1163 | char *buffer; /* Address of first character in
|
---|
1164 | * output buffer. */
|
---|
1165 | char *next; /* Place to store next character in
|
---|
1166 | * output buffer. */
|
---|
1167 | char *end; /* Address of the last usable character
|
---|
1168 | * in the buffer. */
|
---|
1169 | void (*expandProc) _ANSI_ARGS_((struct ParseValue *pvPtr, int needed));
|
---|
1170 | /* Procedure to call when space runs out;
|
---|
1171 | * it will make more space. */
|
---|
1172 | ClientData clientData; /* Arbitrary information for use of
|
---|
1173 | * expandProc. */
|
---|
1174 | } ParseValue;
|
---|
1175 |
|
---|
1176 | /*
|
---|
1177 | * A table used to classify input characters to assist in parsing
|
---|
1178 | * Tcl commands. The table should be indexed with a signed character
|
---|
1179 | * using the CHAR_TYPE macro. The character may have a negative
|
---|
1180 | * value. The CHAR_TYPE macro takes a pointer to a signed character
|
---|
1181 | * and a pointer to the last character in the source string. If the
|
---|
1182 | * src pointer is pointing at the terminating null of the string,
|
---|
1183 | * CHAR_TYPE returns TCL_COMMAND_END.
|
---|
1184 | */
|
---|
1185 |
|
---|
1186 | extern unsigned char tclTypeTable[];
|
---|
1187 | #define CHAR_TYPE(src,last) \
|
---|
1188 | (((src)==(last))?TCL_COMMAND_END:(tclTypeTable)[(int)(*(src) + 128)])
|
---|
1189 |
|
---|
1190 | /*
|
---|
1191 | * Possible values returned by CHAR_TYPE. Note that except for TCL_DOLLAR,
|
---|
1192 | * these are all one byte values with a single bit set 1. This means these
|
---|
1193 | * values may be bit-or'ed together (except for TCL_DOLLAR) to quickly test
|
---|
1194 | * whether a character is one of several different kinds of characters.
|
---|
1195 | *
|
---|
1196 | * TCL_NORMAL - All characters that don't have special significance
|
---|
1197 | * to the Tcl language.
|
---|
1198 | * TCL_SPACE - Character is space, tab, or return.
|
---|
1199 | * TCL_COMMAND_END - Character is newline or semicolon or close-bracket
|
---|
1200 | * or terminating null.
|
---|
1201 | * TCL_QUOTE - Character is a double-quote.
|
---|
1202 | * TCL_OPEN_BRACKET - Character is a "[".
|
---|
1203 | * TCL_OPEN_BRACE - Character is a "{".
|
---|
1204 | * TCL_CLOSE_BRACE - Character is a "}".
|
---|
1205 | * TCL_BACKSLASH - Character is a "\".
|
---|
1206 | * TCL_DOLLAR - Character is a "$".
|
---|
1207 | */
|
---|
1208 |
|
---|
1209 | #define TCL_NORMAL 0x01
|
---|
1210 | #define TCL_SPACE 0x02
|
---|
1211 | #define TCL_COMMAND_END 0x04
|
---|
1212 | #define TCL_QUOTE 0x08
|
---|
1213 | #define TCL_OPEN_BRACKET 0x10
|
---|
1214 | #define TCL_OPEN_BRACE 0x20
|
---|
1215 | #define TCL_CLOSE_BRACE 0x40
|
---|
1216 | #define TCL_BACKSLASH 0x80
|
---|
1217 | #define TCL_DOLLAR 0x00
|
---|
1218 |
|
---|
1219 | /*
|
---|
1220 | * Maximum number of levels of nesting permitted in Tcl commands (used
|
---|
1221 | * to catch infinite recursion).
|
---|
1222 | */
|
---|
1223 |
|
---|
1224 | #define MAX_NESTING_DEPTH 1000
|
---|
1225 |
|
---|
1226 | /*
|
---|
1227 | * The macro below is used to modify a "char" value (e.g. by casting
|
---|
1228 | * it to an unsigned character) so that it can be used safely with
|
---|
1229 | * macros such as isspace.
|
---|
1230 | */
|
---|
1231 |
|
---|
1232 | #define UCHAR(c) ((unsigned char) (c))
|
---|
1233 |
|
---|
1234 | /*
|
---|
1235 | * This macro is used to determine the offset needed to safely allocate any
|
---|
1236 | * data structure in memory. Given a starting offset or size, it "rounds up"
|
---|
1237 | * or "aligns" the offset to the next 8-byte boundary so that any data
|
---|
1238 | * structure can be placed at the resulting offset without fear of an
|
---|
1239 | * alignment error.
|
---|
1240 | *
|
---|
1241 | * WARNING!! DO NOT USE THIS MACRO TO ALIGN POINTERS: it will produce
|
---|
1242 | * the wrong result on platforms that allocate addresses that are divisible
|
---|
1243 | * by 4 or 2. Only use it for offsets or sizes.
|
---|
1244 | */
|
---|
1245 |
|
---|
1246 | #define TCL_ALIGN(x) (((int)(x) + 7) & ~7)
|
---|
1247 |
|
---|
1248 | /*
|
---|
1249 | * The following macros are used to specify the runtime platform
|
---|
1250 | * setting of the tclPlatform variable.
|
---|
1251 | */
|
---|
1252 |
|
---|
1253 | typedef enum {
|
---|
1254 | TCL_PLATFORM_UNIX, /* Any Unix-like OS. */
|
---|
1255 | TCL_PLATFORM_MAC, /* MacOS. */
|
---|
1256 | TCL_PLATFORM_WINDOWS /* Any Microsoft Windows OS. */
|
---|
1257 | } TclPlatformType;
|
---|
1258 |
|
---|
1259 | /*
|
---|
1260 | * Flags for TclInvoke:
|
---|
1261 | *
|
---|
1262 | * TCL_INVOKE_HIDDEN Invoke a hidden command; if not set,
|
---|
1263 | * invokes an exposed command.
|
---|
1264 | * TCL_INVOKE_NO_UNKNOWN If set, "unknown" is not invoked if
|
---|
1265 | * the command to be invoked is not found.
|
---|
1266 | * Only has an effect if invoking an exposed
|
---|
1267 | * command, i.e. if TCL_INVOKE_HIDDEN is not
|
---|
1268 | * also set.
|
---|
1269 | */
|
---|
1270 |
|
---|
1271 | #define TCL_INVOKE_HIDDEN (1<<0)
|
---|
1272 | #define TCL_INVOKE_NO_UNKNOWN (1<<1)
|
---|
1273 |
|
---|
1274 | /*
|
---|
1275 | * The structure used as the internal representation of Tcl list
|
---|
1276 | * objects. This is an array of pointers to the element objects. This array
|
---|
1277 | * is grown (reallocated and copied) as necessary to hold all the list's
|
---|
1278 | * element pointers. The array might contain more slots than currently used
|
---|
1279 | * to hold all element pointers. This is done to make append operations
|
---|
1280 | * faster.
|
---|
1281 | */
|
---|
1282 |
|
---|
1283 | typedef struct List {
|
---|
1284 | int maxElemCount; /* Total number of element array slots. */
|
---|
1285 | int elemCount; /* Current number of list elements. */
|
---|
1286 | Tcl_Obj **elements; /* Array of pointers to element objects. */
|
---|
1287 | } List;
|
---|
1288 |
|
---|
1289 | /*
|
---|
1290 | *----------------------------------------------------------------
|
---|
1291 | * Data structures related to hooking 'TclStat(...)' and
|
---|
1292 | * 'TclAccess(...)'.
|
---|
1293 | *----------------------------------------------------------------
|
---|
1294 | */
|
---|
1295 |
|
---|
1296 | typedef int (*TclCmdProcType) _ANSI_ARGS_((ClientData clientData,
|
---|
1297 | Tcl_Interp *interp, int argc, char *argv[]));
|
---|
1298 | typedef int (*TclObjCmdProcType) _ANSI_ARGS_((ClientData clientData,
|
---|
1299 | Tcl_Interp *interp, int objc, struct Tcl_Obj * CONST objv[]));
|
---|
1300 |
|
---|
1301 | /*
|
---|
1302 | *----------------------------------------------------------------
|
---|
1303 | * Variables shared among Tcl modules but not used by the outside world.
|
---|
1304 | *----------------------------------------------------------------
|
---|
1305 | */
|
---|
1306 |
|
---|
1307 | extern char * tclExecutableName;
|
---|
1308 | extern TclPlatformType tclPlatform;
|
---|
1309 |
|
---|
1310 | /*
|
---|
1311 | * Variables denoting the Tcl object types defined in the core.
|
---|
1312 | */
|
---|
1313 |
|
---|
1314 | extern Tcl_ObjType tclBooleanType;
|
---|
1315 | extern Tcl_ObjType tclByteCodeType;
|
---|
1316 | extern Tcl_ObjType tclDoubleType;
|
---|
1317 | extern Tcl_ObjType tclIntType;
|
---|
1318 | extern Tcl_ObjType tclListType;
|
---|
1319 | extern Tcl_ObjType tclProcBodyType;
|
---|
1320 | extern Tcl_ObjType tclStringType;
|
---|
1321 |
|
---|
1322 | /*
|
---|
1323 | * The head of the list of free Tcl objects, and the total number of Tcl
|
---|
1324 | * objects ever allocated and freed.
|
---|
1325 | */
|
---|
1326 |
|
---|
1327 | extern Tcl_Obj * tclFreeObjList;
|
---|
1328 |
|
---|
1329 | #ifdef TCL_COMPILE_STATS
|
---|
1330 | extern long tclObjsAlloced;
|
---|
1331 | extern long tclObjsFreed;
|
---|
1332 | #endif /* TCL_COMPILE_STATS */
|
---|
1333 |
|
---|
1334 | /*
|
---|
1335 | * Pointer to a heap-allocated string of length zero that the Tcl core uses
|
---|
1336 | * as the value of an empty string representation for an object. This value
|
---|
1337 | * is shared by all new objects allocated by Tcl_NewObj.
|
---|
1338 | */
|
---|
1339 |
|
---|
1340 | extern char * tclEmptyStringRep;
|
---|
1341 |
|
---|
1342 | /*
|
---|
1343 | *----------------------------------------------------------------
|
---|
1344 | * Procedures shared among Tcl modules but not used by the outside
|
---|
1345 | * world:
|
---|
1346 | *----------------------------------------------------------------
|
---|
1347 | */
|
---|
1348 |
|
---|
1349 | EXTERN void panic _ANSI_ARGS_(TCL_VARARGS(char *,format));
|
---|
1350 | EXTERN void TclAllocateFreeObjects _ANSI_ARGS_((void));
|
---|
1351 | EXTERN void TclCleanupCommand _ANSI_ARGS_((Command *cmdPtr));
|
---|
1352 | EXTERN int TclCopyAndCollapse _ANSI_ARGS_((int count,
|
---|
1353 | char *src, char *dst));
|
---|
1354 | EXTERN int TclCreateProc _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1355 | Namespace *nsPtr, char *procName,
|
---|
1356 | Tcl_Obj *argsPtr, Tcl_Obj *bodyPtr,
|
---|
1357 | Proc **procPtrPtr));
|
---|
1358 | EXTERN void TclDeleteCompiledLocalVars _ANSI_ARGS_((
|
---|
1359 | Interp *iPtr, CallFrame *framePtr));
|
---|
1360 | EXTERN void TclDeleteVars _ANSI_ARGS_((Interp *iPtr,
|
---|
1361 | Tcl_HashTable *tablePtr));
|
---|
1362 | EXTERN void TclDumpMemoryInfo _ANSI_ARGS_((FILE *outFile));
|
---|
1363 | EXTERN void TclExpandParseValue _ANSI_ARGS_((ParseValue *pvPtr,
|
---|
1364 | int needed));
|
---|
1365 | EXTERN void TclExprFloatError _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1366 | double value));
|
---|
1367 | EXTERN void TclFinalizeCompExecEnv _ANSI_ARGS_((void));
|
---|
1368 | EXTERN void TclFinalizeEnvironment _ANSI_ARGS_((void));
|
---|
1369 | EXTERN void TclFinalizeExecEnv _ANSI_ARGS_((void));
|
---|
1370 | EXTERN int TclFindElement _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1371 | char *list, int listLength, char **elementPtr,
|
---|
1372 | char **nextPtr, int *sizePtr, int *bracePtr));
|
---|
1373 | EXTERN Proc * TclFindProc _ANSI_ARGS_((Interp *iPtr,
|
---|
1374 | char *procName));
|
---|
1375 | EXTERN int TclFormatInt _ANSI_ARGS_((char *buffer, long n));
|
---|
1376 | EXTERN int TclGetDate _ANSI_ARGS_((char *p,
|
---|
1377 | unsigned long now, long zone,
|
---|
1378 | unsigned long *timePtr));
|
---|
1379 | EXTERN Tcl_Obj * TclGetElementOfIndexedArray _ANSI_ARGS_((
|
---|
1380 | Tcl_Interp *interp, int localIndex,
|
---|
1381 | Tcl_Obj *elemPtr, int leaveErrorMsg));
|
---|
1382 | EXTERN char * TclGetEnv _ANSI_ARGS_((CONST char *name));
|
---|
1383 | EXTERN int TclGetFrame _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1384 | char *string, CallFrame **framePtrPtr));
|
---|
1385 | EXTERN TclCmdProcType TclGetInterpProc _ANSI_ARGS_((void));
|
---|
1386 | EXTERN int TclGetIntForIndex _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1387 | Tcl_Obj *objPtr, int endValue, int *indexPtr));
|
---|
1388 | EXTERN Tcl_Obj * TclGetIndexedScalar _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1389 | int localIndex, int leaveErrorMsg));
|
---|
1390 | EXTERN int TclGetLong _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1391 | char *string, long *longPtr));
|
---|
1392 | EXTERN int TclGetNamespaceForQualName _ANSI_ARGS_((
|
---|
1393 | Tcl_Interp *interp, char *qualName,
|
---|
1394 | Namespace *cxtNsPtr, int flags,
|
---|
1395 | Namespace **nsPtrPtr, Namespace **altNsPtrPtr,
|
---|
1396 | Namespace **actualCxtPtrPtr,
|
---|
1397 | char **simpleNamePtr));
|
---|
1398 | EXTERN TclObjCmdProcType TclGetObjInterpProc _ANSI_ARGS_((void));
|
---|
1399 | EXTERN int TclGetOpenMode _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1400 | char *string, int *seekFlagPtr));
|
---|
1401 | EXTERN Tcl_Command TclGetOriginalCommand _ANSI_ARGS_((
|
---|
1402 | Tcl_Command command));
|
---|
1403 | EXTERN char * TclGetUserHome _ANSI_ARGS_((char *name,
|
---|
1404 | Tcl_DString *bufferPtr));
|
---|
1405 | EXTERN int TclGlobalInvoke _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1406 | int argc, char **argv, int flags));
|
---|
1407 | EXTERN int TclInExit _ANSI_ARGS_((void));
|
---|
1408 | EXTERN Tcl_Obj * TclIncrElementOfIndexedArray _ANSI_ARGS_((
|
---|
1409 | Tcl_Interp *interp, int localIndex,
|
---|
1410 | Tcl_Obj *elemPtr, long incrAmount));
|
---|
1411 | EXTERN Tcl_Obj * TclIncrIndexedScalar _ANSI_ARGS_((
|
---|
1412 | Tcl_Interp *interp, int localIndex,
|
---|
1413 | long incrAmount));
|
---|
1414 | EXTERN Tcl_Obj * TclIncrVar2 _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1415 | Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr,
|
---|
1416 | long incrAmount, int part1NotParsed));
|
---|
1417 | EXTERN void TclInitCompiledLocals _ANSI_ARGS_((
|
---|
1418 | Tcl_Interp *interp, CallFrame *framePtr,
|
---|
1419 | Namespace *nsPtr));
|
---|
1420 | EXTERN void TclInitNamespaces _ANSI_ARGS_((void));
|
---|
1421 | EXTERN int TclInterpInit _ANSI_ARGS_((Tcl_Interp *interp));
|
---|
1422 | EXTERN int TclInvoke _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1423 | int argc, char **argv, int flags));
|
---|
1424 | EXTERN int TclInvokeObjectCommand _ANSI_ARGS_((
|
---|
1425 | ClientData clientData, Tcl_Interp *interp,
|
---|
1426 | int argc, char **argv));
|
---|
1427 | EXTERN int TclInvokeStringCommand _ANSI_ARGS_((
|
---|
1428 | ClientData clientData, Tcl_Interp *interp,
|
---|
1429 | int objc, Tcl_Obj *CONST objv[]));
|
---|
1430 | EXTERN Proc * TclIsProc _ANSI_ARGS_((Command *cmdPtr));
|
---|
1431 | EXTERN int TclLooksLikeInt _ANSI_ARGS_((char *p));
|
---|
1432 | EXTERN Var * TclLookupVar _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1433 | char *part1, char *part2, int flags, char *msg,
|
---|
1434 | int createPart1, int createPart2,
|
---|
1435 | Var **arrayPtrPtr));
|
---|
1436 | EXTERN int TclNeedSpace _ANSI_ARGS_((char *start, char *end));
|
---|
1437 | EXTERN Tcl_Obj * TclNewProcBodyObj _ANSI_ARGS_((Proc *procPtr));
|
---|
1438 | EXTERN int TclObjCommandComplete _ANSI_ARGS_((Tcl_Obj *cmdPtr));
|
---|
1439 | EXTERN int TclObjInterpProc _ANSI_ARGS_((ClientData clientData,
|
---|
1440 | Tcl_Interp *interp, int objc,
|
---|
1441 | Tcl_Obj *CONST objv[]));
|
---|
1442 | EXTERN int TclObjInvoke _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1443 | int objc, Tcl_Obj *CONST objv[], int flags));
|
---|
1444 | EXTERN int TclObjInvokeGlobal _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1445 | int objc, Tcl_Obj *CONST objv[], int flags));
|
---|
1446 | EXTERN char * TclpAlloc _ANSI_ARGS_((unsigned int size));
|
---|
1447 |
|
---|
1448 | EXTERN char * TclpRealloc _ANSI_ARGS_((char *ptr,
|
---|
1449 | unsigned int size));
|
---|
1450 | #ifndef TclpSysAlloc
|
---|
1451 | EXTERN VOID * TclpSysAlloc _ANSI_ARGS_((long size, int isBin));
|
---|
1452 | #endif
|
---|
1453 | #ifndef TclpSysFree
|
---|
1454 | EXTERN void TclpSysFree _ANSI_ARGS_((VOID *ptr));
|
---|
1455 | #endif
|
---|
1456 | #ifndef TclpSysRealloc
|
---|
1457 | EXTERN VOID * TclpSysRealloc _ANSI_ARGS_((VOID *cp,
|
---|
1458 | unsigned int size));
|
---|
1459 | #endif
|
---|
1460 | EXTERN int TclParseBraces _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1461 | char *string, char **termPtr, ParseValue *pvPtr));
|
---|
1462 | EXTERN int TclParseNestedCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1463 | char *string, int flags, char **termPtr,
|
---|
1464 | ParseValue *pvPtr));
|
---|
1465 | EXTERN int TclParseQuotes _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1466 | char *string, int termChar, int flags,
|
---|
1467 | char **termPtr, ParseValue *pvPtr));
|
---|
1468 | EXTERN void TclPlatformExit _ANSI_ARGS_((int status));
|
---|
1469 | EXTERN char * TclPrecTraceProc _ANSI_ARGS_((ClientData clientData,
|
---|
1470 | Tcl_Interp *interp, char *name1, char *name2,
|
---|
1471 | int flags));
|
---|
1472 | EXTERN int TclPreventAliasLoop _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1473 | Tcl_Interp *cmdInterp, Tcl_Command cmd));
|
---|
1474 | EXTERN void TclPrintByteCodeObj _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1475 | Tcl_Obj *objPtr));
|
---|
1476 | EXTERN void TclProcCleanupProc _ANSI_ARGS_((Proc *procPtr));
|
---|
1477 | EXTERN int TclProcCompileProc _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1478 | Proc *procPtr, Tcl_Obj *bodyPtr, Namespace *nsPtr,
|
---|
1479 | CONST char *description, CONST char *procName));
|
---|
1480 | EXTERN void TclProcDeleteProc _ANSI_ARGS_((ClientData clientData));
|
---|
1481 | EXTERN int TclProcInterpProc _ANSI_ARGS_((ClientData clientData,
|
---|
1482 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1483 | EXTERN int TclRenameCommand _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1484 | char *oldName, char *newName)) ;
|
---|
1485 | EXTERN void TclResetShadowedCmdRefs _ANSI_ARGS_((
|
---|
1486 | Tcl_Interp *interp, Command *newCmdPtr));
|
---|
1487 | EXTERN int TclServiceIdle _ANSI_ARGS_((void));
|
---|
1488 | EXTERN Tcl_Obj * TclSetElementOfIndexedArray _ANSI_ARGS_((
|
---|
1489 | Tcl_Interp *interp, int localIndex,
|
---|
1490 | Tcl_Obj *elemPtr, Tcl_Obj *objPtr,
|
---|
1491 | int leaveErrorMsg));
|
---|
1492 | EXTERN Tcl_Obj * TclSetIndexedScalar _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1493 | int localIndex, Tcl_Obj *objPtr,
|
---|
1494 | int leaveErrorMsg));
|
---|
1495 | EXTERN char * TclSetPreInitScript _ANSI_ARGS_((char *string));
|
---|
1496 | EXTERN int TclSockGetPort _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1497 | char *string, char *proto, int *portPtr));
|
---|
1498 | EXTERN int TclSockMinimumBuffers _ANSI_ARGS_((int sock,
|
---|
1499 | int size));
|
---|
1500 | EXTERN void TclTeardownNamespace _ANSI_ARGS_((Namespace *nsPtr));
|
---|
1501 | EXTERN int TclUpdateReturnInfo _ANSI_ARGS_((Interp *iPtr));
|
---|
1502 | EXTERN char * TclWordEnd _ANSI_ARGS_((char *start, char *lastChar,
|
---|
1503 | int nested, int *semiPtr));
|
---|
1504 |
|
---|
1505 | /*
|
---|
1506 | *----------------------------------------------------------------
|
---|
1507 | * Command procedures in the generic core:
|
---|
1508 | *----------------------------------------------------------------
|
---|
1509 | */
|
---|
1510 |
|
---|
1511 | EXTERN int Tcl_AfterObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1512 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1513 | EXTERN int Tcl_AppendObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1514 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1515 | EXTERN int Tcl_ArrayObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1516 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1517 | EXTERN int Tcl_BreakCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1518 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1519 | EXTERN int Tcl_CaseObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1520 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1521 | EXTERN int Tcl_CatchObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1522 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1523 | EXTERN int Tcl_CdObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1524 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1525 | EXTERN int Tcl_ConcatObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1526 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1527 | EXTERN int Tcl_ContinueCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1528 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1529 | EXTERN int Tcl_ErrorObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1530 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1531 | EXTERN int Tcl_EvalObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1532 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1533 | EXTERN int Tcl_ExitObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1534 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1535 | EXTERN int Tcl_ExprObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1536 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1537 | EXTERN int Tcl_ForCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1538 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1539 | EXTERN int Tcl_ForeachObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1540 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1541 | EXTERN int Tcl_FormatObjCmd _ANSI_ARGS_((ClientData dummy,
|
---|
1542 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1543 | EXTERN int Tcl_GlobalObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1544 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1545 | EXTERN int Tcl_IfCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1546 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1547 | EXTERN int Tcl_IncrCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1548 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1549 | EXTERN int Tcl_InfoObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1550 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1551 | EXTERN int Tcl_InterpObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1552 | Tcl_Interp *interp, int argc, Tcl_Obj *CONST objv[]));
|
---|
1553 | EXTERN int Tcl_JoinObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1554 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1555 | EXTERN int Tcl_LappendObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1556 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1557 | EXTERN int Tcl_LindexObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1558 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1559 | EXTERN int Tcl_LinsertObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1560 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1561 | EXTERN int Tcl_LlengthObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1562 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1563 | EXTERN int Tcl_ListObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1564 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1565 | EXTERN int Tcl_LrangeObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1566 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1567 | EXTERN int Tcl_LreplaceObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1568 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1569 | EXTERN int Tcl_LsortObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1570 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1571 | EXTERN int Tcl_NamespaceObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1572 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1573 | EXTERN int Tcl_ProcObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1574 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1575 | EXTERN int Tcl_PutsObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1576 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1577 | EXTERN int Tcl_PwdCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1578 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1579 | EXTERN int Tcl_RegexpCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1580 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1581 | EXTERN int Tcl_RegsubCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1582 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1583 | EXTERN int Tcl_RenameObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1584 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1585 | EXTERN int Tcl_ReturnObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1586 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1587 | EXTERN int Tcl_ScanCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1588 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1589 | EXTERN int Tcl_SetCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1590 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1591 | EXTERN int Tcl_SplitObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1592 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1593 | EXTERN int Tcl_SourceObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1594 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1595 | EXTERN int Tcl_StringObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1596 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1597 | EXTERN int Tcl_SubstCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1598 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1599 | EXTERN int Tcl_SwitchObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1600 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1601 | EXTERN int Tcl_TimeObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1602 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1603 | EXTERN int Tcl_TraceCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1604 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1605 | EXTERN int Tcl_UnsetObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1606 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1607 | EXTERN int Tcl_UplevelObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1608 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1609 | EXTERN int Tcl_UpvarObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1610 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1611 | EXTERN int Tcl_VariableObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1612 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1613 | EXTERN int Tcl_WhileCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1614 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1615 |
|
---|
1616 | /*
|
---|
1617 | *----------------------------------------------------------------
|
---|
1618 | * Command procedures found only in the Mac version of the core:
|
---|
1619 | *----------------------------------------------------------------
|
---|
1620 | */
|
---|
1621 |
|
---|
1622 | #ifdef MAC_TCL
|
---|
1623 | EXTERN int Tcl_EchoCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1624 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1625 | EXTERN int Tcl_LsCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1626 | Tcl_Interp *interp, int argc, char **argv));
|
---|
1627 | EXTERN int Tcl_BeepObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1628 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1629 | EXTERN int Tcl_MacSourceObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1630 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1631 | EXTERN int Tcl_ResourceObjCmd _ANSI_ARGS_((ClientData clientData,
|
---|
1632 | Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]));
|
---|
1633 | #endif
|
---|
1634 |
|
---|
1635 | /*
|
---|
1636 | *----------------------------------------------------------------
|
---|
1637 | * Compilation procedures for commands in the generic core:
|
---|
1638 | *----------------------------------------------------------------
|
---|
1639 | */
|
---|
1640 |
|
---|
1641 | EXTERN int TclCompileBreakCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1642 | char *string, char *lastChar, int compileFlags,
|
---|
1643 | struct CompileEnv *compileEnvPtr));
|
---|
1644 | EXTERN int TclCompileCatchCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1645 | char *string, char *lastChar, int compileFlags,
|
---|
1646 | struct CompileEnv *compileEnvPtr));
|
---|
1647 | EXTERN int TclCompileContinueCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1648 | char *string, char *lastChar, int compileFlags,
|
---|
1649 | struct CompileEnv *compileEnvPtr));
|
---|
1650 | EXTERN int TclCompileExprCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1651 | char *string, char *lastChar, int compileFlags,
|
---|
1652 | struct CompileEnv *compileEnvPtr));
|
---|
1653 | EXTERN int TclCompileForCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1654 | char *string, char *lastChar, int compileFlags,
|
---|
1655 | struct CompileEnv *compileEnvPtr));
|
---|
1656 | EXTERN int TclCompileForeachCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1657 | char *string, char *lastChar, int compileFlags,
|
---|
1658 | struct CompileEnv *compileEnvPtr));
|
---|
1659 | EXTERN int TclCompileIfCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1660 | char *string, char *lastChar, int compileFlags,
|
---|
1661 | struct CompileEnv *compileEnvPtr));
|
---|
1662 | EXTERN int TclCompileIncrCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1663 | char *string, char *lastChar, int compileFlags,
|
---|
1664 | struct CompileEnv *compileEnvPtr));
|
---|
1665 | EXTERN int TclCompileSetCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1666 | char *string, char *lastChar, int compileFlags,
|
---|
1667 | struct CompileEnv *compileEnvPtr));
|
---|
1668 | EXTERN int TclCompileWhileCmd _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1669 | char *string, char *lastChar, int compileFlags,
|
---|
1670 | struct CompileEnv *compileEnvPtr));
|
---|
1671 |
|
---|
1672 | /*
|
---|
1673 | *----------------------------------------------------------------
|
---|
1674 | * Macros used by the Tcl core to create and release Tcl objects.
|
---|
1675 | * TclNewObj(objPtr) creates a new object denoting an empty string.
|
---|
1676 | * TclDecrRefCount(objPtr) decrements the object's reference count,
|
---|
1677 | * and frees the object if its reference count is zero.
|
---|
1678 | * These macros are inline versions of Tcl_NewObj() and
|
---|
1679 | * Tcl_DecrRefCount(). Notice that the names differ in not having
|
---|
1680 | * a "_" after the "Tcl". Notice also that these macros reference
|
---|
1681 | * their argument more than once, so you should avoid calling them
|
---|
1682 | * with an expression that is expensive to compute or has
|
---|
1683 | * side effects. The ANSI C "prototypes" for these macros are:
|
---|
1684 | *
|
---|
1685 | * EXTERN void TclNewObj _ANSI_ARGS_((Tcl_Obj *objPtr));
|
---|
1686 | * EXTERN void TclDecrRefCount _ANSI_ARGS_((Tcl_Obj *objPtr));
|
---|
1687 | *----------------------------------------------------------------
|
---|
1688 | */
|
---|
1689 |
|
---|
1690 | #ifdef TCL_COMPILE_STATS
|
---|
1691 | # define TclIncrObjsAllocated() \
|
---|
1692 | tclObjsAlloced++
|
---|
1693 | # define TclIncrObjsFreed() \
|
---|
1694 | tclObjsFreed++
|
---|
1695 | #else
|
---|
1696 | # define TclIncrObjsAllocated()
|
---|
1697 | # define TclIncrObjsFreed()
|
---|
1698 | #endif /* TCL_COMPILE_STATS */
|
---|
1699 |
|
---|
1700 | #ifdef TCL_MEM_DEBUG
|
---|
1701 | # define TclNewObj(objPtr) \
|
---|
1702 | (objPtr) = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), __FILE__, __LINE__); \
|
---|
1703 | (objPtr)->refCount = 0; \
|
---|
1704 | (objPtr)->bytes = tclEmptyStringRep; \
|
---|
1705 | (objPtr)->length = 0; \
|
---|
1706 | (objPtr)->typePtr = NULL; \
|
---|
1707 | TclIncrObjsAllocated()
|
---|
1708 | # define TclDbNewObj(objPtr, file, line) \
|
---|
1709 | (objPtr) = (Tcl_Obj *) Tcl_DbCkalloc(sizeof(Tcl_Obj), (file), (line)); \
|
---|
1710 | (objPtr)->refCount = 0; \
|
---|
1711 | (objPtr)->bytes = tclEmptyStringRep; \
|
---|
1712 | (objPtr)->length = 0; \
|
---|
1713 | (objPtr)->typePtr = NULL; \
|
---|
1714 | TclIncrObjsAllocated()
|
---|
1715 | # define TclDecrRefCount(objPtr) \
|
---|
1716 | if (--(objPtr)->refCount <= 0) { \
|
---|
1717 | if ((objPtr)->refCount < -1) \
|
---|
1718 | panic("Reference count for %lx was negative: %s line %d", \
|
---|
1719 | (objPtr), __FILE__, __LINE__); \
|
---|
1720 | if (((objPtr)->bytes != NULL) \
|
---|
1721 | && ((objPtr)->bytes != tclEmptyStringRep)) { \
|
---|
1722 | ckfree((char *) (objPtr)->bytes); \
|
---|
1723 | } \
|
---|
1724 | if (((objPtr)->typePtr != NULL) \
|
---|
1725 | && ((objPtr)->typePtr->freeIntRepProc != NULL)) { \
|
---|
1726 | (objPtr)->typePtr->freeIntRepProc(objPtr); \
|
---|
1727 | } \
|
---|
1728 | ckfree((char *) (objPtr)); \
|
---|
1729 | TclIncrObjsFreed(); \
|
---|
1730 | }
|
---|
1731 | #else /* not TCL_MEM_DEBUG */
|
---|
1732 | # define TclNewObj(objPtr) \
|
---|
1733 | if (tclFreeObjList == NULL) { \
|
---|
1734 | TclAllocateFreeObjects(); \
|
---|
1735 | } \
|
---|
1736 | (objPtr) = tclFreeObjList; \
|
---|
1737 | tclFreeObjList = (Tcl_Obj *) \
|
---|
1738 | tclFreeObjList->internalRep.otherValuePtr; \
|
---|
1739 | (objPtr)->refCount = 0; \
|
---|
1740 | (objPtr)->bytes = tclEmptyStringRep; \
|
---|
1741 | (objPtr)->length = 0; \
|
---|
1742 | (objPtr)->typePtr = NULL; \
|
---|
1743 | TclIncrObjsAllocated()
|
---|
1744 | # define TclDecrRefCount(objPtr) \
|
---|
1745 | if (--(objPtr)->refCount <= 0) { \
|
---|
1746 | if (((objPtr)->bytes != NULL) \
|
---|
1747 | && ((objPtr)->bytes != tclEmptyStringRep)) { \
|
---|
1748 | ckfree((char *) (objPtr)->bytes); \
|
---|
1749 | } \
|
---|
1750 | if (((objPtr)->typePtr != NULL) \
|
---|
1751 | && ((objPtr)->typePtr->freeIntRepProc != NULL)) { \
|
---|
1752 | (objPtr)->typePtr->freeIntRepProc(objPtr); \
|
---|
1753 | } \
|
---|
1754 | (objPtr)->internalRep.otherValuePtr = (VOID *) tclFreeObjList; \
|
---|
1755 | tclFreeObjList = (objPtr); \
|
---|
1756 | TclIncrObjsFreed(); \
|
---|
1757 | }
|
---|
1758 | #endif /* TCL_MEM_DEBUG */
|
---|
1759 |
|
---|
1760 | /*
|
---|
1761 | *----------------------------------------------------------------
|
---|
1762 | * Macro used by the Tcl core to set a Tcl_Obj's string representation
|
---|
1763 | * to a copy of the "len" bytes starting at "bytePtr". This code
|
---|
1764 | * works even if the byte array contains NULLs as long as the length
|
---|
1765 | * is correct. Because "len" is referenced multiple times, it should
|
---|
1766 | * be as simple an expression as possible. The ANSI C "prototype" for
|
---|
1767 | * this macro is:
|
---|
1768 | *
|
---|
1769 | * EXTERN void TclInitStringRep _ANSI_ARGS_((Tcl_Obj *objPtr,
|
---|
1770 | * char *bytePtr, int len));
|
---|
1771 | *----------------------------------------------------------------
|
---|
1772 | */
|
---|
1773 |
|
---|
1774 | #define TclInitStringRep(objPtr, bytePtr, len) \
|
---|
1775 | if ((len) == 0) { \
|
---|
1776 | (objPtr)->bytes = tclEmptyStringRep; \
|
---|
1777 | (objPtr)->length = 0; \
|
---|
1778 | } else { \
|
---|
1779 | (objPtr)->bytes = (char *) ckalloc((unsigned) ((len) + 1)); \
|
---|
1780 | memcpy((VOID *) (objPtr)->bytes, (VOID *) (bytePtr), \
|
---|
1781 | (unsigned) (len)); \
|
---|
1782 | (objPtr)->bytes[len] = '\0'; \
|
---|
1783 | (objPtr)->length = (len); \
|
---|
1784 | }
|
---|
1785 |
|
---|
1786 | /*
|
---|
1787 | *----------------------------------------------------------------
|
---|
1788 | * Macro used by the Tcl core to get the string representation's
|
---|
1789 | * byte array pointer and length from a Tcl_Obj. This is an inline
|
---|
1790 | * version of Tcl_GetStringFromObj(). "lengthPtr" must be the
|
---|
1791 | * address of an integer variable or NULL; If non-NULL, that variable
|
---|
1792 | * will be set to the string rep's length. The macro's expression
|
---|
1793 | * result is the string rep's byte pointer which might be NULL.
|
---|
1794 | * Note that the bytes referenced by this pointer must not be modified
|
---|
1795 | * by the caller. The ANSI C "prototype" for this macro is:
|
---|
1796 | *
|
---|
1797 | * EXTERN char * TclGetStringFromObj _ANSI_ARGS_((Tcl_Obj *objPtr,
|
---|
1798 | * int *lengthPtr));
|
---|
1799 | *----------------------------------------------------------------
|
---|
1800 | */
|
---|
1801 |
|
---|
1802 | #define TclGetStringFromObj(objPtr, lengthPtr) \
|
---|
1803 | ((objPtr)->bytes? \
|
---|
1804 | ((lengthPtr)? \
|
---|
1805 | ((*(lengthPtr) = (objPtr)->length), (objPtr)->bytes) : \
|
---|
1806 | (objPtr)->bytes) : \
|
---|
1807 | Tcl_GetStringFromObj((objPtr), (lengthPtr)))
|
---|
1808 |
|
---|
1809 | /*
|
---|
1810 | *----------------------------------------------------------------
|
---|
1811 | * Macro used by the Tcl core to reset an interpreter's Tcl object
|
---|
1812 | * result to an unshared empty string object with ref count one.
|
---|
1813 | * This does not clear any error information for the interpreter.
|
---|
1814 | * The ANSI C "prototype" for this macro is:
|
---|
1815 | *
|
---|
1816 | * EXTERN void TclResetObjResult _ANSI_ARGS_((Tcl_Interp *interp));
|
---|
1817 | *---------------------------------------------------------------
|
---|
1818 | */
|
---|
1819 |
|
---|
1820 | #define TclResetObjResult(interp) \
|
---|
1821 | { \
|
---|
1822 | register Tcl_Obj *objResultPtr = ((Interp *) interp)->objResultPtr; \
|
---|
1823 | if (Tcl_IsShared(objResultPtr)) { \
|
---|
1824 | TclDecrRefCount(objResultPtr); \
|
---|
1825 | TclNewObj(objResultPtr); \
|
---|
1826 | Tcl_IncrRefCount(objResultPtr); \
|
---|
1827 | ((Interp *) interp)->objResultPtr = objResultPtr; \
|
---|
1828 | } else { \
|
---|
1829 | if ((objResultPtr->bytes != NULL) \
|
---|
1830 | && (objResultPtr->bytes != tclEmptyStringRep)) { \
|
---|
1831 | ckfree((char *) objResultPtr->bytes); \
|
---|
1832 | } \
|
---|
1833 | objResultPtr->bytes = tclEmptyStringRep; \
|
---|
1834 | objResultPtr->length = 0; \
|
---|
1835 | if ((objResultPtr->typePtr != NULL) \
|
---|
1836 | && (objResultPtr->typePtr->freeIntRepProc != NULL)) { \
|
---|
1837 | objResultPtr->typePtr->freeIntRepProc(objResultPtr); \
|
---|
1838 | } \
|
---|
1839 | objResultPtr->typePtr = (Tcl_ObjType *) NULL; \
|
---|
1840 | } \
|
---|
1841 | }
|
---|
1842 |
|
---|
1843 | /*
|
---|
1844 | *----------------------------------------------------------------
|
---|
1845 | * Procedures used in conjunction with Tcl namespaces. They are
|
---|
1846 | * defined here instead of in tcl.h since they are not stable yet.
|
---|
1847 | *----------------------------------------------------------------
|
---|
1848 | */
|
---|
1849 |
|
---|
1850 | EXTERN void Tcl_AddInterpResolvers _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1851 | char *name, Tcl_ResolveCmdProc *cmdProc,
|
---|
1852 | Tcl_ResolveVarProc *varProc,
|
---|
1853 | Tcl_ResolveCompiledVarProc *compiledVarProc));
|
---|
1854 | EXTERN int Tcl_AppendExportList _ANSI_ARGS_((
|
---|
1855 | Tcl_Interp *interp, Tcl_Namespace *nsPtr,
|
---|
1856 | Tcl_Obj *objPtr));
|
---|
1857 | EXTERN Tcl_Namespace * Tcl_CreateNamespace _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1858 | char *name, ClientData clientData,
|
---|
1859 | Tcl_NamespaceDeleteProc *deleteProc));
|
---|
1860 | EXTERN void Tcl_DeleteNamespace _ANSI_ARGS_((
|
---|
1861 | Tcl_Namespace *nsPtr));
|
---|
1862 | EXTERN int Tcl_Export _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1863 | Tcl_Namespace *nsPtr, char *pattern,
|
---|
1864 | int resetListFirst));
|
---|
1865 | EXTERN Tcl_Command Tcl_FindCommand _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1866 | char *name, Tcl_Namespace *contextNsPtr,
|
---|
1867 | int flags));
|
---|
1868 | EXTERN Tcl_Namespace * Tcl_FindNamespace _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1869 | char *name, Tcl_Namespace *contextNsPtr,
|
---|
1870 | int flags));
|
---|
1871 | EXTERN int Tcl_GetInterpResolvers _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1872 | char *name, Tcl_ResolverInfo *resInfo));
|
---|
1873 | EXTERN int Tcl_GetNamespaceResolvers _ANSI_ARGS_((
|
---|
1874 | Tcl_Namespace *namespacePtr,
|
---|
1875 | Tcl_ResolverInfo *resInfo));
|
---|
1876 | EXTERN void Tcl_GetVariableFullName _ANSI_ARGS_((
|
---|
1877 | Tcl_Interp *interp, Tcl_Var variable,
|
---|
1878 | Tcl_Obj *objPtr));
|
---|
1879 | EXTERN Tcl_Var Tcl_FindNamespaceVar _ANSI_ARGS_((
|
---|
1880 | Tcl_Interp *interp, char *name,
|
---|
1881 | Tcl_Namespace *contextNsPtr, int flags));
|
---|
1882 | EXTERN int Tcl_ForgetImport _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1883 | Tcl_Namespace *nsPtr, char *pattern));
|
---|
1884 | EXTERN Tcl_Command Tcl_GetCommandFromObj _ANSI_ARGS_((
|
---|
1885 | Tcl_Interp *interp, Tcl_Obj *objPtr));
|
---|
1886 | EXTERN void Tcl_GetCommandFullName _ANSI_ARGS_((
|
---|
1887 | Tcl_Interp *interp, Tcl_Command command,
|
---|
1888 | Tcl_Obj *objPtr));
|
---|
1889 | EXTERN Tcl_Namespace * Tcl_GetCurrentNamespace _ANSI_ARGS_((
|
---|
1890 | Tcl_Interp *interp));
|
---|
1891 | EXTERN Tcl_Namespace * Tcl_GetGlobalNamespace _ANSI_ARGS_((
|
---|
1892 | Tcl_Interp *interp));
|
---|
1893 | EXTERN void Tcl_GetVariableFullName _ANSI_ARGS_((
|
---|
1894 | Tcl_Interp *interp, Tcl_Var variable,
|
---|
1895 | Tcl_Obj *objPtr));
|
---|
1896 | EXTERN int Tcl_Import _ANSI_ARGS_((Tcl_Interp *interp,
|
---|
1897 | Tcl_Namespace *nsPtr, char *pattern,
|
---|
1898 | int allowOverwrite));
|
---|
1899 | EXTERN void Tcl_PopCallFrame _ANSI_ARGS_((Tcl_Interp* interp));
|
---|
1900 | EXTERN int Tcl_PushCallFrame _ANSI_ARGS_((Tcl_Interp* interp,
|
---|
1901 | Tcl_CallFrame *framePtr, Tcl_Namespace *nsPtr,
|
---|
1902 | int isProcCallFrame));
|
---|
1903 | EXTERN int Tcl_RemoveInterpResolvers _ANSI_ARGS_((
|
---|
1904 | Tcl_Interp *interp, char *name));
|
---|
1905 | EXTERN void Tcl_SetNamespaceResolvers _ANSI_ARGS_((
|
---|
1906 | Tcl_Namespace *namespacePtr,
|
---|
1907 | Tcl_ResolveCmdProc *cmdProc,
|
---|
1908 | Tcl_ResolveVarProc *varProc,
|
---|
1909 | Tcl_ResolveCompiledVarProc *compiledVarProc));
|
---|
1910 |
|
---|
1911 | # undef TCL_STORAGE_CLASS
|
---|
1912 | # define TCL_STORAGE_CLASS DLLIMPORT
|
---|
1913 |
|
---|
1914 | #endif /* _TCLINT */
|
---|
1915 |
|
---|