|
|
1.1 root 1: /*
2: * tclInt.h --
3: *
4: * Declarations of things used internally by the Tcl interpreter.
5: *
6: * Copyright 1987 Regents of the University of California
7: * Permission to use, copy, modify, and distribute this
8: * software and its documentation for any purpose and without
9: * fee is hereby granted, provided that the above copyright
10: * notice appear in all copies. The University of California
11: * makes no representations about the suitability of this
12: * software for any purpose. It is provided "as is" without
13: * express or implied warranty.
14: *
15: * $Header: /sprite/src/lib/tcl/RCS/tclInt.h,v 1.22 90/03/29 10:55:01 ouster Exp $ SPRITE (Berkeley)
16: */
17:
18: #ifndef _TCLINT
19: #define _TCLINT
20:
21: #ifndef _TCL
22: #include "tcl.h"
23: #endif
24:
25: #define bcopy(src,dest,count) memcpy(dest,src,count)
26:
27: /*
28: * The structure below defines one Tcl command, by associating a procedure
29: * with a textual string.
30: */
31:
32: typedef struct Command {
33: int (*proc)(); /* Procedure to process command. */
34: ClientData clientData; /* Arbitrary value to pass to proc. */
35: void (*deleteProc)(); /* Procedure to invoke when deleting
36: * command. */
37: struct Command *nextPtr; /* Pointer to next command in list, or NULL
38: * for end of list. */
39: char name[4]; /* Name of command. The actual size of this
40: * portion is as large as is necessary to
41: * hold the characters. This must be the
42: * last subfield of the record. */
43: } Command;
44:
45: #define CMD_SIZE(nameLength) ((unsigned) sizeof(Command) + nameLength - 3)
46:
47: /*
48: * The structure below defines a variable, which associates a string name
49: * with a string value. To cut down on the number of malloc's and free's
50: * (particularly for procedure parameters), space for both the variable's
51: * name and initial value is allocated at the end of the structure (in
52: * "storage"). If the variable's value changes later, a new dynamic
53: * string is allocated, if there is insufficient space in the current
54: * storage area.
55: */
56:
57: typedef struct Var {
58: char *value; /* Current value of variable (either points
59: * to static space after name, or to dynamic
60: * space if VAR_DYNAMIC is set). */
61: int valueLength; /* Number of bytes of storage at the place
62: * referred to by value, not including space
63: * for NULL terminator. */
64: int flags; /* Miscellaneous flags: see below. */
65: struct Var *globalPtr; /* If VAR_GLOBAL is set, this points to the
66: * global variable corresponding to name. */
67: struct Var *nextPtr; /* Next variable in list, or NULL for end
68: * of list. */
69: char name[4]; /* Storage space for variable's name (and
70: * initial value). The name is at the
71: * beginning, and is null-terminated.
72: * May contain more than 4 bytes (see
73: * VAR_SIZE macro below). */
74: } Var;
75:
76: #define VAR_SIZE(nameLength, valueLength) \
77: ((unsigned) sizeof(Var) + nameLength + valueLength - 2)
78:
79: /*
80: * Variable flags:
81: *
82: * VAR_DYNAMIC: 1 means the storage space for the value was
83: * dynamically allocated, and must eventually be
84: * freed.
85: * VAR_GLOBAL: Used only in local variables. Means that this
86: * is really a global variable.
87: * VAR_DOESNT_EXIST: 1 means this variable has not yet been assigned
88: * a value. Used when a "global" command refers
89: * to a variable that hasn't been set yet.
90: */
91:
92: #define VAR_DYNAMIC 1
93: #define VAR_GLOBAL 2
94: #define VAR_DOESNT_EXIST 4
95:
96: /*
97: * The structure below defines a command procedure, which consists of
98: * a collection of Tcl commands plus information about arguments and
99: * variables.
100: */
101:
102: typedef struct Proc {
103: struct Interp *iPtr; /* Interpreter for which this command
104: * is defined. */
105: char *command; /* Command that constitutes the body of
106: * the procedure (dynamically allocated). */
107: Var *argPtr; /* Pointer to first in list of variables
108: * giving names to the procedure's arguments.
109: * The order of the variables is the same
110: * as the order of the arguments. The "value"
111: * fields of the variables are the default
112: * values. */
113: } Proc;
114:
115: /*
116: * The structure below defines a trace. This is used to allow Tcl
117: * clients to find out whenever a command is about to be executed.
118: */
119:
120: typedef struct Trace {
121: int level; /* Only trace commands at nesting level
122: * less than or equal to this. */
123: void (*proc)(); /* Procedure to call to trace command. */
124: ClientData clientData; /* Arbitrary value to pass to proc. */
125: struct Trace *nextPtr; /* Next in list of traces for this interp. */
126: } Trace;
127:
128: /*
129: * The stucture below defines an interpreter callback, which is
130: * a procedure to invoke just before an interpreter is deleted.
131: */
132:
133: typedef struct InterpCallback {
134: void (*proc)(); /* Procedure to call. */
135: ClientData clientData; /* Value to pass to procedure. */
136: struct InterpCallback *nextPtr;
137: /* Next in list of callbacks for this
138: * interpreter (or NULL for end of
139: * list). */
140: } InterpCallback;
141:
142: /*
143: * The structure below defines a frame, which is a procedure invocation.
144: * These structures exist only while procedures are being executed, and
145: * provide a sort of call stack.
146: */
147:
148: typedef struct CallFrame {
149: Var *varPtr; /* First in list of all local variables
150: * and arguments for this procedure
151: * invocation. */
152: int level; /* Level of this procedure, for "uplevel"
153: * purposes (i.e. corresponds to nesting of
154: * callerVarPtr's, not callerPtr's). 1 means
155: * outer-most procedure, 0 means top-level. */
156: int argc; /* This and argv below describe name and
157: * arguments for this procedure invocation. */
158: char **argv; /* Array of arguments. */
159: struct CallFrame *callerPtr;
160: /* Frame of procedure that invoked this one
161: * (NULL if level == 1). */
162: struct CallFrame *callerVarPtr;
163: /* Frame used by caller for accessing local
164: * variables (same as callerPtr unless an
165: * "uplevel" command was active in the
166: * caller). This field is used in the
167: * implementation of "uplevel". */
168: } CallFrame;
169:
170: /*
171: * The structure below defines one history event (a previously-executed
172: * command that can be re-executed in whole or in part).
173: */
174:
175: typedef struct {
176: char *command; /* String containing previously-executed
177: * command. */
178: int bytesAvl; /* Total # of bytes available at *event (not
179: * all are necessarily in use now). */
180: } HistoryEvent;
181:
182: /*
183: * The structure below defines a pending revision to the most recent
184: * history event. Changes are linked together into a list and applied
185: * during the next call to Tcl_RecordHistory. See the comments at the
186: * beginning of tclHistory.c for information on revisions.
187: */
188:
189: typedef struct HistoryRev {
190: int firstIndex; /* Index of the first byte to replace in
191: * current history event. */
192: int lastIndex; /* Index of last byte to replace in
193: * current history event. */
194: int newSize; /* Number of bytes in newBytes. */
195: char *newBytes; /* Replacement for the range given by
196: * firstIndex and lastIndex. */
197: struct HistoryRev *nextPtr; /* Next in chain of revisions to apply, or
198: * NULL for end of list. */
199: } HistoryRev;
200:
201: /*
202: * This structure defines an interpreter, which is a collection of commands
203: * plus other state information related to interpreting commands, such as
204: * variable storage. The lists of commands and variables are sorted by usage:
205: * each time a command or variable is used it is pulled to the front of its
206: * list.
207: */
208:
209: typedef struct Interp {
210:
211: /*
212: * Note: the first three fields must match exactly the fields in
213: * a Tcl_Interp struct (see tcl.h). If you change one, be sure to
214: * change the other.
215: */
216:
217: char *result; /* Points to result returned by last
218: * command. */
219: int dynamic; /* Non-zero means result is dynamically-
220: * allocated and must be freed by Tcl_Eval
221: * before executing the next command. */
222: int errorLine; /* When TCL_ERROR is returned, this gives
223: * the line number within the command where
224: * the error occurred (1 means first line). */
225: Command *commandPtr; /* First command in list containing all
226: * commands defined for this table. */
227:
228: /*
229: * Information related to procedures and variables. See tclProc.c
230: * for usage.
231: */
232:
233: Var *globalPtr; /* First in list of all global variables for
234: * this command table. */
235: Var *localPtr; /* First in list of all local variables and
236: * arguments for the Tcl procedure that is
237: * currently being executed. If no procedure
238: * is being executed, or if it has no vars or
239: * args, this will be NULL. */
240: int numLevels; /* Keeps track of how many nested calls to
241: * Tcl_Eval are in progress for this
242: * interpreter. It's used to delay deletion
243: * of the table until all Tcl_Eval invocations
244: * are completed. */
245: CallFrame *framePtr; /* If a procedure is being executed, this
246: * points to the call frame for the current
247: * procedure (most recently-called). NULL
248: * means no procedure is active. */
249: CallFrame *varFramePtr; /* Points to the call frame whose variables
250: * are currently in use (same as framePtr
251: * unless an "uplevel" command is being
252: * executed). NULL means no procedure is
253: * active or "uplevel 0" is being exec'ed. */
254:
255: /*
256: * Information related to history:
257: */
258:
259: int numEvents; /* Number of previously-executed commands
260: * to retain. */
261: HistoryEvent *events; /* Array containing numEvents entries
262: * (dynamically allocated). */
263: int curEvent; /* Index into events of place where current
264: * (or most recent) command is recorded. */
265: int curEventNum; /* Event number associated with the slot
266: * given by curEvent. */
267: HistoryRev *revPtr; /* First in list of pending revisions. */
268: char *historyFirst; /* First char. of current command executed
269: * from history module. NULL means don't
270: * do history revision (see tclHistory.c
271: * for details on revision). */
272: char *evalFirst; /* If TCL_RECORD_BOUNDS flag set, Tcl_Eval
273: * sets this field to point to the first
274: * char. of text from which the current
275: * command came. Otherwise Tcl_Eval sets
276: * this to NULL. */
277: char *evalLast; /* Similar to evalFirst, except points to
278: * last character of current command. */
279:
280: /*
281: * Miscellaneous information:
282: */
283:
284: int cmdCount; /* Total number of times a command procedure
285: * has been called for this interpreter. */
286: int noEval; /* Non-zero means no commands should actually
287: * be executed: just parse only. Used in
288: * expressions when the result is already
289: * determined. */
290: int flags; /* Various flag bits. See below. */
291: Trace *tracePtr; /* List of traces for this interpreter. */
292: InterpCallback *callbackPtr;/* List of callbacks to invoke when
293: * interpreter is deleted. */
294: char resultSpace[TCL_RESULT_SIZE];
295: /* Static space for storing small results. */
296: } Interp;
297:
298: /*
299: * Flag bits for Interp structures:
300: *
301: * DELETED: Non-zero means the interpreter has been deleted:
302: * don't process any more commands for it, and destroy
303: * the structure as soon as all nested invocations of
304: * Tcl_Eval are done.
305: * ERR_IN_PROGRESS: Non-zero means an error unwind is already in progress.
306: * Zero means a command proc has been invoked since last
307: * error occured.
308: * ERR_ALREADY_LOGGED: Non-zero means information has already been logged
309: * in $errorInfo for the current Tcl_Eval instance,
310: * so Tcl_Eval needn't log it (used to implement the
311: * "error message log" command).
312: */
313:
314: #define DELETED 1
315: #define ERR_IN_PROGRESS 2
316: #define ERR_ALREADY_LOGGED 4
317:
318: /*
319: * Additional flags passed to Tcl_Eval. See tcl.h for other flags to
320: * Tcl_Eval; these ones are only used internally by Tcl.
321: *
322: * TCL_RECORD_BOUNDS Tells Tcl_Eval to record information in the
323: * evalFirst and evalLast fields for each command
324: * executed directly from the string (top-level
325: * commands and those from command substitution).
326: */
327:
328: #define TCL_RECORD_BOUNDS 0x100
329:
330: /*
331: * Maximum number of levels of nesting permitted in Tcl commands.
332: */
333:
334: #define MAX_NESTING_DEPTH 100
335:
336: /*
337: * Procedures shared among Tcl modules but not used by the outside
338: * world:
339: */
340:
341: extern void TclCopyAndCollapse();
342: extern void TclDeleteVars();
343: extern Command * TclFindCmd();
344: extern int TclFindElement();
345: extern Proc * TclFindProc();
346: extern Proc * TclIsProc();
347: extern char * TclWordEnd();
348:
349: #endif _TCLINT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.