目 录75总结...................................................................54分析函数................................................................33命令生成和删除函数及结果处理函数...........................................22解释器的生成和删除及TCL 脚本的求值函数......................................21初始化函数.. (11)9TCL 库函数的最新情况....................................................108字符串操作函数.........................................................97Hash 表操作函数..........................................................76访问TCL 变量的函数.......................................................TCL库函数介绍(一)关键词:TCL摘要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。
为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。
用户可以在用C\C++语言编写扩展的TCL命令过程或函数时,调用这些库函数。
要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。
在我的一篇文档《TCL的使用》中有一些这些函数的使用的例子。
下面分类对TCL的库函数进行介绍。
1初始化函数这组函数用于用户初始化应用。
1.Tcl_Init函数原型: int Tcl_Init (Tcl_Interp *interp)参数interp是一个指向TCL解释器的指针。
Tcl_Init函数只作一些简单的初始化工作,没多大的用处。
不过,用户一般需要提供自己的初始化函数,原型与Tcl_Init一样,在这个函数中,要作应用的初始化工作,如注册自己的TCL扩展命令,生成自己需要的数据对象等。
这个函数必须在生成TCL解释器后才能调用。
生成TCL解释器可以调用Tcl_CreateInterp函数,另外Tcl_Main函数中也会自动生成TCL解释器。
2.Tcl_Main函数原型:void Tcl_Main (int argc, char **argv,Tcl_AppInitProc *appInitProc)如果用到这个函数的话,应该在你的C\C++程序的main函数中调用,它的前两个参数和main函数的两个参数一样,第三个参数是一个函数指针,指向一个初始化函数,其原型和Tcl_Init一样。
如果程序没有任何命令行参数,Tcl_Main调用appInitProc初始化函数,并启动一个TCL的命令解释循环,建立一个交互环境,等待你输入TCL命令和脚本并解释执行。
如果程序有命令行参数,那它先调用appInitProc函数作一些初始化工作,然后把第一个命令行参数作为TCL脚本文件名,并求值返回,其余参数不予理会。
2解释器的生成和删除及TCL脚本的求值函数这组函数提供生成和删除TCL解释器及对TCL脚本进行求值的功能。
每一个TCL应用,都必须拥有至少一个TCL解释器,事实上几乎所有的TCL库函数都有一个指向TCL解释器的指针的参数。
每一个扩展的TCL命令都和特定的TCL解释器相关联,只有在对该命令进行了注册的TCL解释器中,这个命令才是有效的,才能被解释执行。
1.Tcl_CreateInterp函数原型:Tcl_Interp *Tcl_CreateInterp(void)这个函数生成一个新的TCL解释器,并返回指向这个解释器的指针。
2.Tcl_DeleteInterp函数原型:void Tcl_DeleteInterp(Tcl_Interp *interp)这个函数删除一个TCL解释器,并会触发用户定义的回调函数,作一些善后工作。
3. Tcl_Eval函数原型: int Tcl_Eval(Tcl_Interp *interp char *script)这个函数在解释器interp中求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
函数返回值表示执行情况,为以下五个值之一:TCL_OK :表示执行成功TCL_ERROR:表示执行过程中遇到了不可克服的错误TCL_BREAK:表示break命令被激活TCL_CONTINUE :表示conitinue命令被激活TCL_RETURN:表示return 命令被激活事实上所有int型的TCL库函数都以上述值为返回值,TCL_OK和TCL_ERROR最常用,后面三个只是当用户需要实现自己的控制流才会用到。
下面介绍的库函数就不再介绍返回值。
4. Tcl_EvalFile 函数原型:int Tcl_EvalFile(Tcl_Interp *interp, char *fileName)这个函数在解释器interp中求脚本文件fileName的值并返回执行情况。
结果和错误信息保存在interp->result中。
5. Tcl_GlobalEval函数原型:int Tcl_GlobalEval(Tcl_Interp *interp, char *script)这个函数在解释器interp中在全局层次上求脚本script的值并返回执行情况。
结果和错误信息保存在interp->result中。
6. Tcl_VarEval函数原型:int Tcl_VarEval(Tcl_Interp *interp, char *string, char *string,... (char *) NULL)这个函数具有可变个数参数,必须以NULL作为最后一个参数,标记参数结束,它把所有的字符串参数合并成一个,在解释器interp中求它的值并返回执行情况。
结果和错误信息保存在interp->result中。
3命令生成和删除函数及结果处理函数这组函数用于生成和注册用户自己定义的TCL扩展命令及管理TCL命令的结果。
用户只有自己用C\C++语言编写了定义TCL命令的函数或过程,并注册,才能被解释器所识别和使用。
这里还应该区分两个概念:TCL命令结果和定义命令的C\C++函数或过程的返回值。
命令结果是执行TCL命令后,TCL解释器返回的命令执行结果,形式为字符串;而定义命令的C\C++函数或过程的返回值指的是我们编写的用来定义TCL命令的C\C++函数或过程的返回值,这些返回值已经在Tcl_Eval函数的说明中介绍了。
TCL命令的结果需要我们在定义TCL命令的C\C++函数或过程中给出,如果我们希望TCL命令执行后返回某个值,只要把这个值以字符串形式存入interp->result中,TCL解释器就会在执行这个命令后返回这个字符串形式的值。
1. Tcl_CreateCommand函数原型:void Tcl_CreateCommand(Tcl_Interp * interp, char * cmdName,Tcl_CmdProc * cmdProc, ClientData clientData,Tcl_CmdDeleteProc * deleteProc)这个函数在解释器interp中生成一个命令,并把它注册到这个解释器。
这样这个命令在这个解释器中就可以和TCL固有命令一样使用。
函数的第一个参数指向TCL解释器,第二个参数是一个字符串,代表命令名,第三个参数是一个函数指针,指向你用C\C++写的定义该命令的函数或过程,第四个参数指向你希望传给你的函数或过程的数据对象,第四个参数也是一个函数指针,指向一个回调函数,当你删除这个命令时,解释器会自动激活这个过程。
tcl.h中对Tcl_CmdProc的定义如下:typedef int Tcl_CmdProc(ClientData clientData,Tcl_Interp *interp, int argc,char *argv[]);其中:typedef void * ClientData;每一个用C\C++写的定义命令的函数或过程必须为上面的形式:第一个参数实际上是一个void指针,可以指向任何数据类型,这里指向用户需要传给那些函数或过程的数据对象,第二个参数指向解释器,第三个参数代表这个命令的参数个数(包括命令名本身),第四个参数是一个字符串数组,其中保存各个参数的字符串形式的值。
返回值为整数,只能为 TCL_OK、TCL_ERROR 、TCL_BREAK、TCL_CONTINUE 、TCL_RETURN其中之一,这在上面已经介绍过。
2. Tcl_DeleteCommand函数原型: int Tcl_DeleteCommand(Tcl_Interp *interp, char *cmdName)这个函数从解释器中删除一个命令,同时激活该命令对应的回调函数。
我们在利用C\C++编写TCL扩展命令过程时,一般可以通过把interp->result指向一个字符串或使用 sprintf 函数来设置命令的执行结果。
但是interp->result的缺省大小只有200字节,如果命令结果太长就会出错。
因此TCL提供了以下库函数来供用户管理命令结果:3. Tcl_SetResult 函数原型:Tcl_SetResult(Tcl_Interp *interp, char *string,Tcl_FreeProc* freeProc)这个函数的第一个参数是一个TCL解释器,第二个参数是一个将作为命令结果的字符串,第三个参数是一个函数指针,定义如下:typedef void (Tcl_FreeProc)(char *blockPtr)第三个参数的值可以为:TCL_STATIC :这表示string是静态的,Tcl_SetResult只简单的把它的指针存入interp->result TCL_VOLATITLE:表示string会改变,Tcl_SetResult会把它复制到interp->result,如果string太长,会重新分配内存。
TCL_DYNAMIC:表示string是用malloc分配的内存,并成为TCL的一个属性:Tcl_SetResult 将把interp->freeproc设置 free 以释放内存。