summaryrefslogtreecommitdiffstats
path: root/generic/tclTest.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2023-03-05 21:27:49 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2023-03-05 21:27:49 (GMT)
commit7ec4501d372de77fbbf34939c0f7fd038486de64 (patch)
treeb825c07ed856689b0fc383a336bdf222e04d1427 /generic/tclTest.c
parente4e106233842d77095bf459f14bb82e953bc8c6f (diff)
parent9e0cc9d6308f5bb5a55914cd31d265d3e6dda4a3 (diff)
downloadtcl-7ec4501d372de77fbbf34939c0f7fd038486de64.zip
tcl-7ec4501d372de77fbbf34939c0f7fd038486de64.tar.gz
tcl-7ec4501d372de77fbbf34939c0f7fd038486de64.tar.bz2
Merge 8.7
Diffstat (limited to 'generic/tclTest.c')
-rw-r--r--generic/tclTest.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/generic/tclTest.c b/generic/tclTest.c
index a5d2e0b..6399e37 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -62,6 +62,7 @@ static Tcl_Interp *delInterp;
typedef struct TestCommandTokenRef {
int id; /* Identifier for this reference. */
Tcl_Command token; /* Tcl's token for the command. */
+ const char *value;
struct TestCommandTokenRef *nextPtr;
/* Next in list of references. */
} TestCommandTokenRef;
@@ -1143,6 +1144,18 @@ TestcmdinfoCmd(
}
static int
+CmdProc0(
+ void *clientData, /* String to return. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ TCL_UNUSED(int) /*argc*/,
+ TCL_UNUSED(const char **) /*argv*/)
+{
+ TestCommandTokenRef *refPtr = (TestCommandTokenRef *) clientData;
+ Tcl_AppendResult(interp, "CmdProc1 ", refPtr->value, NULL);
+ return TCL_OK;
+}
+
+static int
CmdProc1(
void *clientData, /* String to return. */
Tcl_Interp *interp, /* Current interpreter. */
@@ -1153,6 +1166,7 @@ CmdProc1(
return TCL_OK;
}
+
static int
CmdProc2(
void *clientData, /* String to return. */
@@ -1165,6 +1179,28 @@ CmdProc2(
}
static void
+CmdDelProc0(
+ void *clientData) /* String to save. */
+{
+ TestCommandTokenRef *thisRefPtr, *prevRefPtr = NULL;
+ TestCommandTokenRef *refPtr = (TestCommandTokenRef *) clientData;
+ int id = refPtr->id;
+ for (thisRefPtr = firstCommandTokenRef; refPtr != NULL;
+ thisRefPtr = thisRefPtr->nextPtr) {
+ if (thisRefPtr->id == id) {
+ if (prevRefPtr != NULL) {
+ prevRefPtr->nextPtr = thisRefPtr->nextPtr;
+ } else {
+ firstCommandTokenRef = thisRefPtr->nextPtr;
+ }
+ break;
+ }
+ prevRefPtr = thisRefPtr;
+ }
+ ckfree(refPtr);
+}
+
+static void
CmdDelProc1(
void *clientData) /* String to save. */
{
@@ -1206,7 +1242,7 @@ TestcmdtokenCmd(
int argc, /* Number of arguments. */
const char **argv) /* Argument strings. */
{
- TestCommandTokenRef *refPtr, *prevRefPtr;
+ TestCommandTokenRef *refPtr;
char buf[30];
int id;
@@ -1217,9 +1253,10 @@ TestcmdtokenCmd(
}
if (strcmp(argv[1], "create") == 0) {
refPtr = (TestCommandTokenRef *)Tcl_Alloc(sizeof(TestCommandTokenRef));
- refPtr->token = Tcl_CreateCommand(interp, argv[2], CmdProc1,
- (void *) "original", NULL);
+ refPtr->token = Tcl_CreateCommand(interp, argv[2], CmdProc0,
+ refPtr, CmdDelProc0);
refPtr->id = nextCommandTokenRefId;
+ refPtr->value = "original";
nextCommandTokenRefId++;
refPtr->nextPtr = firstCommandTokenRef;
firstCommandTokenRef = refPtr;
@@ -1255,19 +1292,6 @@ TestcmdtokenCmd(
Tcl_GetCommandName(interp, refPtr->token));
Tcl_AppendElement(interp, Tcl_GetString(objPtr));
Tcl_DecrRefCount(objPtr);
- } else if (strcmp(argv[1], "free") == 0) {
- prevRefPtr = NULL;
- for (refPtr = firstCommandTokenRef; refPtr != NULL;
- refPtr = refPtr->nextPtr) {
- if (refPtr->id == id) {
- if (prevRefPtr != NULL) {
- prevRefPtr->nextPtr = refPtr->nextPtr;
- }
- Tcl_Free(refPtr);
- break;
- }
- prevRefPtr = refPtr;
- }
} else {
Tcl_AppendResult(interp, "bad option \"", argv[1],
"\": must be create, name, or free", NULL);