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