Subject: TIP#235 implementation (rename functions, add to stubs table, document) Ensembles now have a C API. :^)

From: dkf <[email-masked]>
Date: Wed, 19 Jan 2005 23:15:07 +0000

---
 ChangeLog           |  22 ++++---
 doc/Ensemble.3      | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 generic/tcl.decls   |  49 +++++++++++++-
 generic/tcl.h       |   9 ++-
 generic/tclBasic.c  |   4 +-
 generic/tclInt.h    |  37 +----------
 generic/tclNamesp.c | 145 ++++++++++++++++++++--------------------
 7 files changed, 332 insertions(+), 120 deletions(-)
 create mode 100644 doc/Ensemble.3

diff --git a/ChangeLog b/ChangeLog
index 1abac3d..f4c8b1e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,22 @@
+2005-01-19  Donal K. Fellows  <[email-masked]>
+
+	TIP#235 IMPLEMENTATION
+
+	* doc/Ensemble.3: Documentation for the new public API.
+	* generic/tclNamesp.c (Tcl_CreateEnsemble,...): Rename of
+	* generic/tcl.decls:		existing API into TIPped form.
+
 2005-01-19  Mo DeJong  <[email-masked]>
 
-	* win/tclWinChan.c (FileCloseProc): Invoke
-	TclpCutFileChannel() to remove a FileInfo from
-	the thread local list before deallocating it.
-	This should have been done via an earlier
-	call to Tcl_CutChannel, but I was running into
-	a crash in the next call to Tcl_CutChannel
-	during the IO finalization stage.
+	* win/tclWinChan.c (FileCloseProc): Invoke TclpCutFileChannel() to
+	remove a FileInfo from the thread local list before deallocating
+	it.  This should have been done via an earlier call to
+	Tcl_CutChannel, but I was running into a crash in the next call to
+	Tcl_CutChannel during the IO finalization stage.
 
 2005-01-18  Kevin Kenny  <[email-masked]>
 
-        * library/tzdata/GMT+0:
+	* library/tzdata/GMT+0:
 	* library/tzdata/GMT-0:
 	* library/tzdata/GMT0:
 	* library/tzdata/Greenwich:
diff --git a/doc/Ensemble.3 b/doc/Ensemble.3
new file mode 100644
index 0000000..fad3851
--- /dev/null
+++ b/doc/Ensemble.3
@@ -0,0 +1,186 @@
+'\"
+'\" Copyright (c) 2005 Donal K. Fellows
+'\"
+'\" See the file "license.terms" for information on usage and redistribution
+'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+'\" 
+'\" RCS: @(#) $Id: Ensemble.3,v 1.1 2005/01/19 23:15:26 dkf Exp $
+'\" 
+'\" This documents the C API introduced in TIP#235
+'\" 
+.so man.macros
+.TH Tcl_Ensemble 3 8.5 Tcl "Tcl Library Procedures"
+.BS
+.SH NAME
+Tcl_CreateEnsemble, Tcl_FindEnsemble, Tcl_GetEnsembleFlags, Tcl_GetEnsembleMappingDict, Tcl_GetEnsembleNamespace, Tcl_GetEnsembleUnknownHandler, Tcl_GetEnsmelbeSubcommandList, Tcl_IsEnsemble, Tcl_SetEnsembleFlags, Tcl_SetEnsembleMappingDict, Tcl_SetEnsembleSubcommandList, Tcl_SetEnsembleUnknownHandler \- manipulate ensemble commands
+.SH SYNOPSIS
+.nf
+\fB#include <tcl.h>\fR
+.sp
+Tcl_Command
+\fBTcl_CreateEnsemble\fR(\fIinterp, name, namespacePtr, ensFlags\fR)
+.sp
+Tcl_Command
+\fBTcl_FindEnsemble\fR(\fIinterp, cmdNameObj, flags\fR)
+.sp
+int
+\fBTcl_IsEnsemble\fR(\fItoken\fR)
+.sp
+int
+\fBTcl_GetEnsembleFlags\fR(\fIinterp, token, ensFlagsPtr\fR)
+.sp
+int
+\fBTcl_SetEnsembleFlags\fR(\fIinterp, token, ensFlags\fR)
+.sp
+int
+\fBTcl_GetEnsembleMappingDict\fR(\fIinterp, token, dictObjPtr\fR)
+.sp
+int
+\fBTcl_SetEnsembleMappingDict\fR(\fIinterp, token, dictObj\fR)
+.sp
+int
+\fBTcl_GetEnsembleSubcommandList\fR(\fIinterp, token, listObjPtr\fR)
+.sp
+int
+\fBTcl_SetEnsembleSubcommandList\fR(\fIinterp, token, listObj\fR)
+.sp
+int
+\fBTcl_GetEnsembleUnknownHandler\fR(\fIinterp, token, listObjPtr\fR)
+.sp
+int
+\fBTcl_SetEnsembleUnknownHandler\fR(\fIinterp, token, listObj\fR)
+.sp
+int
+\fBTcl_GetEnsembleNamespace\fR(\fIinterp, token, namespacePtrPtr\fR)
+.SH ARGUMENTS
+.AS Tcl_Namespace **namespacePtrPtr in/out
+.AP Tcl_Interp *interp in/out
+The interpreter in which the ensemble is to be created or found. Also
+where error result messages are written.
+.AP "const char" *name in
+The name of the ensemble command to be created.
+.AP Tcl_Namespace *namespacePtr in
+The namespace to which the ensemble command is to be bound, or NULL
+for the current namespace.
+.AP int ensFlags in
+An ORed set of flag bits describing the basic configuration of the
+ensemble. Currently only one bit has meaning, TCL_ENSEMBLE_PREFIX,
+which is present when the ensemble command should also match
+unambiguous prefixes of subcommands.
+.AP Tcl_Obj *cmdNameObj in
+A value holding the name of the ensemble command to look up.
+.AP int flags in
+An ORed set of flag bits controlling the behavior of
+\fBTcl_FindEnsemble\fR. Currently only TCL_LEAVE_ERR_MSG is supported.
+.AP Tcl_Command token in
+A normal command token that refers to an ensemble command, or which
+you wish to use for testing as an ensemble command in \fBTcl_IsEnsemble\fR.
+.AP int *ensFlagsPtr out
+Pointer to a variable into which to write the current ensemble flag
+bits; currently only the bit TCL_ENSEMBLE_PREFIX is defined.
+.AP Tcl_Obj *dictObj in
+A dictionary value to use for the subcommand to implementation command
+prefix mapping dictionary in the ensemble. May be NULL if the mapping
+dictionary is to be removed.
+.AP Tcl_Obj **dictObjPtr out
+Pointer to a variable into which to write the current ensemble mapping
+dictionary.
+.AP Tcl_Obj *listObj in
+A list value to use for the defined list of subcommands in the
+dictionary or the unknown subcommmand handler command prefix. May be
+NULL if the subcommand list or unknown handler are to be removed.
+.AP Tcl_Obj **listObjPtr out
+Pointer to a variable into which to write the current defiend list of
+subcommands or the current unknown handler prefix.
+.AP Tcl_Namespace **namespacePtrPtr out
+Pointer to a variable into which to write the handle of the namespace
+to which the ensemble is bound.
+.BE
+
+.SH DESCRIPTION
+An ensemble is a command, bound to some namespace, which consists of a
+collection of subcommands implemented by other Tcl commands. The first
+argument to the ensemble command is always interpreted as a selector
+that states what subcommand to execute.
+.PP
+Ensembles are created using \fBTcl_CreateEnsemble\fR, which takes four
+arguments: the interpreter to work within, the name of the ensemble to
+create, the namespace within the interpreter to bind the ensemble to,
+and the default set of ensemble flags. The result of the function is
+the command token for the ensemble, which may be used to further
+configure the ensemble using the API descibed below in \fBENSEMBLE
+PROPERTIES\fR.
+.PP
+Given the name of an ensemble command, the token for that command may
+be retrieved using \fBTcl_FindEnsemble\fR. If the given command name
+(in \fIcmdNameObj\fR) does not refer to an ensemble command, the
+result of the function is NULL and (if the TCL_LEAVE_ERR_MSG bit is
+set in \fIflags\fR) an error message is left in the interpreter
+result.
+.PP
+A command token may be checked to see if it refers to an ensemble
+using \fBTcl_IsEnsemble\fR. This returns 1 if the token refers to an
+ensemble, or 0 otherwise.
+.SS "ENSEMBLE PROPERTIES"
+Every ensemble has four read-write properties and a read-only
+property. The properties are:
+.TP
+\fBflags\fR (read-write)
+The set of flags for the ensemble, expressed as a
+bit-field. Currently, the only public flag is TCL_ENSEMBLE_PREFIX
+which is set when unambiguous prefixes of subcommands are permitted to
+be resolved to implementations as well as exact matches. The flags may
+be read and written using \fBTcl_GetEnsembleFlags\fR and
+\fBTcl_SetEnsembleFlags\fR respectively. The result of both of those
+functions is a Tcl result code (TCL_OK, or TCL_ERROR if the token does
+not refer to an ensemble).
+.TP
+\fBmapping dictionary\fR (read-write)
+A dictionary containing a mapping from subcommand names to lists of
+words to use as a command prefix (replacing the first two words of the
+command which are the ensemble command itself and the subcommand
+name), or NULL if every subcommand is to be mapped to the command with
+the same unqualified name in the ensemble's bound namespace. Defaults
+to NULL. May be read and written using
+\fBTcl_GetEnsembleMappingDict\fR and \fBTcl_SetEnsembleMappingDict\fR
+respectively. The result of both of those functions is a Tcl result
+code (TCL_OK, or TCL_ERROR if the token does not refer to an
+ensemble) and the dictionary obtained from
+\fBTcl_GetEnsembleMappingDict\fR should always be treated as immutable
+even if it is unshared.
+.TP
+\fBsubcommand list\fR (read-write)
+A list of all the subcommand names for the ensemble, or NULL if this
+is to be derived from either the keys of the mapping dictionary (see
+above) or (if that is also NULL) from the set of commands exported by
+the bound namespace. May be read and written using
+\fBTcl_GetEnsembleSubcommandList\fR and
+\fBTcl_SetEnsembleSubcommandList\fR respectively. The result of both
+of those functions is a Tcl result code (TCL_OK, or TCL_ERROR if the
+token does not refer to an ensemble) and the list obtained from
+\fBTcl_GetEnsembleSubcommandList\fR should alays be treated as
+immutable even if it is unshared.
+.TP
+\fBunknown subcommand handler command prefix\fR (read-write)
+A list of words to prepend on the front of any subcommand when the
+subcommand is unknown to the ensemble (according to the current prefix
+handling rule); see the \fBnamespace ensemble\fR command for more
+details. If NULL, the default behavior \- generate a suitable error
+message \- will be used when an unknown subcommand is encountered. May
+be read and written using \fBTcl_GetEnsembleUnknownHandler\fR and
+\fBTcl_SetEnsembleUnknownHandler\fR respectively. The result of both
+functions is a Tcl result code (TCL_OK, or TCL_ERROR if the token does
+not refer to an ensemble) and the list obtained from
+\fBTcl_GetEnsembleUnknownHandler\fR should always be treated as
+immutable even if it is unshared.
+.TP
+\fBbound namespace\fR (read-only)
+The namespace to which the ensemble is bound; when the namespace is
+deleted, so too will the ensemble, and this namespace is also the
+namespace whose list of exported commands is used if both the mapping
+dictionary and the subcommand list properties are NULL. May be read
+using \fBTcl_GetEnsembleNamespace\fR which returns a Tcl result code
+(TCL_OK, or TCL_ERROR if the token does not refer to an ensemble).
+
+.SH "SEE ALSO"
+namespace(n), Tcl_DeleteCommandFromToken(3)
diff --git a/generic/tcl.decls b/generic/tcl.decls
index af227bf..cb0ad5b 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -11,7 +11,7 @@
 # See the file "license.terms" for information on usage and redistribution
 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 # 
-# RCS: @(#) $Id: tcl.decls,v 1.105 2004/11/13 00:19:05 dgp Exp $
+# RCS: @(#) $Id: tcl.decls,v 1.106 2005/01/19 23:15:12 dkf Exp $
 
 library tcl
 
@@ -1926,6 +1926,53 @@ declare 538 generic {
 declare 539 generic {
     Tcl_Obj *Tcl_GetReturnOptions(Tcl_Interp *interp, int result)
 }
+# TIP#235
+declare 540 generic {
+    int Tcl_IsEnsemble(Tcl_Command token)
+}
+declare 541 generic {
+    Tcl_Command Tcl_CreateEnsemble(Tcl_Interp *interp, CONST char *name,
+	    Tcl_Namespace *namespacePtr, int flags)
+}
+declare 542 generic {
+    Tcl_Command Tcl_FindEnsemble(Tcl_Interp *interp, Tcl_Obj *cmdNameObj,
+	    int flags)
+}
+declare 543 generic {
+    int Tcl_SetEnsembleSubcommandList(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj *subcmdList)
+}
+declare 544 generic {
+    int Tcl_SetEnsembleMappingDict(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj *mapDict)
+}
+declare 545 generic {
+    int Tcl_SetEnsembleUnknownHandler(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj *unknownList)
+}
+declare 546 generic {
+    int Tcl_SetEnsembleFlags(Tcl_Interp *interp, Tcl_Command token, int flags)
+}
+declare 547 generic {
+    int Tcl_GetEnsembleSubcommandList(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj **subcmdListPtr)
+}
+declare 548 generic {
+    int Tcl_GetEnsembleMappingDict(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj **mapDictPtr)
+}
+declare 549 generic {
+    int Tcl_GetEnsembleUnknownHandler(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Obj **unknownListPtr)
+}
+declare 550 generic {
+    int Tcl_GetEnsembleFlags(Tcl_Interp *interp, Tcl_Command token,
+	    int *flagsPtr)
+}
+declare 551 generic {
+    int Tcl_GetEnsembleNamespace(Tcl_Interp *interp, Tcl_Command token,
+	    Tcl_Namespace **namespacePtrPtr)
+}
 
 ##############################################################################
 
diff --git a/generic/tcl.h b/generic/tcl.h
index c183783..2a74307 100644
--- a/generic/tcl.h
+++ b/generic/tcl.h
@@ -13,7 +13,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tcl.h,v 1.193 2004/12/13 22:17:33 dgp Exp $
+ * RCS: @(#) $Id: tcl.h,v 1.194 2005/01/19 23:15:14 dkf Exp $
  */
 
 #ifndef _TCL
@@ -1053,6 +1053,13 @@ typedef struct Tcl_DString {
 #define TCL_TRACE_RESULT_OBJECT  0x10000
 
 /*
+ * Flag values for ensemble commands.
+ */
+#define TCL_ENSEMBLE_PREFIX 0x02/* Flag value to say whether to allow
+				 * unambiguous prefixes of commands or to
+				 * require exact matches for command names. */
+
+/*
  * Flag values passed to command-related procedures.
  */
 
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 45a3c4b..22ce3c6 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -13,7 +13,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tclBasic.c,v 1.137 2004/12/15 20:44:34 msofer Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.138 2005/01/19 23:15:14 dkf Exp $
  */
 
 #include "tclInt.h"
@@ -3047,7 +3047,7 @@ TclEvalObjvInternal(interp, objc, objv, command, length, flags)
 	}
 	if (!(flags & TCL_EVAL_INVOKE) &&
 		(iPtr->ensembleRewrite.sourceObjs != NULL) &&
-		!TclIsEnsemble(cmdPtr)) {
+		!Tcl_IsEnsemble((Tcl_Command) cmdPtr)) {
 	    iPtr->ensembleRewrite.sourceObjs = NULL;
 	}
 	code = (*cmdPtr->objProc)(cmdPtr->objClientData, interp, objc, objv);
diff --git a/generic/tclInt.h b/generic/tclInt.h
index 0f88767..a0d1c4a 100644
--- a/generic/tclInt.h
+++ b/generic/tclInt.h
@@ -12,7 +12,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tclInt.h,v 1.211 2005/01/14 14:16:52 dkf Exp $
+ * RCS: @(#) $Id: tclInt.h,v 1.212 2005/01/19 23:15:16 dkf Exp $
  */
 
 #ifndef _TCLINT
@@ -2024,41 +2024,6 @@ MODULE_SCOPE int	TclpDlopen _ANSI_ARGS_((Tcl_Interp *interp,
 			    Tcl_FSUnloadFileProc **unloadProcPtr));
 MODULE_SCOPE int	TclpUtime _ANSI_ARGS_((Tcl_Obj *pathPtr,
 			    struct utimbuf *tval));
-/*
- * These declarations ought to be exposed in a TIP (i.e. gain a '_' in
- * their names and move to tcl.decls).
- */
-MODULE_SCOPE int	TclIsEnsemble _ANSI_ARGS_((Command *cmdPtr));
-MODULE_SCOPE Tcl_Command TclMakeEnsembleCmd _ANSI_ARGS_((
-			    Tcl_Interp *interp, CONST char *name,
-			    Tcl_Namespace *namespacePtr, int flags));
-MODULE_SCOPE Tcl_Command TclFindEnsemble _ANSI_ARGS_((Tcl_Interp *interp,
-			    Tcl_Obj *cmdNameObj, int flags));
-MODULE_SCOPE int	TclSetEnsembleSubcommandList _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj *subcmdList));
-MODULE_SCOPE int	TclSetEnsembleMappingDict _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj *mapDict));
-MODULE_SCOPE int	TclSetEnsembleUnknownHandler _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj *unknownList));
-MODULE_SCOPE int	TclSetEnsembleFlags _ANSI_ARGS_((Tcl_Interp *interp,
-			    Tcl_Command token, int flags));
-MODULE_SCOPE int	TclGetEnsembleSubcommandList _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj **subcmdList));
-MODULE_SCOPE int	TclGetEnsembleMappingDict _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj **mapDict));
-MODULE_SCOPE int	TclGetEnsembleUnknownHandler _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Obj **unknownList));
-MODULE_SCOPE int	TclGetEnsembleFlags _ANSI_ARGS_((Tcl_Interp *interp,
-			    Tcl_Command token, int *flags));
-MODULE_SCOPE int	TclGetEnsembleNamespace _ANSI_ARGS_((
-			    Tcl_Interp *interp, Tcl_Command token,
-			    Tcl_Namespace **namespacePtrPtr));
 
 /*
  *----------------------------------------------------------------
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c
index 48a306d..58ab757 100644
--- a/generic/tclNamesp.c
+++ b/generic/tclNamesp.c
@@ -11,7 +11,7 @@
  * Copyright (c) 1993-1997 Lucent Technologies.
  * Copyright (c) 1997 Sun Microsystems, Inc.
  * Copyright (c) 1998-1999 by Scriptics Corporation.
- * Copyright (c) 2002-2004 Donal K. Fellows.
+ * Copyright (c) 2002-2005 Donal K. Fellows.
  *
  * Originally implemented by
  *   Michael J. McLennan
@@ -21,7 +21,7 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
- * RCS: @(#) $Id: tclNamesp.c,v 1.70 2004/12/15 20:44:41 msofer Exp $
+ * RCS: @(#) $Id: tclNamesp.c,v 1.71 2005/01/19 23:15:25 dkf Exp $
  */
 
 #include "tclInt.h"
@@ -119,7 +119,8 @@ typedef struct EnsembleConfig {
 				 * all lists, and cannot be found by scanning
 				 * the list from the namespace's ensemble
 				 * field. */
-    int flags;			/* ORed combo of ENS_DEAD and ENS_PREFIX. */
+    int flags;			/* ORed combo of ENS_DEAD and
+				 * TCL_ENSEMBLE_PREFIX. */
 
     /* OBJECT FIELDS FOR ENSEMBLE CONFIGURATION */
 
@@ -137,23 +138,21 @@ typedef struct EnsembleConfig {
 				 * list of currently exported commands. */
     Tcl_Obj *unknownHandler;	/* Script prefix used to handle the case when
 				 * no match is found (according to the rule
-				 * defined by flag bit ENS_PREFIX) or NULL to
-				 * use the default error-generating behaviour.
-				 * The script execution gets all the arguments
-				 * to the ensemble command (including objv[0])
-				 * and will have the results passed directly
-				 * back to the caller (including the error
-				 * code) unless the code is TCL_CONTINUE in
-				 * which case the subcommand will be reparsed
-				 * by the ensemble core, presumably because
-				 * the ensemble itself has been updated. */
+				 * defined by flag bit TCL_ENSEMBLE_PREFIX) or
+				 * NULL to use the default error-generating
+				 * behaviour. The script execution gets all
+				 * the arguments to the ensemble command
+				 * (including objv[0]) and will have the
+				 * results passed directly back to the caller
+				 * (including the error code) unless the code
+				 * is TCL_CONTINUE in which case the subcommand
+				 * will be reparsed by the ensemble core,
+				 * presumably because the ensemble itself has
+				 * been updated. */
 } EnsembleConfig;
 
 #define ENS_DEAD	0x1	/* Flag value to say that the ensemble is dead
 				 * and on its way out. */
-#define ENS_PREFIX	0x2	/* Flag value to say whether to allow
-				 * unambiguous prefixes of commands or to
-				 * require exact matches for command names. */
 
 /*
  * The data cached in a subcommand's Tcl_Obj rep.  This structure is
@@ -4514,11 +4513,11 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	 * any deletions have occurred.)
 	 */
 
-	token = TclMakeEnsembleCmd(interp, name, NULL,
-		(permitPrefix ? ENS_PREFIX : 0));
-	TclSetEnsembleSubcommandList(interp, token, subcmdObj);
-	TclSetEnsembleMappingDict(interp, token, mapObj);
-	TclSetEnsembleUnknownHandler(interp, token, unknownObj);
+	token = Tcl_CreateEnsemble(interp, name, NULL,
+		(permitPrefix ? TCL_ENSEMBLE_PREFIX : 0));
+	Tcl_SetEnsembleSubcommandList(interp, token, subcmdObj);
+	Tcl_SetEnsembleMappingDict(interp, token, mapObj);
+	Tcl_SetEnsembleUnknownHandler(interp, token, unknownObj);
 
 	/*
 	 * Tricky! Rely on the object result not being shared!
@@ -4533,7 +4532,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    return TCL_ERROR;
 	}
 	Tcl_SetObjResult(interp, Tcl_NewBooleanObj(
-		TclFindEnsemble(interp, objv[3], 0) != NULL));
+		Tcl_FindEnsemble(interp, objv[3], 0) != NULL));
 	return TCL_OK;
 
     case ENS_CONFIG:
@@ -4541,7 +4540,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    Tcl_WrongNumArgs(interp, 3, objv, "cmdname ?opt? ?value? ...");
 	    return TCL_ERROR;
 	}
-	token = TclFindEnsemble(interp, objv[3], TCL_LEAVE_ERR_MSG);
+	token = Tcl_FindEnsemble(interp, objv[3], TCL_LEAVE_ERR_MSG);
 	if (token == NULL) {
 	    return TCL_ERROR;
 	}
@@ -4555,13 +4554,13 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    }
 	    switch ((enum EnsConfigOpts) index) {
 	    case CONF_SUBCMDS:
-		TclGetEnsembleSubcommandList(NULL, token, &resultObj);
+		Tcl_GetEnsembleSubcommandList(NULL, token, &resultObj);
 		if (resultObj != NULL) {
 		    Tcl_SetObjResult(interp, resultObj);
 		}
 		break;
 	    case CONF_MAP:
-		TclGetEnsembleMappingDict(NULL, token, &resultObj);
+		Tcl_GetEnsembleMappingDict(NULL, token, &resultObj);
 		if (resultObj != NULL) {
 		    Tcl_SetObjResult(interp, resultObj);
 		}
@@ -4569,7 +4568,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    case CONF_NAMESPACE: {
 		Tcl_Namespace *namespacePtr;
 
-		TclGetEnsembleNamespace(NULL, token, &namespacePtr);
+		Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr);
 		Tcl_SetResult(interp, ((Namespace *)namespacePtr)->fullName,
 			TCL_VOLATILE);
 		break;
@@ -4577,13 +4576,13 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    case CONF_PREFIX: {
 		int flags;
 
-		TclGetEnsembleFlags(NULL, token, &flags);
+		Tcl_GetEnsembleFlags(NULL, token, &flags);
 		Tcl_SetObjResult(interp,
-			Tcl_NewBooleanObj(flags & ENS_PREFIX));
+			Tcl_NewBooleanObj(flags & TCL_ENSEMBLE_PREFIX));
 		break;
 	    }
 	    case CONF_UNKNOWN:
-		TclGetEnsembleUnknownHandler(NULL, token, &resultObj);
+		Tcl_GetEnsembleUnknownHandler(NULL, token, &resultObj);
 		if (resultObj != NULL) {
 		    Tcl_SetObjResult(interp, resultObj);
 		}
@@ -4604,7 +4603,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    /* -map option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_MAP], -1));
-	    TclGetEnsembleMappingDict(NULL, token, &tmpObj);
+	    Tcl_GetEnsembleMappingDict(NULL, token, &tmpObj);
 	    if (tmpObj != NULL) {
 		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
 	    } else {
@@ -4613,20 +4612,20 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    /* -namespace option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_NAMESPACE], -1));
-	    TclGetEnsembleNamespace(NULL, token, &namespacePtr);
+	    Tcl_GetEnsembleNamespace(NULL, token, &namespacePtr);
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(((Namespace *)namespacePtr)->fullName,
 		    -1));
 	    /* -prefix option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_PREFIX], -1));
-	    TclGetEnsembleFlags(NULL, token, &flags);
+	    Tcl_GetEnsembleFlags(NULL, token, &flags);
 	    Tcl_ListObjAppendElement(NULL, resultObj,
-		    Tcl_NewBooleanObj(flags & ENS_PREFIX));
+		    Tcl_NewBooleanObj(flags & TCL_ENSEMBLE_PREFIX));
 	    /* -subcommands option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_SUBCMDS], -1));
-	    TclGetEnsembleSubcommandList(NULL, token, &tmpObj);
+	    Tcl_GetEnsembleSubcommandList(NULL, token, &tmpObj);
 	    if (tmpObj != NULL) {
 		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
 	    } else {
@@ -4635,7 +4634,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    /* -unknown option */
 	    Tcl_ListObjAppendElement(NULL, resultObj,
 		    Tcl_NewStringObj(configOptions[CONF_UNKNOWN], -1));
-	    TclGetEnsembleUnknownHandler(NULL, token, &tmpObj);
+	    Tcl_GetEnsembleUnknownHandler(NULL, token, &tmpObj);
 	    if (tmpObj != NULL) {
 		Tcl_ListObjAppendElement(NULL, resultObj, tmpObj);
 	    } else {
@@ -4654,11 +4653,11 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	    Tcl_Obj *subcmdObj, *mapObj, *unknownObj;
 	    int permitPrefix, flags;
 
-	    TclGetEnsembleSubcommandList(NULL, token, &subcmdObj);
-	    TclGetEnsembleMappingDict(NULL, token, &mapObj);
-	    TclGetEnsembleUnknownHandler(NULL, token, &unknownObj);
-	    TclGetEnsembleFlags(NULL, token, &flags);
-	    permitPrefix = (flags & ENS_PREFIX) != 0;
+	    Tcl_GetEnsembleSubcommandList(NULL, token, &subcmdObj);
+	    Tcl_GetEnsembleMappingDict(NULL, token, &mapObj);
+	    Tcl_GetEnsembleUnknownHandler(NULL, token, &unknownObj);
+	    Tcl_GetEnsembleFlags(NULL, token, &flags);
+	    permitPrefix = (flags & TCL_ENSEMBLE_PREFIX) != 0;
 
 	    objv += 4;
 	    objc -= 4;
@@ -4792,11 +4791,12 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 	     * parsing stage.
 	     */
 
-	    flags = (permitPrefix ? flags|ENS_PREFIX : flags&~ENS_PREFIX);
-	    TclSetEnsembleSubcommandList(NULL, token, subcmdObj);
-	    TclSetEnsembleMappingDict(NULL, token, mapObj);
-	    TclSetEnsembleUnknownHandler(NULL, token, unknownObj);
-	    TclSetEnsembleFlags(NULL, token, flags);
+	    flags = (permitPrefix ? flags|TCL_ENSEMBLE_PREFIX
+		    : flags&~TCL_ENSEMBLE_PREFIX);
+	    Tcl_SetEnsembleSubcommandList(NULL, token, subcmdObj);
+	    Tcl_SetEnsembleMappingDict(NULL, token, mapObj);
+	    Tcl_SetEnsembleUnknownHandler(NULL, token, unknownObj);
+	    Tcl_SetEnsembleFlags(NULL, token, flags);
 	    return TCL_OK;
 	}
 
@@ -4809,7 +4809,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
 /*
  *----------------------------------------------------------------------
  *
- * TclMakeEnsembleCmd --
+ * Tcl_CreateEnsemble --
  *
  *	Create a simple ensemble attached to the given namespace.
  *
@@ -4823,7 +4823,7 @@ NamespaceEnsembleCmd(dummy, interp, objc, objv)
  */
 
 Tcl_Command
-TclMakeEnsembleCmd(interp, name, namespacePtr, flags)
+Tcl_CreateEnsemble(interp, name, namespacePtr, flags)
     Tcl_Interp *interp;
     CONST char *name;
     Tcl_Namespace *namespacePtr;
@@ -4884,7 +4884,7 @@ TclMakeEnsembleCmd(interp, name, namespacePtr, flags)
 /*
  *----------------------------------------------------------------------
  *
- * TclSetEnsembleSubcommandList --
+ * Tcl_SetEnsembleSubcommandList --
  *
  *	Set the subcommand list for a particular ensemble.
  *
@@ -4899,7 +4899,7 @@ TclMakeEnsembleCmd(interp, name, namespacePtr, flags)
  */
 
 int
-TclSetEnsembleSubcommandList(interp, token, subcmdList)
+Tcl_SetEnsembleSubcommandList(interp, token, subcmdList)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj *subcmdList;
@@ -4948,7 +4948,7 @@ TclSetEnsembleSubcommandList(interp, token, subcmdList)
 /*
  *----------------------------------------------------------------------
  *
- * TclSetEnsembleMappingDict --
+ * Tcl_SetEnsembleMappingDict --
  *
  *	Set the mapping dictionary for a particular ensemble.
  *
@@ -4963,7 +4963,7 @@ TclSetEnsembleSubcommandList(interp, token, subcmdList)
  */
 
 int
-TclSetEnsembleMappingDict(interp, token, mapDict)
+Tcl_SetEnsembleMappingDict(interp, token, mapDict)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj *mapDict;
@@ -5012,7 +5012,7 @@ TclSetEnsembleMappingDict(interp, token, mapDict)
 /*
  *----------------------------------------------------------------------
  *
- * TclSetEnsembleUnknownHandler --
+ * Tcl_SetEnsembleUnknownHandler --
  *
  *	Set the unknown handler for a particular ensemble.
  *
@@ -5027,7 +5027,7 @@ TclSetEnsembleMappingDict(interp, token, mapDict)
  */
 
 int
-TclSetEnsembleUnknownHandler(interp, token, unknownList)
+Tcl_SetEnsembleUnknownHandler(interp, token, unknownList)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj *unknownList;
@@ -5077,7 +5077,7 @@ TclSetEnsembleUnknownHandler(interp, token, unknownList)
 /*
  *----------------------------------------------------------------------
  *
- * TclSetEnsembleFlags --
+ * Tcl_SetEnsembleFlags --
  *
  *	Set the flags for a particular ensemble.
  *
@@ -5092,7 +5092,7 @@ TclSetEnsembleUnknownHandler(interp, token, unknownList)
  */
 
 int
-TclSetEnsembleFlags(interp, token, flags)
+Tcl_SetEnsembleFlags(interp, token, flags)
     Tcl_Interp *interp;
     Tcl_Command token;
     int flags;
@@ -5128,7 +5128,7 @@ TclSetEnsembleFlags(interp, token, flags)
 /*
  *----------------------------------------------------------------------
  *
- * TclGetEnsembleSubcommandList --
+ * Tcl_GetEnsembleSubcommandList --
  *
  *	Get the list of subcommands associated with a particular ensemble.
  *
@@ -5146,7 +5146,7 @@ TclSetEnsembleFlags(interp, token, flags)
  */
 
 int
-TclGetEnsembleSubcommandList(interp, token, subcmdListPtr)
+Tcl_GetEnsembleSubcommandList(interp, token, subcmdListPtr)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj **subcmdListPtr;
@@ -5169,7 +5169,7 @@ TclGetEnsembleSubcommandList(interp, token, subcmdListPtr)
 /*
  *----------------------------------------------------------------------
  *
- * TclGetEnsembleMappingDict --
+ * Tcl_GetEnsembleMappingDict --
  *
  *	Get the command mapping dictionary associated with a
  *	particular ensemble.
@@ -5187,7 +5187,7 @@ TclGetEnsembleSubcommandList(interp, token, subcmdListPtr)
  */
 
 int
-TclGetEnsembleMappingDict(interp, token, mapDictPtr)
+Tcl_GetEnsembleMappingDict(interp, token, mapDictPtr)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj **mapDictPtr;
@@ -5210,7 +5210,7 @@ TclGetEnsembleMappingDict(interp, token, mapDictPtr)
 /*
  *----------------------------------------------------------------------
  *
- * TclGetEnsembleUnknownHandler --
+ * Tcl_GetEnsembleUnknownHandler --
  *
  *	Get the unknown handler associated with a particular ensemble.
  *
@@ -5227,7 +5227,7 @@ TclGetEnsembleMappingDict(interp, token, mapDictPtr)
  */
 
 int
-TclGetEnsembleUnknownHandler(interp, token, unknownListPtr)
+Tcl_GetEnsembleUnknownHandler(interp, token, unknownListPtr)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Obj **unknownListPtr;
@@ -5250,7 +5250,7 @@ TclGetEnsembleUnknownHandler(interp, token, unknownListPtr)
 /*
  *----------------------------------------------------------------------
  *
- * TclGetEnsembleFlags --
+ * Tcl_GetEnsembleFlags --
  *
  *	Get the flags for a particular ensemble.
  *
@@ -5266,7 +5266,7 @@ TclGetEnsembleUnknownHandler(interp, token, unknownListPtr)
  */
 
 int
-TclGetEnsembleFlags(interp, token, flagsPtr)
+Tcl_GetEnsembleFlags(interp, token, flagsPtr)
     Tcl_Interp *interp;
     Tcl_Command token;
     int *flagsPtr;
@@ -5289,7 +5289,7 @@ TclGetEnsembleFlags(interp, token, flagsPtr)
 /*
  *----------------------------------------------------------------------
  *
- * TclGetEnsembleNamespace --
+ * Tcl_GetEnsembleNamespace --
  *
  *	Get the namespace associated with a particular ensemble.
  *
@@ -5305,7 +5305,7 @@ TclGetEnsembleFlags(interp, token, flagsPtr)
  */
 
 int
-TclGetEnsembleNamespace(interp, token, namespacePtrPtr)
+Tcl_GetEnsembleNamespace(interp, token, namespacePtrPtr)
     Tcl_Interp *interp;
     Tcl_Command token;
     Tcl_Namespace **namespacePtrPtr;
@@ -5328,7 +5328,7 @@ TclGetEnsembleNamespace(interp, token, namespacePtrPtr)
 /*
  *----------------------------------------------------------------------
  *
- * TclFindEnsemble --
+ * Tcl_FindEnsemble --
  *
  *	Given a command name, get the ensemble token for it, allowing
  *	for [namespace import]s. [Bug 1017022]
@@ -5346,7 +5346,7 @@ TclGetEnsembleNamespace(interp, token, namespacePtrPtr)
  */
 
 Tcl_Command
-TclFindEnsemble(interp, cmdNameObj, flags)
+Tcl_FindEnsemble(interp, cmdNameObj, flags)
     Tcl_Interp *interp;			/* Where to do the lookup, and where
 					 * to write the errors if
 					 * TCL_LEAVE_ERR_MSG is set in the
@@ -5383,7 +5383,7 @@ TclFindEnsemble(interp, cmdNameObj, flags)
 /*
  *----------------------------------------------------------------------
  *
- * TclIsEnsemble --
+ * Tcl_IsEnsemble --
  *
  *	Simple test for ensemble-hood that takes into account imported
  *	ensemble commands as well.
@@ -5398,9 +5398,10 @@ TclFindEnsemble(interp, cmdNameObj, flags)
  */
 
 int
-TclIsEnsemble(cmdPtr)
-    Command *cmdPtr;
+Tcl_IsEnsemble(token)
+    Tcl_Command token;
 {
+    Command *cmdPtr = (Command *) token;
     if (cmdPtr->objProc == NsEnsembleImplementationCmd) {
 	return 1;
     }
@@ -5517,7 +5518,7 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
 	 */
 
 	MakeCachedEnsembleCommand(objv[1], ensemblePtr, fullName, prefixObj);
-    } else if (!(ensemblePtr->flags & ENS_PREFIX)) {
+    } else if (!(ensemblePtr->flags & TCL_ENSEMBLE_PREFIX)) {
 	/*
 	 * Can't find and we are prohibited from using unambiguous prefixes.
 	 */
@@ -5739,7 +5740,7 @@ NsEnsembleImplementationCmd(clientData, interp, objc, objv)
 	return TCL_ERROR;
     }
     Tcl_AppendResult(interp, "unknown ",
-	    (ensemblePtr->flags & ENS_PREFIX ? "or ambiguous " : ""),
+	    (ensemblePtr->flags & TCL_ENSEMBLE_PREFIX ? "or ambiguous " : ""),
 	    "subcommand \"", TclGetString(objv[1]), "\": must be ", NULL);
     if (ensemblePtr->subcommandTable.numEntries == 1) {
 	Tcl_AppendResult(interp, ensemblePtr->subcommandArrayPtr[0], NULL);
-- 
cgit v0.12