6ec10fe4b3b881e25c6fc426664369e847796ac6
[catagits/fcgi2.git] / include / tclInt.h
1 /*
2  * tclInt.h --
3  *
4  *      Declarations of things used internally by the Tcl interpreter.
5  *
6  * Copyright (c) 1987-1993 The Regents of the University of California.
7  * Copyright (c) 1994-1995 Sun Microsystems, Inc.
8  *
9  * This software is copyrighted by the Regents of the University of
10  * California, Sun Microsystems, Inc., and other parties.  The following
11  * terms apply to all files associated with the software unless explicitly
12  * disclaimed in individual files.
13  *
14  * The authors hereby grant permission to use, copy, modify, distribute,
15  * and license this software and its documentation for any purpose, provided
16  * that existing copyright notices are retained in all copies and that this
17  * notice is included verbatim in any distributions. No written agreement,
18  * license, or royalty fee is required for any of the authorized uses.
19  * Modifications to this software may be copyrighted by their authors
20  * and need not follow the licensing terms described here, provided that
21  * the new terms are clearly indicated on the first page of each file where
22  * they apply.
23  * 
24  * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
25  * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
26  * ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
27  * DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  * 
30  * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
31  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
32  * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
33  * IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
34  * NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
35  * MODIFICATIONS.
36  * 
37  * RESTRICTED RIGHTS: Use, duplication or disclosure by the government
38  * is subject to the restrictions as set forth in subparagraph (c) (1) (ii)
39  * of the Rights in Technical Data and Computer Software Clause as DFARS
40  * 252.227-7013 and FAR 52.227-19.
41  *
42  * $Id: tclInt.h,v 1.1 1997/09/16 15:36:32 stanleyg Exp $
43  *
44  * @(#) tclInt.h 1.106 95/08/25 15:44:50
45  */
46
47 #ifndef _TCLINT
48 #define _TCLINT
49
50 /*
51  * Common include files needed by most of the Tcl source files are
52  * included here, so that system-dependent personalizations for the
53  * include files only have to be made in once place.  This results
54  * in a few extra includes, but greater modularity.  The order of
55  * the three groups of #includes is important.  For example, stdio.h
56  * is needed by tcl.h, and the _ANSI_ARGS_ declaration in tcl.h is
57  * needed by stdlib.h in some configurations.
58  */
59
60 #include <stdio.h>
61
62 #ifndef _TCL
63 #include "tcl.h"
64 #endif
65 #ifndef _REGEXP
66 #include "tclRegexp.h"
67 #endif
68
69 #include <ctype.h>
70 #ifdef NO_LIMITS_H
71 #   include "compat/limits.h"
72 #else
73 #   include <limits.h>
74 #endif
75 #ifdef NO_STDLIB_H
76 #   include "compat/stdlib.h"
77 #else
78 #   include <stdlib.h>
79 #endif
80 #ifdef NO_STRING_H
81 #include "compat/string.h"
82 #else
83 #include <string.h>
84 #endif
85 #include <varargs.h>
86
87 /*
88  * At present (12/91) not all stdlib.h implementations declare strtod.
89  * The declaration below is here to ensure that it's declared, so that
90  * the compiler won't take the default approach of assuming it returns
91  * an int.  There's no ANSI prototype for it because there would end
92  * up being too many conflicts with slightly-different prototypes.
93  */
94
95 extern double strtod();
96
97 /*
98  *----------------------------------------------------------------
99  * Data structures related to variables.   These are used primarily
100  * in tclVar.c
101  *----------------------------------------------------------------
102  */
103
104 /*
105  * The following structure defines a variable trace, which is used to
106  * invoke a specific C procedure whenever certain operations are performed
107  * on a variable.
108  */
109
110 typedef struct VarTrace {
111     Tcl_VarTraceProc *traceProc;/* Procedure to call when operations given
112                                  * by flags are performed on variable. */
113     ClientData clientData;      /* Argument to pass to proc. */
114     int flags;                  /* What events the trace procedure is
115                                  * interested in:  OR-ed combination of
116                                  * TCL_TRACE_READS, TCL_TRACE_WRITES, and
117                                  * TCL_TRACE_UNSETS. */
118     struct VarTrace *nextPtr;   /* Next in list of traces associated with
119                                  * a particular variable. */
120 } VarTrace;
121
122 /*
123  * When a variable trace is active (i.e. its associated procedure is
124  * executing), one of the following structures is linked into a list
125  * associated with the variable's interpreter.  The information in
126  * the structure is needed in order for Tcl to behave reasonably
127  * if traces are deleted while traces are active.
128  */
129
130 typedef struct ActiveVarTrace {
131     struct Var *varPtr;         /* Variable that's being traced. */
132     struct ActiveVarTrace *nextPtr;
133                                 /* Next in list of all active variable
134                                  * traces for the interpreter, or NULL
135                                  * if no more. */
136     VarTrace *nextTracePtr;     /* Next trace to check after current
137                                  * trace procedure returns;  if this
138                                  * trace gets deleted, must update pointer
139                                  * to avoid using free'd memory. */
140 } ActiveVarTrace;
141
142 /*
143  * The following structure describes an enumerative search in progress on
144  * an array variable;  this are invoked with options to the "array"
145  * command.
146  */
147
148 typedef struct ArraySearch {
149     int id;                     /* Integer id used to distinguish among
150                                  * multiple concurrent searches for the
151                                  * same array. */
152     struct Var *varPtr;         /* Pointer to array variable that's being
153                                  * searched. */
154     Tcl_HashSearch search;      /* Info kept by the hash module about
155                                  * progress through the array. */
156     Tcl_HashEntry *nextEntry;   /* Non-null means this is the next element
157                                  * to be enumerated (it's leftover from
158                                  * the Tcl_FirstHashEntry call or from
159                                  * an "array anymore" command).  NULL
160                                  * means must call Tcl_NextHashEntry
161                                  * to get value to return. */
162     struct ArraySearch *nextPtr;/* Next in list of all active searches
163                                  * for this variable, or NULL if this is
164                                  * the last one. */
165 } ArraySearch;
166
167 /*
168  * The structure below defines a variable, which associates a string name
169  * with a string value.  Pointers to these structures are kept as the
170  * values of hash table entries, and the name of each variable is stored
171  * in the hash entry.
172  */
173
174 typedef struct Var {
175     int valueLength;            /* Holds the number of non-null bytes
176                                  * actually occupied by the variable's
177                                  * current value in value.string (extra
178                                  * space is sometimes left for expansion).
179                                  * For array and global variables this is
180                                  * meaningless. */
181     int valueSpace;             /* Total number of bytes of space allocated
182                                  * at value.string.  0 means there is no
183                                  * space allocated. */
184     union {
185         char *string;           /* String value of variable, used for scalar
186                                  * variables and array elements.  Malloc-ed. */
187         Tcl_HashTable *tablePtr;/* For array variables, this points to
188                                  * information about the hash table used
189                                  * to implement the associative array. 
190                                  * Points to malloc-ed data. */
191         struct Var *upvarPtr;   /* If this is a global variable being
192                                  * referred to in a procedure, or a variable
193                                  * created by "upvar", this field points to
194                                  * the record for the higher-level variable. */
195     } value;
196     Tcl_HashEntry *hPtr;        /* Hash table entry that refers to this
197                                  * variable, or NULL if the variable has
198                                  * been detached from its hash table (e.g.
199                                  * an array is deleted, but some of its
200                                  * elements are still referred to in upvars). */
201     int refCount;               /* Counts number of active uses of this
202                                  * variable, not including its main hash
203                                  * table entry: 1 for each additional variable
204                                  * whose upVarPtr points here, 1 for each
205                                  * nested trace active on variable.  This
206                                  * record can't be deleted until refCount
207                                  * becomes 0. */
208     VarTrace *tracePtr;         /* First in list of all traces set for this
209                                  * variable. */
210     ArraySearch *searchPtr;     /* First in list of all searches active
211                                  * for this variable, or NULL if none. */
212     int flags;                  /* Miscellaneous bits of information about
213                                  * variable.  See below for definitions. */
214 } Var;
215
216 /*
217  * Flag bits for variables:
218  *
219  * VAR_ARRAY    -               1 means this is an array variable rather
220  *                              than a scalar variable.
221  * VAR_UPVAR -                  1 means this variable just contains a
222  *                              pointer to another variable that has the
223  *                              real value.  Variables like this come
224  *                              about through the "upvar" and "global"
225  *                              commands.
226  * VAR_UNDEFINED -              1 means that the variable is currently
227  *                              undefined.  Undefined variables usually
228  *                              go away completely, but if an undefined
229  *                              variable has a trace on it, or if it is
230  *                              a global variable being used by a procedure,
231  *                              then it stays around even when undefined.
232  * VAR_TRACE_ACTIVE -           1 means that trace processing is currently
233  *                              underway for a read or write access, so
234  *                              new read or write accesses should not cause
235  *                              trace procedures to be called and the
236  *                              variable can't be deleted.
237  */
238
239 #define VAR_ARRAY               1
240 #define VAR_UPVAR               2
241 #define VAR_UNDEFINED           4
242 #define VAR_TRACE_ACTIVE        0x10
243
244 /*
245  *----------------------------------------------------------------
246  * Data structures related to procedures.   These are used primarily
247  * in tclProc.c
248  *----------------------------------------------------------------
249  */
250
251 /*
252  * The structure below defines an argument to a procedure, which
253  * consists of a name and an (optional) default value.
254  */
255
256 typedef struct Arg {
257     struct Arg *nextPtr;        /* Next argument for this procedure,
258                                  * or NULL if this is the last argument. */
259     char *defValue;             /* Pointer to arg's default value, or NULL
260                                  * if no default value. */
261     char name[4];               /* Name of argument starts here.  The name
262                                  * is followed by space for the default,
263                                  * if there is one.  The actual size of this
264                                  * field will be as large as necessary to
265                                  * hold both name and default value.  THIS
266                                  * MUST BE THE LAST FIELD IN THE STRUCTURE!! */
267 } Arg;
268
269 /*
270  * The structure below defines a command procedure, which consists of
271  * a collection of Tcl commands plus information about arguments and
272  * variables.
273  */
274
275 typedef struct Proc {
276     struct Interp *iPtr;        /* Interpreter for which this command
277                                  * is defined. */
278     int refCount;               /* Reference count:  1 if still present
279                                  * in command table plus 1 for each call
280                                  * to the procedure that is currently
281                                  * active.  This structure can be freed
282                                  * when refCount becomes zero. */
283     char *command;              /* Command that constitutes the body of
284                                  * the procedure (dynamically allocated). */
285     Arg *argPtr;                /* Pointer to first of procedure's formal
286                                  * arguments, or NULL if none. */
287 } Proc;
288
289 /*
290  * The structure below defines a command trace.  This is used to allow Tcl
291  * clients to find out whenever a command is about to be executed.
292  */
293
294 typedef struct Trace {
295     int level;                  /* Only trace commands at nesting level
296                                  * less than or equal to this. */
297     Tcl_CmdTraceProc *proc;     /* Procedure to call to trace command. */
298     ClientData clientData;      /* Arbitrary value to pass to proc. */
299     struct Trace *nextPtr;      /* Next in list of traces for this interp. */
300 } Trace;
301
302 /*
303  * The stucture below defines a deletion callback, which is
304  * a procedure to invoke just before an interpreter is deleted.
305  */
306
307 typedef struct DeleteCallback {
308     Tcl_InterpDeleteProc *proc; /* Procedure to call. */
309     ClientData clientData;      /* Value to pass to procedure. */
310     struct DeleteCallback *nextPtr;
311                                 /* Next in list of callbacks for this
312                                  * interpreter (or NULL for end of list). */
313 } DeleteCallback;
314
315 /*
316  * The structure below defines a frame, which is a procedure invocation.
317  * These structures exist only while procedures are being executed, and
318  * provide a sort of call stack.
319  */
320
321 typedef struct CallFrame {
322     Tcl_HashTable varTable;     /* Hash table containing all of procedure's
323                                  * local variables. */
324     int level;                  /* Level of this procedure, for "uplevel"
325                                  * purposes (i.e. corresponds to nesting of
326                                  * callerVarPtr's, not callerPtr's).  1 means
327                                  * outer-most procedure, 0 means top-level. */
328     int argc;                   /* This and argv below describe name and
329                                  * arguments for this procedure invocation. */
330     char **argv;                /* Array of arguments. */
331     struct CallFrame *callerPtr;
332                                 /* Value of interp->framePtr when this
333                                  * procedure was invoked (i.e. next in
334                                  * stack of all active procedures). */
335     struct CallFrame *callerVarPtr;
336                                 /* Value of interp->varFramePtr when this
337                                  * procedure was invoked (i.e. determines
338                                  * variable scoping within caller;  same
339                                  * as callerPtr unless an "uplevel" command
340                                  * or something equivalent was active in
341                                  * the caller). */
342 } CallFrame;
343
344 /*
345  * The structure below defines one history event (a previously-executed
346  * command that can be re-executed in whole or in part).
347  */
348
349 typedef struct {
350     char *command;              /* String containing previously-executed
351                                  * command. */
352     int bytesAvl;               /* Total # of bytes available at *event (not
353                                  * all are necessarily in use now). */
354 } HistoryEvent;
355
356 /*
357  *----------------------------------------------------------------
358  * Data structures related to history.   These are used primarily
359  * in tclHistory.c
360  *----------------------------------------------------------------
361  */
362
363 /*
364  * The structure below defines a pending revision to the most recent
365  * history event.  Changes are linked together into a list and applied
366  * during the next call to Tcl_RecordHistory.  See the comments at the
367  * beginning of tclHistory.c for information on revisions.
368  */
369
370 typedef struct HistoryRev {
371     int firstIndex;             /* Index of the first byte to replace in
372                                  * current history event. */
373     int lastIndex;              /* Index of last byte to replace in
374                                  * current history event. */
375     int newSize;                /* Number of bytes in newBytes. */
376     char *newBytes;             /* Replacement for the range given by
377                                  * firstIndex and lastIndex (malloced). */
378     struct HistoryRev *nextPtr; /* Next in chain of revisions to apply, or
379                                  * NULL for end of list. */
380 } HistoryRev;
381
382 /*
383  *----------------------------------------------------------------
384  * Data structures related to files.  These are used primarily in
385  * tclUnixUtil.c and tclUnixAZ.c.
386  *----------------------------------------------------------------
387  */
388
389 /*
390  * The data structure below defines an open file (or connection to
391  * a process pipeline) as returned by the "open" command.
392  */
393
394 typedef struct OpenFile {
395     FILE *f;                    /* Stdio file to use for reading and/or
396                                  * writing. */
397     FILE *f2;                   /* Normally NULL.  In the special case of
398                                  * a command pipeline with pipes for both
399                                  * input and output, this is a stdio file
400                                  * to use for writing to the pipeline. */
401     int permissions;            /* OR-ed combination of TCL_FILE_READABLE
402                                  * and TCL_FILE_WRITABLE. */
403     int numPids;                /* If this is a connection to a process
404                                  * pipeline, gives number of processes
405                                  * in pidPtr array below;  otherwise it
406                                  * is 0. */
407     int *pidPtr;                /* Pointer to malloc-ed array of child
408                                  * process ids (numPids of them), or NULL
409                                  * if this isn't a connection to a process
410                                  * pipeline. */
411     int errorId;                /* File id of file that receives error
412                                  * output from pipeline.  -1 means not
413                                  * used (i.e. this is a normal file). */
414 } OpenFile;
415
416 /*
417  *----------------------------------------------------------------
418  * Data structures related to expressions.  These are used only in
419  * tclExpr.c.
420  *----------------------------------------------------------------
421  */
422
423 /*
424  * The data structure below defines a math function (e.g. sin or hypot)
425  * for use in Tcl expressions.
426  */
427
428 #define MAX_MATH_ARGS 5
429 typedef struct MathFunc {
430     int numArgs;                /* Number of arguments for function. */
431     Tcl_ValueType argTypes[MAX_MATH_ARGS];
432                                 /* Acceptable types for each argument. */
433     Tcl_MathProc *proc;         /* Procedure that implements this function. */
434     ClientData clientData;      /* Additional argument to pass to the function
435                                  * when invoking it. */
436 } MathFunc;
437
438 /*
439  *----------------------------------------------------------------
440  * One of the following structures exists for each command in
441  * an interpreter.  The Tcl_Command opaque type actually refers
442  * to these structures.
443  *----------------------------------------------------------------
444  */
445
446 typedef struct Command {
447     Tcl_HashEntry *hPtr;        /* Pointer to the hash table entry in
448                                  * interp->commandTable that refers to
449                                  * this command.  Used to get a command's
450                                  * name from its Tcl_Command handle.  NULL
451                                  * means that the hash table entry has
452                                  * been removed already (this can happen
453                                  * if deleteProc causes the command to be
454                                  * deleted or recreated). */
455     Tcl_CmdProc *proc;          /* Procedure to process command. */
456     ClientData clientData;      /* Arbitrary value to pass to proc. */
457     Tcl_CmdDeleteProc *deleteProc;
458                                 /* Procedure to invoke when deleting
459                                  * command. */
460     ClientData deleteData;      /* Arbitrary value to pass to deleteProc
461                                  * (usually the same as clientData). */
462     int deleted;                /* Means that the command is in the process
463                                  * of being deleted (its deleteProc is
464                                  * currently executing).  Any other attempts
465                                  * to delete the command should be ignored. */
466 } Command;
467
468 /*
469  *----------------------------------------------------------------
470  * This structure defines an interpreter, which is a collection of
471  * commands plus other state information related to interpreting
472  * commands, such as variable storage.  Primary responsibility for
473  * this data structure is in tclBasic.c, but almost every Tcl
474  * source file uses something in here.
475  *----------------------------------------------------------------
476  */
477
478 typedef struct Interp {
479
480     /*
481      * Note:  the first three fields must match exactly the fields in
482      * a Tcl_Interp struct (see tcl.h).  If you change one, be sure to
483      * change the other.
484      */
485
486     char *result;               /* Points to result returned by last
487                                  * command. */
488     Tcl_FreeProc *freeProc;     /* Zero means result is statically allocated.
489                                  * If non-zero, gives address of procedure
490                                  * to invoke to free the result.  Must be
491                                  * freed by Tcl_Eval before executing next
492                                  * command. */
493     int errorLine;              /* When TCL_ERROR is returned, this gives
494                                  * the line number within the command where
495                                  * the error occurred (1 means first line). */
496     Tcl_HashTable commandTable; /* Contains all of the commands currently
497                                  * registered in this interpreter.  Indexed
498                                  * by strings; values have type (Command *). */
499     Tcl_HashTable mathFuncTable;/* Contains all of the math functions currently
500                                  * defined for the interpreter.  Indexed by
501                                  * strings (function names);  values have
502                                  * type (MathFunc *). */
503
504     /*
505      * Information related to procedures and variables.  See tclProc.c
506      * and tclvar.c for usage.
507      */
508
509     Tcl_HashTable globalTable;  /* Contains all global variables for
510                                  * interpreter. */
511     int numLevels;              /* Keeps track of how many nested calls to
512                                  * Tcl_Eval are in progress for this
513                                  * interpreter.  It's used to delay deletion
514                                  * of the table until all Tcl_Eval invocations
515                                  * are completed. */
516     int maxNestingDepth;        /* If numLevels exceeds this value then Tcl
517                                  * assumes that infinite recursion has
518                                  * occurred and it generates an error. */
519     CallFrame *framePtr;        /* Points to top-most in stack of all nested
520                                  * procedure invocations.  NULL means there
521                                  * are no active procedures. */
522     CallFrame *varFramePtr;     /* Points to the call frame whose variables
523                                  * are currently in use (same as framePtr
524                                  * unless an "uplevel" command is being
525                                  * executed).  NULL means no procedure is
526                                  * active or "uplevel 0" is being exec'ed. */
527     ActiveVarTrace *activeTracePtr;
528                                 /* First in list of active traces for interp,
529                                  * or NULL if no active traces. */
530     int returnCode;             /* Completion code to return if current
531                                  * procedure exits with a TCL_RETURN code. */
532     char *errorInfo;            /* Value to store in errorInfo if returnCode
533                                  * is TCL_ERROR.  Malloc'ed, may be NULL */
534     char *errorCode;            /* Value to store in errorCode if returnCode
535                                  * is TCL_ERROR.  Malloc'ed, may be NULL */
536
537     /*
538      * Information related to history:
539      */
540
541     int numEvents;              /* Number of previously-executed commands
542                                  * to retain. */
543     HistoryEvent *events;       /* Array containing numEvents entries
544                                  * (dynamically allocated). */
545     int curEvent;               /* Index into events of place where current
546                                  * (or most recent) command is recorded. */
547     int curEventNum;            /* Event number associated with the slot
548                                  * given by curEvent. */
549     HistoryRev *revPtr;         /* First in list of pending revisions. */
550     char *historyFirst;         /* First char. of current command executed
551                                  * from history module or NULL if none. */
552     int revDisables;            /* 0 means history revision OK;  > 0 gives
553                                  * a count of number of times revision has
554                                  * been disabled. */
555     char *evalFirst;            /* If TCL_RECORD_BOUNDS flag set, Tcl_Eval
556                                  * sets this field to point to the first
557                                  * char. of text from which the current
558                                  * command came.  Otherwise Tcl_Eval sets
559                                  * this to NULL. */
560     char *evalLast;             /* Similar to evalFirst, except points to
561                                  * last character of current command. */
562
563     /*
564      * Information used by Tcl_AppendResult to keep track of partial
565      * results.  See Tcl_AppendResult code for details.
566      */
567
568     char *appendResult;         /* Storage space for results generated
569                                  * by Tcl_AppendResult.  Malloc-ed.  NULL
570                                  * means not yet allocated. */
571     int appendAvl;              /* Total amount of space available at
572                                  * partialResult. */
573     int appendUsed;             /* Number of non-null bytes currently
574                                  * stored at partialResult. */
575
576     /*
577      * A cache of compiled regular expressions.  See Tcl_RegExpCompile
578      * in tclUtil.c for details.
579      */
580
581 #define NUM_REGEXPS 5
582     char *patterns[NUM_REGEXPS];/* Strings corresponding to compiled
583                                  * regular expression patterns.  NULL
584                                  * means that this slot isn't used.
585                                  * Malloc-ed. */
586     int patLengths[NUM_REGEXPS];/* Number of non-null characters in
587                                  * corresponding entry in patterns.
588                                  * -1 means entry isn't used. */
589     regexp *regexps[NUM_REGEXPS];
590                                 /* Compiled forms of above strings.  Also
591                                  * malloc-ed, or NULL if not in use yet. */
592
593     /*
594      * Information used by Tcl_PrintDouble:
595      */
596
597     char pdFormat[10];          /* Format string used by Tcl_PrintDouble. */
598     int pdPrec;                 /* Current precision (used to restore the
599                                  * the tcl_precision variable after a bogus
600                                  * value has been put into it). */
601
602     /*
603      * Miscellaneous information:
604      */
605
606     int cmdCount;               /* Total number of times a command procedure
607                                  * has been called for this interpreter. */
608     int noEval;                 /* Non-zero means no commands should actually
609                                  * be executed:  just parse only.  Used in
610                                  * expressions when the result is already
611                                  * determined. */
612     int evalFlags;              /* Flags to control next call to Tcl_Eval.
613                                  * Normally zero, but may be set before
614                                  * calling Tcl_Eval.  See below for valid
615                                  * values. */
616     char *termPtr;              /* Character just after the last one in
617                                  * a command.  Set by Tcl_Eval before
618                                  * returning. */
619     char *scriptFile;           /* NULL means there is no nested source
620                                  * command active;  otherwise this points to
621                                  * the name of the file being sourced (it's
622                                  * not malloc-ed:  it points to an argument
623                                  * to Tcl_EvalFile. */
624     int flags;                  /* Various flag bits.  See below. */
625     Trace *tracePtr;            /* List of traces for this interpreter. */
626     DeleteCallback *deleteCallbackPtr;
627                                 /* First in list of callbacks to invoke when
628                                  * interpreter is deleted. */
629     char resultSpace[TCL_RESULT_SIZE+1];
630                                 /* Static space for storing small results. */
631 } Interp;
632
633 /*
634  * EvalFlag bits for Interp structures:
635  *
636  * TCL_BRACKET_TERM     1 means that the current script is terminated by
637  *                      a close bracket rather than the end of the string.
638  * TCL_RECORD_BOUNDS    Tells Tcl_Eval to record information in the
639  *                      evalFirst and evalLast fields for each command
640  *                      executed directly from the string (top-level
641  *                      commands and those from command substitution).
642  * TCL_ALLOW_EXCEPTIONS 1 means it's OK for the script to terminate with
643  *                      a code other than TCL_OK or TCL_ERROR;  0 means
644  *                      codes other than these should be turned into errors.
645  */
646
647 #define TCL_BRACKET_TERM        1
648 #define TCL_RECORD_BOUNDS       2
649 #define TCL_ALLOW_EXCEPTIONS    4
650
651 /*
652  * Flag bits for Interp structures:
653  *
654  * DELETED:             Non-zero means the interpreter has been deleted:
655  *                      don't process any more commands for it, and destroy
656  *                      the structure as soon as all nested invocations of
657  *                      Tcl_Eval are done.
658  * ERR_IN_PROGRESS:     Non-zero means an error unwind is already in progress.
659  *                      Zero means a command proc has been invoked since last
660  *                      error occured.
661  * ERR_ALREADY_LOGGED:  Non-zero means information has already been logged
662  *                      in $errorInfo for the current Tcl_Eval instance,
663  *                      so Tcl_Eval needn't log it (used to implement the
664  *                      "error message log" command).
665  * ERROR_CODE_SET:      Non-zero means that Tcl_SetErrorCode has been
666  *                      called to record information for the current
667  *                      error.  Zero means Tcl_Eval must clear the
668  *                      errorCode variable if an error is returned.
669  * EXPR_INITIALIZED:    1 means initialization specific to expressions has
670  *                      been carried out.
671  */
672
673 #define DELETED                 1
674 #define ERR_IN_PROGRESS         2
675 #define ERR_ALREADY_LOGGED      4
676 #define ERROR_CODE_SET          8
677 #define EXPR_INITIALIZED        0x10
678
679 /*
680  * Default value for the pdPrec and pdFormat fields of interpreters:
681  */
682
683 #define DEFAULT_PD_PREC 6
684 #define DEFAULT_PD_FORMAT "%g"
685
686 /*
687  *----------------------------------------------------------------
688  * Data structures related to command parsing.   These are used in
689  * tclParse.c and its clients.
690  *----------------------------------------------------------------
691  */
692
693 /*
694  * The following data structure is used by various parsing procedures
695  * to hold information about where to store the results of parsing
696  * (e.g. the substituted contents of a quoted argument, or the result
697  * of a nested command).  At any given time, the space available
698  * for output is fixed, but a procedure may be called to expand the
699  * space available if the current space runs out.
700  */
701
702 typedef struct ParseValue {
703     char *buffer;               /* Address of first character in
704                                  * output buffer. */
705     char *next;                 /* Place to store next character in
706                                  * output buffer. */
707     char *end;                  /* Address of the last usable character
708                                  * in the buffer. */
709     void (*expandProc) _ANSI_ARGS_((struct ParseValue *pvPtr, int needed));
710                                 /* Procedure to call when space runs out;
711                                  * it will make more space. */
712     ClientData clientData;      /* Arbitrary information for use of
713                                  * expandProc. */
714 } ParseValue;
715
716 /*
717  * A table used to classify input characters to assist in parsing
718  * Tcl commands.  The table should be indexed with a signed character
719  * using the CHAR_TYPE macro.  The character may have a negative
720  * value.
721  */
722
723 extern char tclTypeTable[];
724 #define CHAR_TYPE(c) (tclTypeTable+128)[c]
725
726 /*
727  * Possible values returned by CHAR_TYPE:
728  *
729  * TCL_NORMAL -         All characters that don't have special significance
730  *                      to the Tcl language.
731  * TCL_SPACE -          Character is space, tab, or return.
732  * TCL_COMMAND_END -    Character is newline or null or semicolon or
733  *                      close-bracket.
734  * TCL_QUOTE -          Character is a double-quote.
735  * TCL_OPEN_BRACKET -   Character is a "[".
736  * TCL_OPEN_BRACE -     Character is a "{".
737  * TCL_CLOSE_BRACE -    Character is a "}".
738  * TCL_BACKSLASH -      Character is a "\".
739  * TCL_DOLLAR -         Character is a "$".
740  */
741
742 #define TCL_NORMAL              0
743 #define TCL_SPACE               1
744 #define TCL_COMMAND_END         2
745 #define TCL_QUOTE               3
746 #define TCL_OPEN_BRACKET        4
747 #define TCL_OPEN_BRACE          5
748 #define TCL_CLOSE_BRACE         6
749 #define TCL_BACKSLASH           7
750 #define TCL_DOLLAR              8
751
752 /*
753  * Maximum number of levels of nesting permitted in Tcl commands (used
754  * to catch infinite recursion).
755  */
756
757 #define MAX_NESTING_DEPTH       1000
758
759 /*
760  * The macro below is used to modify a "char" value (e.g. by casting
761  * it to an unsigned character) so that it can be used safely with
762  * macros such as isspace.
763  */
764
765 #define UCHAR(c) ((unsigned char) (c))
766
767 /*
768  * Given a size or address, the macro below "aligns" it to the machine's
769  * memory unit size (e.g. an 8-byte boundary) so that anything can be
770  * placed at the aligned address without fear of an alignment error.
771  */
772
773 #define TCL_ALIGN(x) ((x + 7) & ~7)
774
775 /*
776  * Variables shared among Tcl modules but not used by the outside
777  * world:
778  */
779
780 extern int              tclNumFiles;
781 extern OpenFile **      tclOpenFiles;
782
783 /*
784  *----------------------------------------------------------------
785  * Procedures shared among Tcl modules but not used by the outside
786  * world:
787  *----------------------------------------------------------------
788  */
789
790 extern void             panic();
791 extern void             TclCopyAndCollapse _ANSI_ARGS_((int count, char *src,
792                             char *dst));
793 extern void             TclDeleteVars _ANSI_ARGS_((Interp *iPtr,
794                             Tcl_HashTable *tablePtr));
795 extern void             TclExpandParseValue _ANSI_ARGS_((ParseValue *pvPtr,
796                             int needed));
797 extern void             TclExprFloatError _ANSI_ARGS_((Tcl_Interp *interp,
798                             double value));
799 extern int              TclFindElement _ANSI_ARGS_((Tcl_Interp *interp,
800                             char *list, char **elementPtr, char **nextPtr,
801                             int *sizePtr, int *bracePtr));
802 extern Proc *           TclFindProc _ANSI_ARGS_((Interp *iPtr,
803                             char *procName));
804 extern int              TclGetFrame _ANSI_ARGS_((Tcl_Interp *interp,
805                             char *string, CallFrame **framePtrPtr));
806 extern int              TclGetListIndex _ANSI_ARGS_((Tcl_Interp *interp,
807                             char *string, int *indexPtr));
808 extern Proc *           TclIsProc _ANSI_ARGS_((Command *cmdPtr));
809 extern int              TclNeedSpace _ANSI_ARGS_((char *start, char *end));
810 extern int              TclParseBraces _ANSI_ARGS_((Tcl_Interp *interp,
811                             char *string, char **termPtr, ParseValue *pvPtr));
812 extern int              TclParseNestedCmd _ANSI_ARGS_((Tcl_Interp *interp,
813                             char *string, int flags, char **termPtr,
814                             ParseValue *pvPtr));
815 extern int              TclParseQuotes _ANSI_ARGS_((Tcl_Interp *interp,
816                             char *string, int termChar, int flags,
817                             char **termPtr, ParseValue *pvPtr));
818 extern int              TclParseWords _ANSI_ARGS_((Tcl_Interp *interp,
819                             char *string, int flags, int maxWords,
820                             char **termPtr, int *argcPtr, char **argv,
821                             ParseValue *pvPtr));
822 extern char *           TclPrecTraceProc _ANSI_ARGS_((ClientData clientData,
823                             Tcl_Interp *interp, char *name1, char *name2,
824                             int flags));
825 extern void             TclSetupEnv _ANSI_ARGS_((Tcl_Interp *interp));
826 extern int              TclUpdateReturnInfo _ANSI_ARGS_((Interp *iPtr));
827 extern char *           TclWordEnd _ANSI_ARGS_((char *start, int nested,
828                             int *semiPtr));
829
830 /*
831  *----------------------------------------------------------------
832  * Command procedures in the generic core:
833  *----------------------------------------------------------------
834  */
835
836 extern int      Tcl_AppendCmd _ANSI_ARGS_((ClientData clientData,
837                     Tcl_Interp *interp, int argc, char **argv));
838 extern int      Tcl_ArrayCmd _ANSI_ARGS_((ClientData clientData,
839                     Tcl_Interp *interp, int argc, char **argv));
840 extern int      Tcl_BreakCmd _ANSI_ARGS_((ClientData clientData,
841                     Tcl_Interp *interp, int argc, char **argv));
842 extern int      Tcl_CaseCmd _ANSI_ARGS_((ClientData clientData,
843                     Tcl_Interp *interp, int argc, char **argv));
844 extern int      Tcl_CatchCmd _ANSI_ARGS_((ClientData clientData,
845                     Tcl_Interp *interp, int argc, char **argv));
846 extern int      Tcl_ConcatCmd _ANSI_ARGS_((ClientData clientData,
847                     Tcl_Interp *interp, int argc, char **argv));
848 extern int      Tcl_ContinueCmd _ANSI_ARGS_((ClientData clientData,
849                     Tcl_Interp *interp, int argc, char **argv));
850 extern int      Tcl_ErrorCmd _ANSI_ARGS_((ClientData clientData,
851                     Tcl_Interp *interp, int argc, char **argv));
852 extern int      Tcl_EvalCmd _ANSI_ARGS_((ClientData clientData,
853                     Tcl_Interp *interp, int argc, char **argv));
854 extern int      Tcl_ExprCmd _ANSI_ARGS_((ClientData clientData,
855                     Tcl_Interp *interp, int argc, char **argv));
856 extern int      Tcl_ForCmd _ANSI_ARGS_((ClientData clientData,
857                     Tcl_Interp *interp, int argc, char **argv));
858 extern int      Tcl_ForeachCmd _ANSI_ARGS_((ClientData clientData,
859                     Tcl_Interp *interp, int argc, char **argv));
860 extern int      Tcl_FormatCmd _ANSI_ARGS_((ClientData clientData,
861                     Tcl_Interp *interp, int argc, char **argv));
862 extern int      Tcl_GlobalCmd _ANSI_ARGS_((ClientData clientData,
863                     Tcl_Interp *interp, int argc, char **argv));
864 extern int      Tcl_HistoryCmd _ANSI_ARGS_((ClientData clientData,
865                     Tcl_Interp *interp, int argc, char **argv));
866 extern int      Tcl_IfCmd _ANSI_ARGS_((ClientData clientData,
867                     Tcl_Interp *interp, int argc, char **argv));
868 extern int      Tcl_IncrCmd _ANSI_ARGS_((ClientData clientData,
869                     Tcl_Interp *interp, int argc, char **argv));
870 extern int      Tcl_InfoCmd _ANSI_ARGS_((ClientData clientData,
871                     Tcl_Interp *interp, int argc, char **argv));
872 extern int      Tcl_JoinCmd _ANSI_ARGS_((ClientData clientData,
873                     Tcl_Interp *interp, int argc, char **argv));
874 extern int      Tcl_LappendCmd _ANSI_ARGS_((ClientData clientData,
875                     Tcl_Interp *interp, int argc, char **argv));
876 extern int      Tcl_LindexCmd _ANSI_ARGS_((ClientData clientData,
877                     Tcl_Interp *interp, int argc, char **argv));
878 extern int      Tcl_LinsertCmd _ANSI_ARGS_((ClientData clientData,
879                     Tcl_Interp *interp, int argc, char **argv));
880 extern int      Tcl_LlengthCmd _ANSI_ARGS_((ClientData clientData,
881                     Tcl_Interp *interp, int argc, char **argv));
882 extern int      Tcl_ListCmd _ANSI_ARGS_((ClientData clientData,
883                     Tcl_Interp *interp, int argc, char **argv));
884 extern int      Tcl_LrangeCmd _ANSI_ARGS_((ClientData clientData,
885                     Tcl_Interp *interp, int argc, char **argv));
886 extern int      Tcl_LreplaceCmd _ANSI_ARGS_((ClientData clientData,
887                     Tcl_Interp *interp, int argc, char **argv));
888 extern int      Tcl_LsearchCmd _ANSI_ARGS_((ClientData clientData,
889                     Tcl_Interp *interp, int argc, char **argv));
890 extern int      Tcl_LsortCmd _ANSI_ARGS_((ClientData clientData,
891                     Tcl_Interp *interp, int argc, char **argv));
892 extern int      Tcl_ProcCmd _ANSI_ARGS_((ClientData clientData,
893                     Tcl_Interp *interp, int argc, char **argv));
894 extern int      Tcl_RegexpCmd _ANSI_ARGS_((ClientData clientData,
895                     Tcl_Interp *interp, int argc, char **argv));
896 extern int      Tcl_RegsubCmd _ANSI_ARGS_((ClientData clientData,
897                     Tcl_Interp *interp, int argc, char **argv));
898 extern int      Tcl_RenameCmd _ANSI_ARGS_((ClientData clientData,
899                     Tcl_Interp *interp, int argc, char **argv));
900 extern int      Tcl_ReturnCmd _ANSI_ARGS_((ClientData clientData,
901                     Tcl_Interp *interp, int argc, char **argv));
902 extern int      Tcl_ScanCmd _ANSI_ARGS_((ClientData clientData,
903                     Tcl_Interp *interp, int argc, char **argv));
904 extern int      Tcl_SetCmd _ANSI_ARGS_((ClientData clientData,
905                     Tcl_Interp *interp, int argc, char **argv));
906 extern int      Tcl_SplitCmd _ANSI_ARGS_((ClientData clientData,
907                     Tcl_Interp *interp, int argc, char **argv));
908 extern int      Tcl_StringCmd _ANSI_ARGS_((ClientData clientData,
909                     Tcl_Interp *interp, int argc, char **argv));
910 extern int      Tcl_SubstCmd _ANSI_ARGS_((ClientData clientData,
911                     Tcl_Interp *interp, int argc, char **argv));
912 extern int      Tcl_SwitchCmd _ANSI_ARGS_((ClientData clientData,
913                     Tcl_Interp *interp, int argc, char **argv));
914 extern int      Tcl_TraceCmd _ANSI_ARGS_((ClientData clientData,
915                     Tcl_Interp *interp, int argc, char **argv));
916 extern int      Tcl_UnsetCmd _ANSI_ARGS_((ClientData clientData,
917                     Tcl_Interp *interp, int argc, char **argv));
918 extern int      Tcl_UplevelCmd _ANSI_ARGS_((ClientData clientData,
919                     Tcl_Interp *interp, int argc, char **argv));
920 extern int      Tcl_UpvarCmd _ANSI_ARGS_((ClientData clientData,
921                     Tcl_Interp *interp, int argc, char **argv));
922 extern int      Tcl_WhileCmd _ANSI_ARGS_((ClientData clientData,
923                     Tcl_Interp *interp, int argc, char **argv));
924 extern int      Tcl_Cmd _ANSI_ARGS_((ClientData clientData,
925                     Tcl_Interp *interp, int argc, char **argv));
926 extern int      Tcl_Cmd _ANSI_ARGS_((ClientData clientData,
927                     Tcl_Interp *interp, int argc, char **argv));
928
929 /*
930  *----------------------------------------------------------------
931  * Command procedures in the UNIX core:
932  *----------------------------------------------------------------
933  */
934
935 extern int      Tcl_CdCmd _ANSI_ARGS_((ClientData clientData,
936                     Tcl_Interp *interp, int argc, char **argv));
937 extern int      Tcl_CloseCmd _ANSI_ARGS_((ClientData clientData,
938                     Tcl_Interp *interp, int argc, char **argv));
939 extern int      Tcl_EofCmd _ANSI_ARGS_((ClientData clientData,
940                     Tcl_Interp *interp, int argc, char **argv));
941 extern int      Tcl_ExecCmd _ANSI_ARGS_((ClientData clientData,
942                     Tcl_Interp *interp, int argc, char **argv));
943 extern int      Tcl_ExitCmd _ANSI_ARGS_((ClientData clientData,
944                     Tcl_Interp *interp, int argc, char **argv));
945 extern int      Tcl_FileCmd _ANSI_ARGS_((ClientData clientData,
946                     Tcl_Interp *interp, int argc, char **argv));
947 extern int      Tcl_FlushCmd _ANSI_ARGS_((ClientData clientData,
948                     Tcl_Interp *interp, int argc, char **argv));
949 extern int      Tcl_GetsCmd _ANSI_ARGS_((ClientData clientData,
950                     Tcl_Interp *interp, int argc, char **argv));
951 extern int      Tcl_GlobCmd _ANSI_ARGS_((ClientData clientData,
952                     Tcl_Interp *interp, int argc, char **argv));
953 extern int      Tcl_OpenCmd _ANSI_ARGS_((ClientData clientData,
954                     Tcl_Interp *interp, int argc, char **argv));
955 extern int      Tcl_PutsCmd _ANSI_ARGS_((ClientData clientData,
956                     Tcl_Interp *interp, int argc, char **argv));
957 extern int      Tcl_PidCmd _ANSI_ARGS_((ClientData clientData,
958                     Tcl_Interp *interp, int argc, char **argv));
959 extern int      Tcl_PwdCmd _ANSI_ARGS_((ClientData clientData,
960                     Tcl_Interp *interp, int argc, char **argv));
961 extern int      Tcl_ReadCmd _ANSI_ARGS_((ClientData clientData,
962                     Tcl_Interp *interp, int argc, char **argv));
963 extern int      Tcl_SeekCmd _ANSI_ARGS_((ClientData clientData,
964                     Tcl_Interp *interp, int argc, char **argv));
965 extern int      Tcl_SourceCmd _ANSI_ARGS_((ClientData clientData,
966                     Tcl_Interp *interp, int argc, char **argv));
967 extern int      Tcl_TellCmd _ANSI_ARGS_((ClientData clientData,
968                     Tcl_Interp *interp, int argc, char **argv));
969 extern int      Tcl_TimeCmd _ANSI_ARGS_((ClientData clientData,
970                     Tcl_Interp *interp, int argc, char **argv));
971
972 #endif /* _TCLINT */