|
|
1.1 ! root 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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.