TCl脚本扩展示例,包含两个示例,示例1:未使用到ClientData;示例2使用到了ClientData参数
************************************************示例1,未使用到ClientData参数**********************************************
// TclTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tcl.h"
int Tcl_AppInit(Tcl_Interp *interp);
int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[]);
int _tmain(int argc, _TCHAR* argv[])
{
Tcl_Main(argc, argv, Tcl_AppInit);
return 0;
}
int Tcl_AppInit(Tcl_Interp *interp)
{
Tcl_Init(interp);
//! 注册命令
Tcl_CreateCommand (interp, "addcmd", (Tcl_CmdProc*)AddCmd, (ClientData)0, (Tcl_CmdDeleteProc* )0);
return TCL_OK;
}
int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=3)
{
interp->result="Useage Error! should be : add int1 int2";
return TCL_ERROR;
}
int i,j;
if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
{
sprintf(interp->result,"Expect integer but got %s",argv[1]);
return TCL_ERROR;
}
if(TCL_OK!=Tcl_GetInt(interp,argv[2],&j))
{
sprintf(interp->result,"Expect integer but got %s",argv[2]);
return TCL_ERROR;
}
i=i+j;
sprintf(interp->result,"%d",i);
return TCL_OK;
}
************************************************示例2,使用到ClientData参数**********************************************
// TclTest2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "TclTest2.h"
int _tmain(int argc, _TCHAR* argv[])
{
Tcl_Main(argc, argv, Tcl_InitApp);
return 0;
}
int Tcl_InitApp(Tcl_Interp* interp)
{
Tcl_Init(interp);
Sample* pSam=new Sample;
Tcl_CreateCommand(interp, "myget", (Tcl_CmdProc*)MyGetCmd, (ClientData)pSam,
(Tcl_CmdDeleteProc*) DeleteProc);
Tcl_CreateCommand(interp, "myset",(Tcl_CmdProc*)MySetCmd, (ClientData)pSam,
(Tcl_CmdDeleteProc* )DeleteProc);
return TCL_OK;
}
int MyGetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=1)
{
interp->result="Usage error!";
return TCL_ERROR;
}
Sample* pSam=(Sample* )clientdata;
if(!pSam)
{
return TCL_ERROR;
}
sprintf(interp->result,"%d",pSam->Get());
return TCL_OK;
}
int MySetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=2)
{
interp->result="Usage error!";
return TCL_ERROR;
}
Sample* pSam=(Sample* )clientdata;
if(!pSam)
{
return TCL_ERROR;
}
int i;
if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
{
sprintf(interp->result,"Expect integer but got %s",argv[1]);
return TCL_ERROR;
}
pSam->Set(i);
sprintf(interp->result,"%d",i);
return TCL_OK;
}
void DeleteProc(ClientData clientdata)
{
int static i=0;
if(i!=0)
return;
delete (char*)clientdata;
i=1;
}
************************************************示例1,未使用到ClientData参数**********************************************
// TclTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "tcl.h"
int Tcl_AppInit(Tcl_Interp *interp);
int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[]);
int _tmain(int argc, _TCHAR* argv[])
{
Tcl_Main(argc, argv, Tcl_AppInit);
return 0;
}
int Tcl_AppInit(Tcl_Interp *interp)
{
Tcl_Init(interp);
//! 注册命令
Tcl_CreateCommand (interp, "addcmd", (Tcl_CmdProc*)AddCmd, (ClientData)0, (Tcl_CmdDeleteProc* )0);
return TCL_OK;
}
int AddCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=3)
{
interp->result="Useage Error! should be : add int1 int2";
return TCL_ERROR;
}
int i,j;
if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
{
sprintf(interp->result,"Expect integer but got %s",argv[1]);
return TCL_ERROR;
}
if(TCL_OK!=Tcl_GetInt(interp,argv[2],&j))
{
sprintf(interp->result,"Expect integer but got %s",argv[2]);
return TCL_ERROR;
}
i=i+j;
sprintf(interp->result,"%d",i);
return TCL_OK;
}
************************************************示例2,使用到ClientData参数**********************************************
// TclTest2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "TclTest2.h"
int _tmain(int argc, _TCHAR* argv[])
{
Tcl_Main(argc, argv, Tcl_InitApp);
return 0;
}
int Tcl_InitApp(Tcl_Interp* interp)
{
Tcl_Init(interp);
Sample* pSam=new Sample;
Tcl_CreateCommand(interp, "myget", (Tcl_CmdProc*)MyGetCmd, (ClientData)pSam,
(Tcl_CmdDeleteProc*) DeleteProc);
Tcl_CreateCommand(interp, "myset",(Tcl_CmdProc*)MySetCmd, (ClientData)pSam,
(Tcl_CmdDeleteProc* )DeleteProc);
return TCL_OK;
}
int MyGetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=1)
{
interp->result="Usage error!";
return TCL_ERROR;
}
Sample* pSam=(Sample* )clientdata;
if(!pSam)
{
return TCL_ERROR;
}
sprintf(interp->result,"%d",pSam->Get());
return TCL_OK;
}
int MySetCmd(ClientData clientdata,Tcl_Interp* interp,int argc,char * argv[])
{
if(argc!=2)
{
interp->result="Usage error!";
return TCL_ERROR;
}
Sample* pSam=(Sample* )clientdata;
if(!pSam)
{
return TCL_ERROR;
}
int i;
if(TCL_OK!=Tcl_GetInt(interp,argv[1],&i))
{
sprintf(interp->result,"Expect integer but got %s",argv[1]);
return TCL_ERROR;
}
pSam->Set(i);
sprintf(interp->result,"%d",i);
return TCL_OK;
}
void DeleteProc(ClientData clientdata)
{
int static i=0;
if(i!=0)
return;
delete (char*)clientdata;
i=1;
}