]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * tclInt.h -- | |
3 | * | |
4 | * Declarations of things used internally by the Tcl interpreter. | |
5 | * | |
6 | * Copyright 1987-1991 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: /user6/ouster/tcl/RCS/tclInt.h,v 1.69 92/06/21 14:09:23 ouster Exp $ SPRITE (Berkeley) | |
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 | #include <unistd.h> | |
33 | ||
34 | #ifndef _TCL | |
35 | #include "tcl.h" | |
36 | #endif | |
37 | #ifndef _TCLHASH | |
38 | #include "tclhash.h" | |
39 | #endif | |
40 | #ifndef _REGEXP | |
41 | #include "regexp.h" | |
42 | #endif | |
43 | ||
44 | /* | |
45 | * Macro to use instead of "void" for arguments that must have | |
46 | * type "void *" in ANSI C; maps them to type "char *" in | |
47 | * non-ANSI systems. This macro may be used in some of the include | |
48 | * files below, which is why it is defined here. | |
49 | */ | |
50 | ||
51 | #ifndef VOID | |
52 | # ifdef __STDC__ | |
53 | # define VOID void | |
54 | # else | |
55 | # define VOID char | |
56 | # endif | |
57 | #endif | |
58 | ||
59 | #include <ctype.h> | |
60 | #include <stdlib.h> | |
61 | #include <string.h> | |
62 | //#include <varargs.h> | |
63 | #include <stdarg.h> | |
64 | ||
65 | /* | |
66 | * At present (12/91) not all stdlib.h implementations declare strtod. | |
67 | * The declaration below is here to ensure that it's declared, so that | |
68 | * the compiler won't take the default approach of assuming it returns | |
69 | * an int. There's no ANSI prototype for it because there would end | |
70 | * up being too many conflicts with slightly-different prototypes. | |
71 | */ | |
72 | ||
73 | extern double strtod(); | |
74 | ||
75 | /* | |
76 | *---------------------------------------------------------------- | |
77 | * Data structures related to variables. These are used primarily | |
78 | * in tclVar.c | |
79 | *---------------------------------------------------------------- | |
80 | */ | |
81 | ||
82 | /* | |
83 | * The following structure defines a variable trace, which is used to | |
84 | * invoke a specific C procedure whenever certain operations are performed | |
85 | * on a variable. | |
86 | */ | |
87 | ||
88 | typedef struct VarTrace { | |
89 | Tcl_VarTraceProc *traceProc;/* Procedure to call when operations given | |
90 | * by flags are performed on variable. */ | |
91 | ClientData clientData; /* Argument to pass to proc. */ | |
92 | int flags; /* What events the trace procedure is | |
93 | * interested in: OR-ed combination of | |
94 | * TCL_TRACE_READS, TCL_TRACE_WRITES, and | |
95 | * TCL_TRACE_UNSETS. */ | |
96 | struct VarTrace *nextPtr; /* Next in list of traces associated with | |
97 | * a particular variable. */ | |
98 | } VarTrace; | |
99 | ||
100 | /* | |
101 | * When a variable trace is active (i.e. its associated procedure is | |
102 | * executing), one of the following structures is linked into a list | |
103 | * associated with the variable's interpreter. The information in | |
104 | * the structure is needed in order for Tcl to behave reasonably | |
105 | * if traces are deleted while traces are active. | |
106 | */ | |
107 | ||
108 | typedef struct ActiveVarTrace { | |
109 | struct ActiveVarTrace *nextPtr; | |
110 | /* Next in list of all active variable | |
111 | * traces for the interpreter, or NULL | |
112 | * if no more. */ | |
113 | VarTrace *nextTracePtr; /* Next trace to check after current | |
114 | * trace procedure returns; if this | |
115 | * trace gets deleted, must update pointer | |
116 | * to avoid using free'd memory. */ | |
117 | } ActiveVarTrace; | |
118 | ||
119 | /* | |
120 | * The following structure describes an enumerative search in progress on | |
121 | * an array variable; this are invoked with options to the "array" | |
122 | * command. | |
123 | */ | |
124 | ||
125 | typedef struct ArraySearch { | |
126 | int id; /* Integer id used to distinguish among | |
127 | * multiple concurrent searches for the | |
128 | * same array. */ | |
129 | struct Var *varPtr; /* Pointer to array variable that's being | |
130 | * searched. */ | |
131 | Tcl_HashSearch search; /* Info kept by the hash module about | |
132 | * progress through the array. */ | |
133 | Tcl_HashEntry *nextEntry; /* Non-null means this is the next element | |
134 | * to be enumerated (it's leftover from | |
135 | * the Tcl_FirstHashEntry call or from | |
136 | * an "array anymore" command). NULL | |
137 | * means must call Tcl_NextHashEntry | |
138 | * to get value to return. */ | |
139 | struct ArraySearch *nextPtr;/* Next in list of all active searches | |
140 | * for this variable, or NULL if this is | |
141 | * the last one. */ | |
142 | } ArraySearch; | |
143 | ||
144 | /* | |
145 | * The structure below defines a variable, which associates a string name | |
146 | * with a string value. Pointers to these structures are kept as the | |
147 | * values of hash table entries, and the name of each variable is stored | |
148 | * in the hash entry. | |
149 | */ | |
150 | ||
151 | typedef struct Var { | |
152 | int valueLength; /* Holds the number of non-null bytes | |
153 | * actually occupied by the variable's | |
154 | * current value in value.string (extra | |
155 | * space is sometimes left for expansion). | |
156 | * For array and global variables this is | |
157 | * meaningless. */ | |
158 | int valueSpace; /* Total number of bytes of space allocated | |
159 | * at value. */ | |
160 | int upvarUses; /* Counts number of times variable is | |
161 | * is referenced via global or upvar variables | |
162 | * (i.e. how many variables have "upvarPtr" | |
163 | * pointing to this variable). Variable | |
164 | * can't be deleted until this count reaches | |
165 | * 0. */ | |
166 | VarTrace *tracePtr; /* First in list of all traces set for this | |
167 | * variable. */ | |
168 | ArraySearch *searchPtr; /* First in list of all searches active | |
169 | * for this variable, or NULL if none. */ | |
170 | int flags; /* Miscellaneous bits of information about | |
171 | * variable. See below for definitions. */ | |
172 | union { | |
173 | char string[4]; /* String value of variable. The actual | |
174 | * length of this field is given by the | |
175 | * valueSpace field above. */ | |
176 | Tcl_HashTable *tablePtr;/* For array variables, this points to | |
177 | * information about the hash table used | |
178 | * to implement the associative array. | |
179 | * Points to malloc-ed data. */ | |
180 | Tcl_HashEntry *upvarPtr; | |
181 | /* If this is a global variable being | |
182 | * referred to in a procedure, or a variable | |
183 | * created by "upvar", this field points to | |
184 | * the hash table entry for the higher-level | |
185 | * variable. */ | |
186 | } value; /* MUST BE LAST FIELD IN STRUCTURE!!! */ | |
187 | } Var; | |
188 | ||
189 | /* | |
190 | * Flag bits for variables: | |
191 | * | |
192 | * VAR_ARRAY - 1 means this is an array variable rather | |
193 | * than a scalar variable. | |
194 | * VAR_UPVAR - 1 means this variable just contains a | |
195 | * pointer to another variable that has the | |
196 | * real value. Variables like this come | |
197 | * about through the "upvar" and "global" | |
198 | * commands. | |
199 | * VAR_UNDEFINED - 1 means that the variable is currently | |
200 | * undefined. Undefined variables usually | |
201 | * go away completely, but if an undefined | |
202 | * variable has a trace on it, or if it is | |
203 | * a global variable being used by a procedure, | |
204 | * then it stays around even when undefined. | |
205 | * VAR_ELEMENT_ACTIVE - Used only in array variables; 1 means that | |
206 | * an element of the array is currently being | |
207 | * manipulated in some way, so that it isn't | |
208 | * safe to delete the whole array. | |
209 | * VAR_TRACE_ACTIVE - 1 means that trace processing is currently | |
210 | * underway for a read or write access, so | |
211 | * new read or write accesses should not cause | |
212 | * trace procedures to be called and the | |
213 | * variable can't be deleted. | |
214 | */ | |
215 | ||
216 | #define VAR_ARRAY 1 | |
217 | #define VAR_UPVAR 2 | |
218 | #define VAR_UNDEFINED 4 | |
219 | #define VAR_ELEMENT_ACTIVE 0x10 | |
220 | #define VAR_TRACE_ACTIVE 0x20 | |
221 | #define VAR_SEARCHES_POSSIBLE 0x40 | |
222 | ||
223 | /* | |
224 | *---------------------------------------------------------------- | |
225 | * Data structures related to procedures. These are used primarily | |
226 | * in tclProc.c | |
227 | *---------------------------------------------------------------- | |
228 | */ | |
229 | ||
230 | /* | |
231 | * The structure below defines an argument to a procedure, which | |
232 | * consists of a name and an (optional) default value. | |
233 | */ | |
234 | ||
235 | typedef struct Arg { | |
236 | struct Arg *nextPtr; /* Next argument for this procedure, | |
237 | * or NULL if this is the last argument. */ | |
238 | char *defValue; /* Pointer to arg's default value, or NULL | |
239 | * if no default value. */ | |
240 | char name[4]; /* Name of argument starts here. The name | |
241 | * is followed by space for the default, | |
242 | * if there is one. The actual size of this | |
243 | * field will be as large as necessary to | |
244 | * hold both name and default value. THIS | |
245 | * MUST BE THE LAST FIELD IN THE STRUCTURE!! */ | |
246 | } Arg; | |
247 | ||
248 | /* | |
249 | * The structure below defines a command procedure, which consists of | |
250 | * a collection of Tcl commands plus information about arguments and | |
251 | * variables. | |
252 | */ | |
253 | ||
254 | typedef struct Proc { | |
255 | struct Interp *iPtr; /* Interpreter for which this command | |
256 | * is defined. */ | |
257 | char *command; /* Command that constitutes the body of | |
258 | * the procedure (dynamically allocated). */ | |
259 | Arg *argPtr; /* Pointer to first of procedure's formal | |
260 | * arguments, or NULL if none. */ | |
261 | } Proc; | |
262 | ||
263 | /* | |
264 | * The structure below defines a command trace. This is used to allow Tcl | |
265 | * clients to find out whenever a command is about to be executed. | |
266 | */ | |
267 | ||
268 | typedef struct Trace { | |
269 | int level; /* Only trace commands at nesting level | |
270 | * less than or equal to this. */ | |
271 | Tcl_CmdTraceProc *proc; /* Procedure to call to trace command. */ | |
272 | ClientData clientData; /* Arbitrary value to pass to proc. */ | |
273 | struct Trace *nextPtr; /* Next in list of traces for this interp. */ | |
274 | } Trace; | |
275 | ||
276 | /* | |
277 | * The structure below defines a frame, which is a procedure invocation. | |
278 | * These structures exist only while procedures are being executed, and | |
279 | * provide a sort of call stack. | |
280 | */ | |
281 | ||
282 | typedef struct CallFrame { | |
283 | Tcl_HashTable varTable; /* Hash table containing all of procedure's | |
284 | * local variables. */ | |
285 | int level; /* Level of this procedure, for "uplevel" | |
286 | * purposes (i.e. corresponds to nesting of | |
287 | * callerVarPtr's, not callerPtr's). 1 means | |
288 | * outer-most procedure, 0 means top-level. */ | |
289 | int argc; /* This and argv below describe name and | |
290 | * arguments for this procedure invocation. */ | |
291 | char **argv; /* Array of arguments. */ | |
292 | struct CallFrame *callerPtr; | |
293 | /* Value of interp->framePtr when this | |
294 | * procedure was invoked (i.e. next in | |
295 | * stack of all active procedures). */ | |
296 | struct CallFrame *callerVarPtr; | |
297 | /* Value of interp->varFramePtr when this | |
298 | * procedure was invoked (i.e. determines | |
299 | * variable scoping within caller; same | |
300 | * as callerPtr unless an "uplevel" command | |
301 | * or something equivalent was active in | |
302 | * the caller). */ | |
303 | } CallFrame; | |
304 | ||
305 | /* | |
306 | * The structure below defines one history event (a previously-executed | |
307 | * command that can be re-executed in whole or in part). | |
308 | */ | |
309 | ||
310 | typedef struct { | |
311 | char *command; /* String containing previously-executed | |
312 | * command. */ | |
313 | int bytesAvl; /* Total # of bytes available at *event (not | |
314 | * all are necessarily in use now). */ | |
315 | } HistoryEvent; | |
316 | ||
317 | /* | |
318 | *---------------------------------------------------------------- | |
319 | * Data structures related to history. These are used primarily | |
320 | * in tclHistory.c | |
321 | *---------------------------------------------------------------- | |
322 | */ | |
323 | ||
324 | /* | |
325 | * The structure below defines a pending revision to the most recent | |
326 | * history event. Changes are linked together into a list and applied | |
327 | * during the next call to Tcl_RecordHistory. See the comments at the | |
328 | * beginning of tclHistory.c for information on revisions. | |
329 | */ | |
330 | ||
331 | typedef struct HistoryRev { | |
332 | int firstIndex; /* Index of the first byte to replace in | |
333 | * current history event. */ | |
334 | int lastIndex; /* Index of last byte to replace in | |
335 | * current history event. */ | |
336 | int newSize; /* Number of bytes in newBytes. */ | |
337 | char *newBytes; /* Replacement for the range given by | |
338 | * firstIndex and lastIndex. */ | |
339 | struct HistoryRev *nextPtr; /* Next in chain of revisions to apply, or | |
340 | * NULL for end of list. */ | |
341 | } HistoryRev; | |
342 | ||
343 | /* | |
344 | *---------------------------------------------------------------- | |
345 | * Data structures related to files. These are used primarily in | |
346 | * tclUnixUtil.c and tclUnixAZ.c. | |
347 | *---------------------------------------------------------------- | |
348 | */ | |
349 | ||
350 | /* | |
351 | * The data structure below defines an open file (or connection to | |
352 | * a process pipeline) as returned by the "open" command. | |
353 | */ | |
354 | ||
355 | typedef struct OpenFile { | |
356 | FILE *f; /* Stdio file to use for reading and/or | |
357 | * writing. */ | |
358 | FILE *f2; /* Normally NULL. In the special case of | |
359 | * a command pipeline with pipes for both | |
360 | * input and output, this is a stdio file | |
361 | * to use for writing to the pipeline. */ | |
362 | int readable; /* Non-zero means file may be read. */ | |
363 | int writable; /* Non-zero means file may be written. */ | |
364 | int numPids; /* If this is a connection to a process | |
365 | * pipeline, gives number of processes | |
366 | * in pidPtr array below; otherwise it | |
367 | * is 0. */ | |
368 | int *pidPtr; /* Pointer to malloc-ed array of child | |
369 | * process ids (numPids of them), or NULL | |
370 | * if this isn't a connection to a process | |
371 | * pipeline. */ | |
372 | int errorId; /* File id of file that receives error | |
373 | * output from pipeline. -1 means not | |
374 | * used (i.e. this is a normal file). */ | |
375 | } OpenFile; | |
376 | ||
377 | /* | |
378 | *---------------------------------------------------------------- | |
379 | * This structure defines an interpreter, which is a collection of | |
380 | * commands plus other state information related to interpreting | |
381 | * commands, such as variable storage. Primary responsibility for | |
382 | * this data structure is in tclBasic.c, but almost every Tcl | |
383 | * source file uses something in here. | |
384 | *---------------------------------------------------------------- | |
385 | */ | |
386 | ||
387 | typedef struct Command { | |
388 | Tcl_CmdProc *proc; /* Procedure to process command. */ | |
389 | ClientData clientData; /* Arbitrary value to pass to proc. */ | |
390 | Tcl_CmdDeleteProc *deleteProc; | |
391 | /* Procedure to invoke when deleting | |
392 | * command. */ | |
393 | } Command; | |
394 | ||
395 | #define CMD_SIZE(nameLength) ((unsigned) sizeof(Command) + nameLength - 3) | |
396 | ||
397 | typedef struct Interp { | |
398 | ||
399 | /* | |
400 | * Note: the first three fields must match exactly the fields in | |
401 | * a Tcl_Interp struct (see tcl.h). If you change one, be sure to | |
402 | * change the other. | |
403 | */ | |
404 | ||
405 | char *result; /* Points to result returned by last | |
406 | * command. */ | |
407 | Tcl_FreeProc *freeProc; /* Zero means result is statically allocated. | |
408 | * If non-zero, gives address of procedure | |
409 | * to invoke to free the result. Must be | |
410 | * freed by Tcl_Eval before executing next | |
411 | * command. */ | |
412 | int errorLine; /* When TCL_ERROR is returned, this gives | |
413 | * the line number within the command where | |
414 | * the error occurred (1 means first line). */ | |
415 | Tcl_HashTable commandTable; /* Contains all of the commands currently | |
416 | * registered in this interpreter. Indexed | |
417 | * by strings; values have type (Command *). */ | |
418 | ||
419 | /* | |
420 | * Information related to procedures and variables. See tclProc.c | |
421 | * and tclvar.c for usage. | |
422 | */ | |
423 | ||
424 | Tcl_HashTable globalTable; /* Contains all global variables for | |
425 | * interpreter. */ | |
426 | int numLevels; /* Keeps track of how many nested calls to | |
427 | * Tcl_Eval are in progress for this | |
428 | * interpreter. It's used to delay deletion | |
429 | * of the table until all Tcl_Eval invocations | |
430 | * are completed. */ | |
431 | CallFrame *framePtr; /* Points to top-most in stack of all nested | |
432 | * procedure invocations. NULL means there | |
433 | * are no active procedures. */ | |
434 | CallFrame *varFramePtr; /* Points to the call frame whose variables | |
435 | * are currently in use (same as framePtr | |
436 | * unless an "uplevel" command is being | |
437 | * executed). NULL means no procedure is | |
438 | * active or "uplevel 0" is being exec'ed. */ | |
439 | ActiveVarTrace *activeTracePtr; | |
440 | /* First in list of active traces for interp, | |
441 | * or NULL if no active traces. */ | |
442 | ||
443 | /* | |
444 | * Information related to history: | |
445 | */ | |
446 | ||
447 | int numEvents; /* Number of previously-executed commands | |
448 | * to retain. */ | |
449 | HistoryEvent *events; /* Array containing numEvents entries | |
450 | * (dynamically allocated). */ | |
451 | int curEvent; /* Index into events of place where current | |
452 | * (or most recent) command is recorded. */ | |
453 | int curEventNum; /* Event number associated with the slot | |
454 | * given by curEvent. */ | |
455 | HistoryRev *revPtr; /* First in list of pending revisions. */ | |
456 | char *historyFirst; /* First char. of current command executed | |
457 | * from history module or NULL if none. */ | |
458 | int revDisables; /* 0 means history revision OK; > 0 gives | |
459 | * a count of number of times revision has | |
460 | * been disabled. */ | |
461 | char *evalFirst; /* If TCL_RECORD_BOUNDS flag set, Tcl_Eval | |
462 | * sets this field to point to the first | |
463 | * char. of text from which the current | |
464 | * command came. Otherwise Tcl_Eval sets | |
465 | * this to NULL. */ | |
466 | char *evalLast; /* Similar to evalFirst, except points to | |
467 | * last character of current command. */ | |
468 | ||
469 | /* | |
470 | * Information used by Tcl_AppendResult to keep track of partial | |
471 | * results. See Tcl_AppendResult code for details. | |
472 | */ | |
473 | ||
474 | char *appendResult; /* Storage space for results generated | |
475 | * by Tcl_AppendResult. Malloc-ed. NULL | |
476 | * means not yet allocated. */ | |
477 | int appendAvl; /* Total amount of space available at | |
478 | * partialResult. */ | |
479 | int appendUsed; /* Number of non-null bytes currently | |
480 | * stored at partialResult. */ | |
481 | ||
482 | /* | |
483 | * Information related to files. See tclUnixAZ.c and tclUnixUtil.c | |
484 | * for details. | |
485 | */ | |
486 | ||
487 | int numFiles; /* Number of entries in filePtrArray | |
488 | * below. 0 means array hasn't been | |
489 | * created yet. */ | |
490 | OpenFile **filePtrArray; /* Pointer to malloc-ed array of pointers | |
491 | * to information about open files. Entry | |
492 | * N corresponds to the file with fileno N. | |
493 | * If an entry is NULL then the corresponding | |
494 | * file isn't open. If filePtrArray is NULL | |
495 | * it means no files have been used, so even | |
496 | * stdin/stdout/stderr entries haven't been | |
497 | * setup yet. */ | |
498 | /* | |
499 | * A cache of compiled regular expressions. See TclCompileRegexp | |
500 | * in tclUtil.c for details. | |
501 | */ | |
502 | ||
503 | #define NUM_REGEXPS 5 | |
504 | char *patterns[NUM_REGEXPS];/* Strings corresponding to compiled | |
505 | * regular expression patterns. NULL | |
506 | * means that this slot isn't used. | |
507 | * Malloc-ed. */ | |
508 | int patLengths[NUM_REGEXPS];/* Number of non-null characters in | |
509 | * corresponding entry in patterns. | |
510 | * -1 means entry isn't used. */ | |
511 | regexp *regexps[NUM_REGEXPS]; | |
512 | /* Compiled forms of above strings. Also | |
513 | * malloc-ed, or NULL if not in use yet. */ | |
514 | ||
515 | ||
516 | /* | |
517 | * Miscellaneous information: | |
518 | */ | |
519 | ||
520 | int cmdCount; /* Total number of times a command procedure | |
521 | * has been called for this interpreter. */ | |
522 | int noEval; /* Non-zero means no commands should actually | |
523 | * be executed: just parse only. Used in | |
524 | * expressions when the result is already | |
525 | * determined. */ | |
526 | char *scriptFile; /* NULL means there is no nested source | |
527 | * command active; otherwise this points to | |
528 | * the name of the file being sourced (it's | |
529 | * not malloc-ed: it points to an argument | |
530 | * to Tcl_EvalFile. */ | |
531 | int flags; /* Various flag bits. See below. */ | |
532 | Trace *tracePtr; /* List of traces for this interpreter. */ | |
533 | char resultSpace[TCL_RESULT_SIZE+1]; | |
534 | /* Static space for storing small results. */ | |
535 | } Interp; | |
536 | ||
537 | /* | |
538 | * Flag bits for Interp structures: | |
539 | * | |
540 | * DELETED: Non-zero means the interpreter has been deleted: | |
541 | * don't process any more commands for it, and destroy | |
542 | * the structure as soon as all nested invocations of | |
543 | * Tcl_Eval are done. | |
544 | * ERR_IN_PROGRESS: Non-zero means an error unwind is already in progress. | |
545 | * Zero means a command proc has been invoked since last | |
546 | * error occured. | |
547 | * ERR_ALREADY_LOGGED: Non-zero means information has already been logged | |
548 | * in $errorInfo for the current Tcl_Eval instance, | |
549 | * so Tcl_Eval needn't log it (used to implement the | |
550 | * "error message log" command). | |
551 | * ERROR_CODE_SET: Non-zero means that Tcl_SetErrorCode has been | |
552 | * called to record information for the current | |
553 | * error. Zero means Tcl_Eval must clear the | |
554 | * errorCode variable if an error is returned. | |
555 | */ | |
556 | ||
557 | #define DELETED 1 | |
558 | #define ERR_IN_PROGRESS 2 | |
559 | #define ERR_ALREADY_LOGGED 4 | |
560 | #define ERROR_CODE_SET 8 | |
561 | ||
562 | /* | |
563 | *---------------------------------------------------------------- | |
564 | * Data structures related to command parsing. These are used in | |
565 | * tclParse.c and its clients. | |
566 | *---------------------------------------------------------------- | |
567 | */ | |
568 | ||
569 | /* | |
570 | * The following data structure is used by various parsing procedures | |
571 | * to hold information about where to store the results of parsing | |
572 | * (e.g. the substituted contents of a quoted argument, or the result | |
573 | * of a nested command). At any given time, the space available | |
574 | * for output is fixed, but a procedure may be called to expand the | |
575 | * space available if the current space runs out. | |
576 | */ | |
577 | ||
578 | typedef struct ParseValue { | |
579 | char *buffer; /* Address of first character in | |
580 | * output buffer. */ | |
581 | char *next; /* Place to store next character in | |
582 | * output buffer. */ | |
583 | char *end; /* Address of the last usable character | |
584 | * in the buffer. */ | |
585 | void (*expandProc) _ANSI_ARGS_((struct ParseValue *pvPtr, int needed)); | |
586 | /* Procedure to call when space runs out; | |
587 | * it will make more space. */ | |
588 | ClientData clientData; /* Arbitrary information for use of | |
589 | * expandProc. */ | |
590 | } ParseValue; | |
591 | ||
592 | /* | |
593 | * A table used to classify input characters to assist in parsing | |
594 | * Tcl commands. The table should be indexed with a signed character | |
595 | * using the CHAR_TYPE macro. The character may have a negative | |
596 | * value. | |
597 | */ | |
598 | ||
599 | extern char tclTypeTable[]; | |
600 | #define CHAR_TYPE(c) (tclTypeTable+128)[c] | |
601 | ||
602 | /* | |
603 | * Possible values returned by CHAR_TYPE: | |
604 | * | |
605 | * TCL_NORMAL - All characters that don't have special significance | |
606 | * to the Tcl language. | |
607 | * TCL_SPACE - Character is space, tab, or return. | |
608 | * TCL_COMMAND_END - Character is newline or null or semicolon or | |
609 | * close-bracket. | |
610 | * TCL_QUOTE - Character is a double-quote. | |
611 | * TCL_OPEN_BRACKET - Character is a "[". | |
612 | * TCL_OPEN_BRACE - Character is a "{". | |
613 | * TCL_CLOSE_BRACE - Character is a "}". | |
614 | * TCL_BACKSLASH - Character is a "\". | |
615 | * TCL_DOLLAR - Character is a "$". | |
616 | */ | |
617 | ||
618 | #define TCL_NORMAL 0 | |
619 | #define TCL_SPACE 1 | |
620 | #define TCL_COMMAND_END 2 | |
621 | #define TCL_QUOTE 3 | |
622 | #define TCL_OPEN_BRACKET 4 | |
623 | #define TCL_OPEN_BRACE 5 | |
624 | #define TCL_CLOSE_BRACE 6 | |
625 | #define TCL_BACKSLASH 7 | |
626 | #define TCL_DOLLAR 8 | |
627 | ||
628 | /* | |
629 | * Additional flags passed to Tcl_Eval. See tcl.h for other flags to | |
630 | * Tcl_Eval; these ones are only used internally by Tcl. | |
631 | * | |
632 | * TCL_RECORD_BOUNDS Tells Tcl_Eval to record information in the | |
633 | * evalFirst and evalLast fields for each command | |
634 | * executed directly from the string (top-level | |
635 | * commands and those from command substitution). | |
636 | */ | |
637 | ||
638 | #define TCL_RECORD_BOUNDS 0x100 | |
639 | ||
640 | /* | |
641 | * Maximum number of levels of nesting permitted in Tcl commands. | |
642 | */ | |
643 | ||
644 | #define MAX_NESTING_DEPTH 100 | |
645 | ||
646 | /* | |
647 | * Variables shared among Tcl modules but not used by the outside | |
648 | * world: | |
649 | */ | |
650 | ||
651 | extern char * tclRegexpError; | |
652 | ||
653 | /* | |
654 | *---------------------------------------------------------------- | |
655 | * Procedures shared among Tcl modules but not used by the outside | |
656 | * world: | |
657 | *---------------------------------------------------------------- | |
658 | */ | |
659 | ||
660 | extern void panic(); | |
661 | extern regexp * TclCompileRegexp _ANSI_ARGS_((Tcl_Interp *interp, | |
662 | char *string)); | |
663 | extern void TclCopyAndCollapse _ANSI_ARGS_((int count, char *src, | |
664 | char *dst)); | |
665 | extern void TclDeleteVars _ANSI_ARGS_((Interp *iPtr, | |
666 | Tcl_HashTable *tablePtr)); | |
667 | extern void TclExpandParseValue _ANSI_ARGS_((ParseValue *pvPtr, | |
668 | int needed)); | |
669 | extern int TclFindElement _ANSI_ARGS_((Tcl_Interp *interp, | |
670 | char *list, char **elementPtr, char **nextPtr, | |
671 | int *sizePtr, int *bracePtr)); | |
672 | extern Proc * TclFindProc _ANSI_ARGS_((Interp *iPtr, | |
673 | char *procName)); | |
674 | extern int TclGetFrame _ANSI_ARGS_((Tcl_Interp *interp, | |
675 | char *string, CallFrame **framePtrPtr)); | |
676 | extern int TclGetListIndex _ANSI_ARGS_((Tcl_Interp *interp, | |
677 | char *string, int *indexPtr)); | |
678 | extern int TclGetOpenFile _ANSI_ARGS_((Tcl_Interp *interp, | |
679 | char *string, OpenFile **filePtrPtr)); | |
680 | extern Proc * TclIsProc _ANSI_ARGS_((Command *cmdPtr)); | |
681 | extern void TclMakeFileTable _ANSI_ARGS_((Interp *iPtr, | |
682 | int index)); | |
683 | extern int TclParseBraces _ANSI_ARGS_((Tcl_Interp *interp, | |
684 | char *string, char **termPtr, ParseValue *pvPtr)); | |
685 | extern int TclParseNestedCmd _ANSI_ARGS_((Tcl_Interp *interp, | |
686 | char *string, int flags, char **termPtr, | |
687 | ParseValue *pvPtr)); | |
688 | extern int TclParseQuotes _ANSI_ARGS_((Tcl_Interp *interp, | |
689 | char *string, int termChar, int flags, | |
690 | char **termPtr, ParseValue *pvPtr)); | |
691 | extern int TclParseWords _ANSI_ARGS_((Tcl_Interp *interp, | |
692 | char *string, int flags, int maxWords, | |
693 | char **termPtr, int *argcPtr, char **argv, | |
694 | ParseValue *pvPtr)); | |
695 | extern void TclSetupEnv _ANSI_ARGS_((Tcl_Interp *interp)); | |
696 | extern char * TclWordEnd _ANSI_ARGS_((char *start, int nested)); | |
697 | ||
698 | /* | |
699 | *---------------------------------------------------------------- | |
700 | * Command procedures in the generic core: | |
701 | *---------------------------------------------------------------- | |
702 | */ | |
703 | ||
704 | extern int Tcl_AppendCmd _ANSI_ARGS_((ClientData clientData, | |
705 | Tcl_Interp *interp, int argc, char **argv)); | |
706 | extern int Tcl_ArrayCmd _ANSI_ARGS_((ClientData clientData, | |
707 | Tcl_Interp *interp, int argc, char **argv)); | |
708 | extern int Tcl_BreakCmd _ANSI_ARGS_((ClientData clientData, | |
709 | Tcl_Interp *interp, int argc, char **argv)); | |
710 | extern int Tcl_CaseCmd _ANSI_ARGS_((ClientData clientData, | |
711 | Tcl_Interp *interp, int argc, char **argv)); | |
712 | extern int Tcl_CatchCmd _ANSI_ARGS_((ClientData clientData, | |
713 | Tcl_Interp *interp, int argc, char **argv)); | |
714 | extern int Tcl_ConcatCmd _ANSI_ARGS_((ClientData clientData, | |
715 | Tcl_Interp *interp, int argc, char **argv)); | |
716 | extern int Tcl_ContinueCmd _ANSI_ARGS_((ClientData clientData, | |
717 | Tcl_Interp *interp, int argc, char **argv)); | |
718 | extern int Tcl_ErrorCmd _ANSI_ARGS_((ClientData clientData, | |
719 | Tcl_Interp *interp, int argc, char **argv)); | |
720 | extern int Tcl_EvalCmd _ANSI_ARGS_((ClientData clientData, | |
721 | Tcl_Interp *interp, int argc, char **argv)); | |
722 | extern int Tcl_ExprCmd _ANSI_ARGS_((ClientData clientData, | |
723 | Tcl_Interp *interp, int argc, char **argv)); | |
724 | extern int Tcl_ForCmd _ANSI_ARGS_((ClientData clientData, | |
725 | Tcl_Interp *interp, int argc, char **argv)); | |
726 | extern int Tcl_ForeachCmd _ANSI_ARGS_((ClientData clientData, | |
727 | Tcl_Interp *interp, int argc, char **argv)); | |
728 | extern int Tcl_FormatCmd _ANSI_ARGS_((ClientData clientData, | |
729 | Tcl_Interp *interp, int argc, char **argv)); | |
730 | extern int Tcl_GlobalCmd _ANSI_ARGS_((ClientData clientData, | |
731 | Tcl_Interp *interp, int argc, char **argv)); | |
732 | extern int Tcl_HistoryCmd _ANSI_ARGS_((ClientData clientData, | |
733 | Tcl_Interp *interp, int argc, char **argv)); | |
734 | extern int Tcl_IfCmd _ANSI_ARGS_((ClientData clientData, | |
735 | Tcl_Interp *interp, int argc, char **argv)); | |
736 | extern int Tcl_IncrCmd _ANSI_ARGS_((ClientData clientData, | |
737 | Tcl_Interp *interp, int argc, char **argv)); | |
738 | extern int Tcl_InfoCmd _ANSI_ARGS_((ClientData clientData, | |
739 | Tcl_Interp *interp, int argc, char **argv)); | |
740 | extern int Tcl_JoinCmd _ANSI_ARGS_((ClientData clientData, | |
741 | Tcl_Interp *interp, int argc, char **argv)); | |
742 | extern int Tcl_LappendCmd _ANSI_ARGS_((ClientData clientData, | |
743 | Tcl_Interp *interp, int argc, char **argv)); | |
744 | extern int Tcl_LindexCmd _ANSI_ARGS_((ClientData clientData, | |
745 | Tcl_Interp *interp, int argc, char **argv)); | |
746 | extern int Tcl_LinsertCmd _ANSI_ARGS_((ClientData clientData, | |
747 | Tcl_Interp *interp, int argc, char **argv)); | |
748 | extern int Tcl_LlengthCmd _ANSI_ARGS_((ClientData clientData, | |
749 | Tcl_Interp *interp, int argc, char **argv)); | |
750 | extern int Tcl_ListCmd _ANSI_ARGS_((ClientData clientData, | |
751 | Tcl_Interp *interp, int argc, char **argv)); | |
752 | extern int Tcl_LrangeCmd _ANSI_ARGS_((ClientData clientData, | |
753 | Tcl_Interp *interp, int argc, char **argv)); | |
754 | extern int Tcl_LreplaceCmd _ANSI_ARGS_((ClientData clientData, | |
755 | Tcl_Interp *interp, int argc, char **argv)); | |
756 | extern int Tcl_LsearchCmd _ANSI_ARGS_((ClientData clientData, | |
757 | Tcl_Interp *interp, int argc, char **argv)); | |
758 | extern int Tcl_LsortCmd _ANSI_ARGS_((ClientData clientData, | |
759 | Tcl_Interp *interp, int argc, char **argv)); | |
760 | extern int Tcl_ProcCmd _ANSI_ARGS_((ClientData clientData, | |
761 | Tcl_Interp *interp, int argc, char **argv)); | |
762 | extern int Tcl_RegexpCmd _ANSI_ARGS_((ClientData clientData, | |
763 | Tcl_Interp *interp, int argc, char **argv)); | |
764 | extern int Tcl_RegsubCmd _ANSI_ARGS_((ClientData clientData, | |
765 | Tcl_Interp *interp, int argc, char **argv)); | |
766 | extern int Tcl_RenameCmd _ANSI_ARGS_((ClientData clientData, | |
767 | Tcl_Interp *interp, int argc, char **argv)); | |
768 | extern int Tcl_ReturnCmd _ANSI_ARGS_((ClientData clientData, | |
769 | Tcl_Interp *interp, int argc, char **argv)); | |
770 | extern int Tcl_ScanCmd _ANSI_ARGS_((ClientData clientData, | |
771 | Tcl_Interp *interp, int argc, char **argv)); | |
772 | extern int Tcl_SetCmd _ANSI_ARGS_((ClientData clientData, | |
773 | Tcl_Interp *interp, int argc, char **argv)); | |
774 | extern int Tcl_SplitCmd _ANSI_ARGS_((ClientData clientData, | |
775 | Tcl_Interp *interp, int argc, char **argv)); | |
776 | extern int Tcl_StringCmd _ANSI_ARGS_((ClientData clientData, | |
777 | Tcl_Interp *interp, int argc, char **argv)); | |
778 | extern int Tcl_TraceCmd _ANSI_ARGS_((ClientData clientData, | |
779 | Tcl_Interp *interp, int argc, char **argv)); | |
780 | extern int Tcl_UnsetCmd _ANSI_ARGS_((ClientData clientData, | |
781 | Tcl_Interp *interp, int argc, char **argv)); | |
782 | extern int Tcl_UplevelCmd _ANSI_ARGS_((ClientData clientData, | |
783 | Tcl_Interp *interp, int argc, char **argv)); | |
784 | extern int Tcl_UpvarCmd _ANSI_ARGS_((ClientData clientData, | |
785 | Tcl_Interp *interp, int argc, char **argv)); | |
786 | extern int Tcl_WhileCmd _ANSI_ARGS_((ClientData clientData, | |
787 | Tcl_Interp *interp, int argc, char **argv)); | |
788 | extern int Tcl_Cmd _ANSI_ARGS_((ClientData clientData, | |
789 | Tcl_Interp *interp, int argc, char **argv)); | |
790 | extern int Tcl_Cmd _ANSI_ARGS_((ClientData clientData, | |
791 | Tcl_Interp *interp, int argc, char **argv)); | |
792 | ||
793 | /* | |
794 | *---------------------------------------------------------------- | |
795 | * Command procedures in the UNIX core: | |
796 | *---------------------------------------------------------------- | |
797 | */ | |
798 | ||
799 | extern int Tcl_CdCmd _ANSI_ARGS_((ClientData clientData, | |
800 | Tcl_Interp *interp, int argc, char **argv)); | |
801 | extern int Tcl_CloseCmd _ANSI_ARGS_((ClientData clientData, | |
802 | Tcl_Interp *interp, int argc, char **argv)); | |
803 | extern int Tcl_EofCmd _ANSI_ARGS_((ClientData clientData, | |
804 | Tcl_Interp *interp, int argc, char **argv)); | |
805 | extern int Tcl_ExecCmd _ANSI_ARGS_((ClientData clientData, | |
806 | Tcl_Interp *interp, int argc, char **argv)); | |
807 | extern int Tcl_ExitCmd _ANSI_ARGS_((ClientData clientData, | |
808 | Tcl_Interp *interp, int argc, char **argv)); | |
809 | extern int Tcl_FileCmd _ANSI_ARGS_((ClientData clientData, | |
810 | Tcl_Interp *interp, int argc, char **argv)); | |
811 | extern int Tcl_FlushCmd _ANSI_ARGS_((ClientData clientData, | |
812 | Tcl_Interp *interp, int argc, char **argv)); | |
813 | extern int Tcl_GetsCmd _ANSI_ARGS_((ClientData clientData, | |
814 | Tcl_Interp *interp, int argc, char **argv)); | |
815 | extern int Tcl_GlobCmd _ANSI_ARGS_((ClientData clientData, | |
816 | Tcl_Interp *interp, int argc, char **argv)); | |
817 | extern int Tcl_OpenCmd _ANSI_ARGS_((ClientData clientData, | |
818 | Tcl_Interp *interp, int argc, char **argv)); | |
819 | extern int Tcl_PutsCmd _ANSI_ARGS_((ClientData clientData, | |
820 | Tcl_Interp *interp, int argc, char **argv)); | |
821 | extern int Tcl_PwdCmd _ANSI_ARGS_((ClientData clientData, | |
822 | Tcl_Interp *interp, int argc, char **argv)); | |
823 | extern int Tcl_ReadCmd _ANSI_ARGS_((ClientData clientData, | |
824 | Tcl_Interp *interp, int argc, char **argv)); | |
825 | extern int Tcl_SeekCmd _ANSI_ARGS_((ClientData clientData, | |
826 | Tcl_Interp *interp, int argc, char **argv)); | |
827 | extern int Tcl_SourceCmd _ANSI_ARGS_((ClientData clientData, | |
828 | Tcl_Interp *interp, int argc, char **argv)); | |
829 | extern int Tcl_TellCmd _ANSI_ARGS_((ClientData clientData, | |
830 | Tcl_Interp *interp, int argc, char **argv)); | |
831 | extern int Tcl_TimeCmd _ANSI_ARGS_((ClientData clientData, | |
832 | Tcl_Interp *interp, int argc, char **argv)); | |
833 | ||
834 | #endif /* _TCLINT */ |