目 录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 以释放内存。
一个Tcl_FreeProc类型的函数:表示string是动态分配的, TCL最终会调用这个函数来释放内存。
4. Tcl_AppendResult 函数
原型:Tcl_AppendResult(Tcl_Interp *interp, char *string,char *string, ... (char *) NULL)
这个函数是具有可变个数参数的函数,必须以NULL作为最后一个参数,标记参数结束,它把所有的string参数按顺序添加到interp->result中。
5. Tcl_AppendElement 函数
原型:Tcl_AppendElement(Tcl_Interp *interp, char *string)
使用这个函数时,命令结果应是一个链表,它把string参数作为链表的一个元素添加到interp->result中。这个函数当需要生成一个链表时很有用。
6. Tcl_ResetResult 函数
原型:Tcl_ResetResult(Tcl_Interp *interp)
这个函数把interp->result清空。
4分析函数
这组函数用于对命令的参数进行分析,是最常用到的库函数。前面已经介绍过,每一个定义TCL命令的C\C++函数或过程都有参数argc和argv,TCL解释器在解释执行TCL命令时,会把命令的参数个数和参数的字符串形式传给定义这个命令的C\C++函数的argc和argv参数,并执行这些函数或过程。因为所有参数以字符串形式传递,所以我们需要对它们进行分析,从而会用到以下函数:
字符串常量池原理1.Tcl_GetInt函数
原型:int Tcl_GetInt(Tcl_Interp *interp, char *string, int *intPtr)
这个函数把string作为一个整数分析,值存在*intPtr中。成功返回TCL_OK ,失败返回
TCL_ERROR,并把错误信息存在interp->result中。
2. Tcl_GetDouble函数
原型:int Tcl_GetDouble(Tcl_Interp *interp, char *string, double *doublePtr)
这个函数把string作为一个浮点数分析,值存在*doublePtr中。成功返回TCL_OK ,失败返回TCL_ERROR,并把错误信息存在interp->result中。
3. Tcl_GetBoolean函数
原型:int Tcl_GetBoolean(Tcl_Interp *interp, char *string, int *intPtr)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论