/*
 * tcl.h --
 *
 *	This header file describes the externally-visible facilities
 *	of 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/tcl.h,v 1.33 90/01/15 14:06:02 ouster Exp $ SPRITE (Berkeley)
 */

#ifndef _TCL
#define _TCL

#define TCL_VERSION "2.1"

/*
 * Data structures defined opaquely in this module.  The definitions
 * below just provide dummy types.  A few fields are made visible in
 * Tcl_Interp structures, namely those for returning string values.
 * Note:  any change to the Tcl_Interp definition below must be mirrored
 * in the "real" definition in tclInt.h.
 */

typedef struct {
    char *result;		/* Points to result string 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). */
} Tcl_Interp;
typedef int *Tcl_Trace;

/*
 * When a TCL command returns, the string pointer interp->result points to
 * a string containing return information from the command.  In addition,
 * the command procedure returns an integer value, which is one of the
 * following:
 *
 * TCL_OK		Command completed normally;  interp->result contains
 *			the command's result.
 * TCL_ERROR		The command couldn't be completed successfully;
 *			interp->result describes what went wrong.
 * TCL_RETURN		The command requests that the current procedure
 *			return;  interp->result contains the procedure's
 *			return value.
 * TCL_BREAK		The command requests that the innermost loop
 *			be exited;  interp->result is meaningless.
 * TCL_CONTINUE		Go on to the next iteration of the current loop;
 *			interp->result is meaninless.
 */

#define TCL_OK		0
#define TCL_ERROR	1
#define TCL_RETURN	2
#define TCL_BREAK	3
#define TCL_CONTINUE	4

#define TCL_RESULT_SIZE 199

/*
 * Flag values passed to Tcl_Eval (see the man page for details):
 */

#define TCL_BRACKET_TERM	1

/*
 * Flag values passed to Tcl_Return (see the man page for details):
 */

#define TCL_STATIC	0
#define TCL_DYNAMIC	1
#define TCL_VOLATILE	2

/*
 * Exported Tcl procedures:
 */

void panic(char *format, ...);
void *ckalloc(size_t len);
void ckfree(void *what);

void Tcl_AddErrorInfo(Tcl_Interp  *interp, char *message);
char Tcl_Backslash(char *src, int *readPtr);
char *Tcl_Concat(int argc, char **argv);
void Tcl_CreateCommand(Tcl_Interp  *interp, char *cmdName, int (*proc)(), 
	int *clientData, void (*deleteProc)());

Tcl_Interp *Tcl_CreateInterp(void);
int *Tcl_CreateTrace(Tcl_Interp  *interp, int level, void (*proc)(), 
	int *clientData);
void Tcl_DeleteCommand(Tcl_Interp  *interp, char *cmdName);
void Tcl_DeleteInterp(Tcl_Interp  *interp);
void Tcl_DeleteTrace(Tcl_Interp  *interp, int *trace);

int Tcl_Eval(Tcl_Interp  *interp, char *cmd, int flags, char **termPtr);
int Tcl_Expr(Tcl_Interp  *interp, char *string, int *valuePtr);
char *Tcl_GetVar(Tcl_Interp  *interp, char *varName, int global);
char *Tcl_Merge(int argc, char **argv);
char *Tcl_ParseVar(Tcl_Interp  *interp, char *string, char **termPtr);
void Tcl_Return(Tcl_Interp  *interp, char *string, int status);
void Tcl_SetVar(Tcl_Interp  *interp, char *varName, char *newValue, 
	int global);
int Tcl_SplitList(Tcl_Interp  *interp, char *list, int *argcPtr, 
	char ***argvPtr);
int Tcl_StringMatch(char *string, char *pattern);
void Tcl_WatchInterp(Tcl_Interp  *interp, void (*proc)(), int *clientData);

/*
 * Built-in Tcl command procedures:
 */

int Tcl_BreakCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_CaseCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_CatchCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ConcatCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ContinueCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ErrorCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_EvalCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ExecCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ExprCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_FileCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ForCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ForeachCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_FormatCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_GlobalCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);

int Tcl_IfCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_InfoCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_IndexCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_LengthCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ListCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_PrintCmd(int *notUsed, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ProcCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_RangeCmd(int *notUsed, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_RenameCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ReturnCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_ScanCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_SetCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_SourceCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_StringCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_TimeCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);
int Tcl_UplevelCmd(int *dummy, Tcl_Interp  *interp, int argc, char **argv);

/*
 * Miscellaneous declarations (to allow Tcl to be used stand-alone,
 * without the rest of Sprite).
 */
#ifndef _CLIENTDATA
typedef int *ClientData;
#define _CLIENTDATA
#endif

#ifndef NULL
#define NULL 0
#endif

/* Portability stuff */
#ifndef BSD
#define bcopy(f,t,l) memcpy(t,f,l)
#endif

#endif /* _TCL */


