root/tclInt.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. Command
  2. Var
  3. Proc
  4. Trace
  5. InterpCallback
  6. CallFrame
  7. Interp

/*
 * tclInt.h --
 *
 *      Declarations of things used internally by the Tcl interpreter.
 *
 * Copyright 1987 Regents of the University of California
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 *
 * $Header: /sprite/src/lib/tcl/RCS/tclInt.h,v 1.19 90/01/27 14:40:46 ouster Exp $ SPRITE (Berkeley)
 */

#ifndef _TCLINT
#define _TCLINT

#ifndef _TCL
#include "tcl.h"
#endif

/*
 * The structure below defines one Tcl command, by associating a procedure
 * with a textual string.
 */

typedef struct Command {
    int (*proc)();              /* Procedure to process command. */
    ClientData clientData;      /* Arbitrary value to pass to proc. */
    void (*deleteProc)();       /* Procedure to invoke when deleting
                                 * command. */
    struct Command *nextPtr;    /* Pointer to next command in list, or NULL
                                 * for end of list. */
    char name[4];               /* Name of command.  The actual size of this
                                 * portion is as large as is necessary to
                                 * hold the characters.  This must be the
                                 * last subfield of the record. */
} Command;

#define CMD_SIZE(nameLength) ((unsigned) sizeof(Command) + nameLength - 3)

/*
 * The structure below defines a variable, which associates a string name
 * with a string value.  To cut down on the number of malloc's and free's
 * (particularly for procedure parameters), space for both the variable's
 * name and initial value is allocated at the end of the structure (in
 * "storage").  If the variable's value changes later, a new dynamic
 * string is allocated, if there is insufficient space in the current
 * storage area.
 */

typedef struct Var {
    char *value;                /* Current value of variable (either points
                                 * to static space after name, or to dynamic
                                 * space if VAR_DYNAMIC is set). */
    int valueLength;            /* Number of bytes of storage at the place
                                 * referred to by value, not including space
                                 * for NULL terminator. */
    int flags;                  /* Miscellaneous flags:  see below. */
    struct Var *globalPtr;      /* If VAR_GLOBAL is set, this points to the
                                 * global variable corresponding to name. */
    struct Var *nextPtr;        /* Next variable in list, or NULL for end
                                 * of list. */
    char name[4];               /* Storage space for variable's name (and
                                 * initial value).  The name is at the
                                 * beginning, and is null-terminated.
                                 * May contain more than 4 bytes (see
                                 * VAR_SIZE macro below). */
} Var;

#define VAR_SIZE(nameLength, valueLength) \
        ((unsigned) sizeof(Var) + nameLength + valueLength - 2)

/*
 * Variable flags:
 *
 * VAR_DYNAMIC:         1 means the storage space for the value was
 *                      dynamically allocated, and must eventually be
 *                      freed.
 * VAR_GLOBAL:          Used only in local variables.  Means that this
 *                      is really a global variable.
 */

#define VAR_DYNAMIC     1
#define VAR_GLOBAL      2

/*
 * The structure below defines a command procedure, which consists of
 * a collection of Tcl commands plus information about arguments and
 * variables.
 */

typedef struct Proc {
    struct Interp *iPtr;        /* Interpreter for which this command
                                 * is defined. */
    char *command;              /* Command that constitutes the body of
                                 * the procedure (dynamically allocated). */
    Var *argPtr;                /* Pointer to first in list of variables
                                 * giving names to the procedure's arguments.
                                 * The order of the variables is the same
                                 * as the order of the arguments.  The "value"
                                 * fields of the variables are the default
                                 * values. */
} Proc;

/*
 * The structure below defines a trace.  This is used to allow Tcl
 * clients to find out whenever a command is about to be executed.
 */

typedef struct Trace {
    int level;                  /* Only trace commands at nesting level
                                 * less than or equal to this. */
    void (*proc)();             /* Procedure to call to trace command. */
    ClientData clientData;      /* Arbitrary value to pass to proc. */
    struct Trace *nextPtr;      /* Next in list of traces for this interp. */
} Trace;

/*
 * The stucture below defines an interpreter callback, which is
 * a procedure to invoke just before an interpreter is deleted.
 */

typedef struct InterpCallback {
    void (*proc)();             /* Procedure to call. */
    ClientData clientData;      /* Value to pass to procedure. */
    struct InterpCallback *nextPtr;
                                /* Next in list of callbacks for this
                                 * interpreter (or NULL for end of
                                 * list). */
} InterpCallback;

/*
 * The structure below defines a frame, which is a procedure invocation.
 * These structures exist only while procedures are being executed, and
 * provide a sort of call stack.
 */

typedef struct CallFrame {
    Var *varPtr;                /* First in list of all local variables
                                 * and arguments for this procedure
                                 * invocation. */
    int level;                  /* Level of this procedure, for "uplevel"
                                 * purposes (i.e. corresponds to nesting of
                                 * callerVarPtr's, not callerPtr's).  1 means
                                 * outer-most procedure, 0 means top-level. */
    int argc;                   /* This and argv below describe name and
                                 * arguments for this procedure invocation. */
    char **argv;                /* Array of arguments. */
    struct CallFrame *callerPtr;
                                /* Frame of procedure that invoked this one
                                 * (NULL if level == 1). */
    struct CallFrame *callerVarPtr;
                                /* Frame used by caller for accessing local
                                 * variables (same as callerPtr unless an
                                 * "uplevel" command was active in the
                                 * caller).  This field is used in the
                                 * implementation of "uplevel". */
} CallFrame;

/*
 * This structure defines an interpreter, which is a collection of commands
 * plus other state information related to interpreting commands, such as
 * variable storage.  The lists of commands and variables are sorted by usage:
 * each time a command or variable is used it is pulled to the front of its
 * list.
 */

typedef struct Interp {

    /*
     * Note:  the first two fields must match exactly the first
     * fields in a Tcl_Interp struct (see tcl.h).  If you change
     * one, be sure to change the other.
     */

    char *result;               /* Points to result returned by last
                                 * command. */
    int dynamic;                /* Non-zero means result is dynamically-
                                 * allocated and must be freed by Tcl_Eval
                                 * before executing the next command. */
    int errorLine;              /* When TCL_ERROR is returned, this gives
                                 * the line number within the command where
                                 * the error occurred (1 means first line). */
    Command *commandPtr;        /* First command in list containing all
                                 * commands defined for this table. */
    Var *globalPtr;             /* First in list of all global variables for
                                 * this command table. */
    Var *localPtr;              /* First in list of all local variables and
                                 * arguments for the Tcl procedure that is
                                 * currently being executed.  If no procedure
                                 * is being executed, or if it has no vars or
                                 * args, this will be NULL. */
    int numLevels;              /* Keeps track of how many nested calls to
                                 * Tcl_Eval are in progress for this
                                 * interpreter.  It's used to delay deletion
                                 * of the table until all Tcl_Eval invocations
                                 * are completed. */
    CallFrame *framePtr;        /* If a procedure is being executed, this
                                 * points to the call frame for the current
                                 * procedure (most recently-called).  NULL
                                 * means no procedure is active. */
    CallFrame *varFramePtr;     /* Points to the call frame whose variables
                                 * are currently in use (same as framePtr
                                 * unless an "uplevel" command is being
                                 * executed).  NULL means no procedure is
                                 * active or "uplevel 0" is being exec'ed. */
    int cmdCount;               /* Total number of times a command procedure
                                 * has been called for this interpreter. */
    int errInProgress;          /* Non-zero means an error unwind is already
                                 * in progress.  Zero means Tcl_Eval has
                                 * been invoked since the last error
                                 * occurred. */
    int noEval;                 /* Non-zero means no commands should actually
                                 * be executed:  just parse only.  Used in
                                 * expressions when the result is already
                                 * determined. */
    int flags;                  /* Various flag bits.  See below. */
    Trace *tracePtr;            /* List of traces for this interpreter. */
    InterpCallback *callbackPtr;/* List of callbacks to invoke when
                                 * interpreter is deleted. */
    char resultSpace[TCL_RESULT_SIZE];
                                /* Static space for storing small results. */
} Interp;

/*
 * Flag bits for Interp structures:
 *
 * DELETED:             Non-zero means the interpreter has been deleted:
 *                      don't process any more commands for it, and destroy
 *                      the structure as soon as all nested invocations of
 *                      Tcl_Eval are done.
 */

#define DELETED 1

/*
 * Procedures shared among Tcl modules but not used by the outside
 * world:
 */

extern void             TclCopyAndCollapse();
extern void             TclDeleteVars();
extern Command *        TclFindCmd();
extern int              TclFindElement();
extern Proc *           TclFindProc();
extern Proc *           TclIsProc();

#endif /* _TCLINT */

/* [<][>][^][v][top][bottom][index][help] */