admin 管理员组

文章数量: 1184232


2024年3月8日发(作者:ckeditor什么意思)

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------目 录1初始化函数..............................................................2解释器的生成和删除及TCL脚本的求值函数......................................3命令生成和删除函数及结果处理函数...........................................4分析函数................................................................5总结...................................................................223576访问TCL变量的函数.......................................................77Hash表操作函数..........................................................98字符串操作函数.........................................................109TCL库函数的最新情况....................................................11第 1 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------TCL库函数介绍(一)关键词:TCL摘 要:本文旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。为了让用户能方便地扩展TCL命令,TCL为用户提供了大量的库函数供用户使用,满足用户各方面的需要。用户可以在用CC++语言编写扩展的TCL命令过程或函数时,调用这些库函数。要真正理解这些库函数的用法,最佳途径是参照一些例子,并实际使用。在我的一篇文档《TCL的使用 》中有一些这些函数的使用的例子。下面分类对TCL的库函数进行介绍。1初始化函数这组函数用于用户初始化应用。_Init函数原型: int Tcl_Init (Tcl_Interp *interp)参数interp是一个指向TCL解释器的指针。Tcl_Init函数只作一些简单的初始化工作,没多大的用处。不过,用户一般需要提供自己的初始化函数,原型与Tcl_Init一样,在这个函数中,要作应用的初始化工作,如注册自己的TCL扩展命令,生成自己需要的数据对象等。这个函数必须在生成TCL解释器后才能调用。生成TCL解释器可以调用Tcl_CreateInterp函数,另外Tcl_Main函数中也会自动生成TCL解释器。_Main函数原型:void Tcl_Main (int argc, char **argv,Tcl_AppInitProc *appInitProc)如果用到这个函数的话,应该在你的CC++程序的main函数中调用,它的前两个参数和main函数的两个参数一样,第三个参数是一个函数指针,指向一个初始化函数,其原型和Tcl_Init一样。如果程序没有任何命令行参数,Tcl_Main调用appInitProc初始化函数,并启动一个TCL的命令解释循环,建立一个交互环境,等待你输入TCL命令和脚本并解释执行。如果程序有命令行参数,那它先调用appInitProc函数作一些初始化工作,然后把第一个命令行参数作为TCL脚本文件名,并求值返回,其余参数不予理会。2解释器的生成和删除及TCL脚本的求值函数这组函数提供生成和删除TCL解释器及对TCL脚本进行求值的功能。每一个TCL应用,都必须拥有至少一个TCL解释器,事实上几乎所有的TCL库函数都有一个指向TCL解释器的指针的参数。每一个扩展的TCL命令都和特定的TCL解释器相关联,只有在对该命令进行了注册的TCL解释器中,这个命令才是有效的,才能被解释执行。_CreateInterp函数原型:Tcl_Interp *Tcl_CreateInterp(void)第 2 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------这个函数生成一个新的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命令的结果。用户只有自己用CC++语言编写了定义TCL命令的函数或过程,并注册,才能被解释器所识别和使用。这里还应该区分两个概念:TCL命令结果和定义命令的CC++函数或过程的返回值。命令结果是执行TCL命令后,TCL解释器返回的命令执行结果,形式为字符串;而定义命令的CC++函数或过程的返回值第 3 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------指的是我们编写的用来定义TCL命令的CC++函数或过程的返回值,这些返回值已经在Tcl_Eval函数的说明中介绍了。TCL命令的结果需要我们在定义TCL命令的CC++函数或过程中给出,如果我们希望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解释器,第二个参数是一个字符串,代表命令名,第三个参数是一个函数指针,指向你用CC++写的定义该命令的函数或过程,第四个参数指向你希望传给你的函数或过程的数据对象,第四个参数也是一个函数指针,指向一个回调函数,当你删除这个命令时,解释器会自动激活这个过程。tcl.h中对Tcl_CmdProc的定义如下:typedef int Tcl_CmdProc(ClientData clientData,Tcl_Interp *interp, int argc,char *argv[]);其中:typedef void * ClientData;每一个用CC++写的定义命令的函数或过程必须为上面的形式:第一个参数实际上是一个void指针,可以指向任何数据类型,这里指向用户需要传给那些函数或过程的数据对象,第二个参数指向解释器,第三个参数代表这个命令的参数个数(包括命令名本身),第四个参数是一个字符串数组,其中保存各个参数的字符串形式的值。返回值为整数,只能为 TCL_OK、TCL_ERROR 、TCL_BREAK、TCL_CONTINUE 、TCL_RETURN其中之一,这在上面已经介绍过。2. Tcl_DeleteCommand函数原型: int Tcl_DeleteCommand(Tcl_Interp *interp, char *cmdName)这个函数从解释器中删除一个命令,同时激活该命令对应的回调函数。我们在利用CC++编写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->resultTCL_VOLATITLE:表示string会改变,Tcl_SetResult会把它复制到interp->result,如果

string太长,会重新分配内存。第 4 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------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命令的CC++函数或过程都有参数argc和argv,TCL解释器在解释执行TCL命令时,会把命令的参数个数和参数的字符串形式传给定义这个命令的CC++函数的argc和argv参数,并执行这些函数或过程。因为所有参数以字符串形式传递,所以我们需要对它们进行分析,从而会用到以下函数:_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)第 5 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------这个函数把string作为一个BOOL值分析,并把01存在*intPtr中。成功返回TCL_OK ,失败返回TCL_ERROR,并把错误信息存在interp->result中。4. Tcl_ExprString函数原型:int Tcl_ExprString(Tcl_Interp *interp, char *string)这个函数把string作为一个表达式求值,成功返回TCL_OK并把值作为一个字符串存入interp->result,失败返回TCL_ERROR,并把错误信息存在interp->result中5. Tcl_ExprLong函数原型:int Tcl_ExprLong(Tcl_Interp *interp, char *string, long *longPtr)这个函数同Tcl_ExprString,只是把结果作为一个长整型存入*longPtr,当值不能转换成一个整数时,发生错误。6. Tcl_ExprDouble函数原型:int Tcl_ExprDouble(Tcl_Interp *interp, char *string,double *doublePtr)这个函数同Tcl_ExprString,只是把结果作为一个浮点数存入*doublePtr,当值不能转换成一个浮点数 时,发生错误。7. Tcl_ExprBoolean函数原型:int Tcl_ExprBoolean(Tcl_Interp *interp, char *string, int * intPtr)这个函数同Tcl_ExprString,只是把结果作为01存入*intPtr,当值不能转换成一个BOOL值 时 , 发生错误。8. Tcl_SplitList函数原型:int Tcl_SplitList(Tcl_Interp *interp, char *list, int *argcPtr,char ***argvPtr)这个函数把list作为一个链表进行分析,并生成一个字符串数组,数组的元素是链表的元素。成功返回TCL_OK ,链表元素的个数存入*argcPtr,并把argvPtr指向生成的数组。失败返回TCL_ERROR,并把错误信息存在interp->result中。字符串数组的空间是动态分配的,必须由调用者释放。9. Tcl_Merge函数原型:char *Tcl_Merge(int argc, char **argv)这个函数是Tcl_SplitList的逆过程,返回指向生成的TCL链表的指针。链表的储存空间是动态分配的,调用者需要释放为链表分配的空间。5总结第 6 页,共 12 页

TCL库函数介绍---------------------------------------------------------------------------------------------------------------------------------------------------- 这篇文章介绍了TCL库中的常用到的几类函数,并结合自己的实际使用经验作了较为详细的说明,相信会给用户使用CC++编写自己的TCL扩展命令带来一定的帮助。以后将陆续介绍所有的TCL库函数,以推动TCL的应用。TCL库函数介绍(二)关键词:TCL摘 要: 本文承接TCL库函数介绍(一) ,旨在推广TCL的使用,通过分类介绍TCL的库函数的用法,让用户了解怎样利用这些库函数去编写TCL扩展命令。

6访问TCL变量的函数这组函数提供了在C代码中生成、修改、读取和删除TCL变量的手段。而且还提供了监视和限制变量访问的机制。这组函数是使用很频繁的一组函数。1. Tcl_SetVar函数原型:char *Tcl_SetVar (Tcl_Interp *interp, char *varName, char *newValue, int flags)这个函数把名为变量varName的变量的值设置为newValue,如果这个变量还不存在就声明这个变量。这个函数对变量操作的运行时刻上下文是这样的:如果这个操作发生在一个过程的运行中,那么这个操作针对的是这个过程的局部变量;否则这个操作针对的是一个全局变量。如果这个操作成功完成,函数返回指向这个变量的新值的指针。如果发生了错误,那么返回NULL。函数最后一个参数flags的取值可以为以下几个值中的一个或几个,中间以位操作符|连接:TCL_GLOBAL_ONLY:表示这个操作总是针对全局变量varName的。TCL_LEAVE_ERR_MSG:表示如果操作失败,错误信息保存在interp->result中。TCL_APPEND_VALUE:表示把newValue的值附加到以前的值后面,不覆盖原来的值。TCL_LIST_ELEMENT:表示在设置或附加newValue的值之前,把它转换为链表的元素。注意:如果varName是带括号的形式,如:a(b),那么这个函数将设置或生成一个数组元素,括号前的a将作为一个数组名,而括号中的b将作为数组元素的索引值。2. Tcl_SetVar2函数原型:char *Tcl_SetVar2(Tcl_Interp *interp, char *name1,char *name2 , char *newValue, int flags)这个函数功能与Tcl_SetVar函数类似。如果name2为NULL,那么它和Tcl_SetVar函数的功能完全一样。如果name2不为空,那么name1不能是带括号的形式(如: a(b)〕,这时name1作为数组名,而name2作为数组元素的索引。其余情况完全同Tcl_SetVar函数,事实上Tcl_SetVar函数的实现中只是简单的调用了Tcl_SetVar2函数。3. Tcl_GetVar函数原型: char *Tcl_GetVar(Tcl_Interp *interp, char *varName,int flags)这个函数用来获取变量varName的值,用法可以完全参考Tcl_SetVar,不过flags只支持TCL_GLOBAL_ONLY和TCL_LEAVE_ERR_MSG,这应该是很自然的事情。4. Tcl_GetVar2 函数原型: char *Tcl_GetVar2(Tcl_Interp *interp , char *name1 , char *name2 , int flags)第 7 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------这个函数的用法与Tcl_GetVar的区别同Tcl_SetVar和Tcl_SetVar2的区别。5. Tcl_UnsetVar函数原型:int Tcl_UnsetVar (Tcl_Interp *interp , char *varName , int flags)这个函数从TCL解释器interp中删除变量varName,如果操作成功,返回TCL_OK,如果因为变量varName不存在或其他原因不能删除,那么返回TCL_ERROR。如果varName是一个数组名,没有给出索引,那么整个数组都被删除。flags只支持TCL_GLOBAL_ONLY和TCL_LEAVE_ERR_MSG。6. Tcl_UnsetVar2函数原型:int Tcl_UnsetVar2 (Tcl_Interp *interp , char *name1 , char* name2, int flags)这个函数的用法与Tcl_UnsetVar的区别同Tcl_SetVar和Tcl_SetVar2的区别。7. Tcl_TraceVar函数原型: int Tcl_TraceVar(Tcl_Interp *interp, char *varName, int flags,

Tcl_VarTraceProc *proc, ClientData clientData)这个函数用于对变量进行跟踪,当读、写或删除一个变量时就会自动激活一个C过程。跟踪可以用于很多目的:如debug、生成只读变量等。 varName是要跟踪的变量名,flags可以是以下几个值中的一个或几个,中间用位操作符| 连接:TCL_TRACE_READS、TCL_TRACE_WRITES、TCL_TRACE_UNSETS和TCL_GLOBAL_ONLY,其含义一目了然。 clientData是回调函数proc中会用到的数据对象。proc是当用户对varName作flags中指定的操作时,被激活的回调函数,其原型必须和以下定义匹配:typedef char *Tcl_VarTraceProc(ClientData clientData , Tcl_Interp *interp , char *name1 , char *name2 , int flags);其中clientData、interp两个参数就指向Tcl_TraceVar中对应的参数,name1和name2两个参数给出要被跟踪的变量名,其含义同Tcl_SetVar2中的name1和name2。对于读操作,回调函数在Tcl_GetVar和Tcl_GetVar2 返回之前被激活,如果在回调函数中改变了变量的值,那么这个被修改了的值将被返回。对于写操作,回调函数当变量的值被修改后被激活,回调函数可以修改变量的值,并且这个值将作为Tcl_SetVar和Tcl_SetVar2 的结果。对于删除操作,回调函数在变量被删除之后被激活,所以在回调函数中不能访问这个变量。在变量跟踪的回调函数中可以调用Tcl_GetVar2 和Tcl_SetVar2 函数来读写被跟踪的变量,在回调函数中所有对变量的跟踪都被临时关掉了,所以对Tcl_GetVar2 和Tcl_SetVar2的调用不会激活回调函。回调函数成功返回NULL,失败返回包含错误信息的串。8. Tcl_TraceVar2 函数原型: int Tcl_TraceVar2 (Tcl_Interp *interp, char * name1,char* name2, int flags,

Tcl_VarTraceProc *proc, ClientData clientData)这个函数的用法与Tcl_TraceVar的区别同Tcl_SetVar和Tcl_SetVar2 的区别。9. Tcl_UntraceVar函数原型:Tcl_UntraceVar (Tcl_Interp *interp, char *varName,int flags,

Tcl_VarTraceProc *proc, ClientData clientData)第 8 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------这个函数把对一个变量的跟踪取消。各个参数的含义同Tcl_TraceVar。10. Tcl_UntraceVar2 函数原型:Tcl_UntraceVar2 (Tcl_Interp *interp, char *name1,char *name2,int flags,

Tcl_VarTraceProc *proc, ClientData clientData)这个函数的用法与Tcl_UntraceVar的区别同Tcl_SetVar和Tcl_SetVar2 的区别。11. Tcl_VarTraceInfo 函数原型: ClientData Tcl_VarTraceInfo (Tcl_Interp *interp, char *varName,int flags, Tcl_VarTraceProc *proc, ClientData prevClientData)这个函数用于获取变量varName的跟踪信息。注意,flags的值只有TCL_GLOBAL_ONLY有效。如果prevClientData是NULL,那么函数返回最近一次变量的跟踪消息,没有跟踪消息就返回NULL。如果prevClientData非空,那么必须是上一次Tcl_VarTraceInfo的返回值,利用Tcl_VarTraceInfo,我们可以递归得到变量的所有跟踪信息。12. Tcl_VarTraceInfo2 函数原型: ClientData Tcl_VarTraceInfo2 (Tcl_Interp *interp, char *name1,char* name2,int flags, Tcl_VarTraceProc *proc, ClientData prevClientData)这个函数的用法类似于Tcl_VarTraceInfo,区别同Tcl_SetVar和Tcl_SetVar2 的区别。7Hash表操作函数Hash表是由一个个入口(entry)组成的,每个入口包含一个关键码(key)和一个值值(value),在一个Hash表中关键码是唯一的,任意两个入口都必须有不同的关键码。通过关键码,Hash表可以快速找到它对应的入口和与之关联的值。Hash表对需要维护大量的数据并希望快速定位数据的应用程序是必不可少的。TCL通过一些库函数为用户提供了操作Hash表的能力。1. Tcl_InitHashTable函数原型:void Tcl_InitHashTable(Tcl_HashTable *tablePtr, int keyType)这个函数生成一个新的Hash表,并且把表的信息存储在*tablePtr中,keyType表示关键码的类型,其取值可以为以下几个:TCL_STRING_KEYS:表示关键码是字符串。TCL_ONE_WORD_KEYS:表示关键码是一个single-world大小的值,如整数。其他:关键码的最后一种形式是整数数组,这时keyType指明整数数组中整数的个数,注意这时数组的大小必须一样。2. Tcl_DeleteHashTable函数原型:void Tcl_DeleteHashTable(Tcl_HashTable *tablePtr)这个函数删除Hash表上的所有入口(entry),并释放相关的内存空间。3. Tcl_CreateHashEntry函数原型:void Tcl_HashEntry *Tcl_CreateHashEntry(Tcl_HashTable *tablePtr,char *key,int *newPtr)这个函数生成Hash表tablePtr的一个关键码为key的新入口,如果新入口成功生成,那么newPtr被设置为1,否则设置为0。第 9 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------4. Tcl_FindHashEntry函数原型:Tcl_HashEntry * Tcl_FindHashEntry(Tcl_HashTable *tablePtr, char *key)这个函数在Hash表tablePtr中寻找关键码为key的入口,找到返回指向入口的指针,否则返回NULL。5. Tcl_DeleteHashEntry函数原型:Tcl_DeleteHashEntry(Tcl_HashEntry *entryPtr)这个函数把入口entryPtr从它所在的Hash表中删除。6. Tcl_GetHashValue函数原型:ClientData Tcl_GetHashValue(Tcl_HashEntry *entryPtr)这个函数从入口entryPtr中得到对应的值。7. Tcl_SetHashValue函数原型:voidTcl_SetHashValue (Tcl_HashEntry *entryPtr, ClientData value)这个函数把value中的值设置到入口entryPtr中。8. Tcl_GetHashKey函数原型:char *Tcl_GetHashKey(Tcl_HashEntry *entryPtr)这个函数从入口entryPtr中获取关键码,返回关键码的字符串形式。9. Tcl_FirstHashEntry函数原型:Tcl_HashEntry *Tcl_FirstHashEntry(Tcl_HashTable *tablePtr,Tcl_HashSearch *searchPtr)这个函数开始搜索整个tablePtr指向的Hash表的元素,把搜索信息存放在searchPtr中,并返回Hash表的第一个入口,如果Hash表为空返回NULL。10. Tcl_NextHashEntry函数原型:Tcl_HashEntry *Tcl_NextHashEntry(Tcl_HashSearch *searchPtr)这个函数返回searchPtr中的下一个入口,如果所有入口都已返回就返回NULL。这个函数和Tcl_FirstHashEntry函数配合可以遍历整个Hash表的入口。11. Tcl_HashStats函数原型: char *Tcl_HashStats(Tcl_HashTable *tablePtr)这个函数用于获取Hash表tablePtr中入口的分布情况,分布情况以字符串形式返回。8字符串操作函数TCL提供的这组字符串操作函数,可以实现动态字符串,字符串匹配和判断一个命令是否完整。1. void Tcl_DStringInit函数原型:Tcl_DStringInit(Tcl_DString *dsPtr)这个函数把dsPtr清空。 Tcl_DString是TCL定义的一个结构,用来表示一个动态字符串。2. void Tcl_DStringAppend函数原型:char *Tcl_DStringAppend(Tcl_DString *dsPtr, char *string, int length)这个函数把字符串string中的length个字符附加到dsPtr之后,并返回dsPtr的新值。如果length小于0,那么把string(包含NULL〕全附加到dsPtr之后。第 10 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------3. void Tcl_DStringAppendElement函数原型: char *Tcl_DStringAppendElement(Tcl_DString *dsPtr, char *string)这个函数把string转换成一个list成员并附加到dsPtr中(如果需要会加上一个分隔符〕。返回值为dsPtr的新值。4. voidTcl_DStringFree函数原型:Tcl_DStringFree(Tcl_DString *dsPtr)这个函数释放dsPtr中分配的所有内存,并把dsPtr置为空。5. void Tcl_DStringResult函数原型: Tcl_DStringResult(Tcl_Interp *interp, Tcl_DString *dsPtr)这个函数把dsPtr的值传给interp->result,并重新初始化dsPtr,把它置为空。6. Tcl_CommandComplete函数原型:int Tcl_CommandComplete(char *cmd)这个函数用于检查命令cmd是否完整,它会自动检查命令的参数个数及括号配对的情况,命令完整返回1,否则返回0。7。 int Tcl_StringMatch(char *string, char *pattern)如果字符串string匹配模式pattern,返回1,否则返回0。9TCL库函数的最新情况以上介绍的都是TCL7.6版本的库函数。在这些函数的内部实现中,所有的变量及其值都是以字符串形式来访问的,而使用字符串形式必然会涉及到频繁的字符串的比较和转换,降低TCL的解释执行速度。在TCL8.1以上版本,对函数的内部实现作了一些改进,以一个新的结构Tcl_Obj来代替了单纯的字符串表示。利用这个结构,可以一方面保持TCL库函数的前向兼容,另一方面可以提高TCL解释执行的速度。下面对Tcl_Obj结构作一介绍。在TCL中,Tcl_Obj结构定义如下:typedef struct Tcl_Obj {int refCount;char *bytes;int length;Tcl_ObjType *typePtr;union {long longValue;double doubleValue;VOID *otherValuePtr;struct {VOID *ptr1;VOID *ptr2;} twoPtrValue;} internalRep;第 11 页,共 12 页

TCL库函数介绍----------------------------------------------------------------------------------------------------------------------------------------------------} Tcl_Obj;仔细研究这个结构,你会发现实际上这个结构中对一个对象用了两种表示方法:1.字符串形式的表示:这由bytes和length两个分量来表示。字符串形式也是对象的外在表示形式,因为在TCL语言级,一切都看作字符串。但bytes为空是表示字符串表示形式无效。2.对象的实际的类型: typePtr 结构表示对象的实际类型,联合类型internalRep用来存储对象的值。当typePtr为空时,表示这种表示方法无效。采用了这种内部表示,TCL可以当需要字符串形式时,就输出Tcl_Obj的字符串形式,需要对象的实际类型时就输出实际类型的值。其实现原理是:两种表示方法互相关联,每次修改了两种表示中的一种,并不立即修改另一种表示,而是把另外一种表示标记为无效。只有当需要另一种表示,才从改变了的那种表示转换得到所需要的表示。TCL试图利用这种方法来减少在运行时的转换工作,提高执行效率。但是这也给用户在使用上带来了不便,用户需要自己控制两种方式的有效无效状态,当然这只是对扩展TCL命令的语言的用户而言。虽然TCL的8.1以上版本作了扩展,但使用以前的函数并不受任何影响。对于如何使用Tcl_Obj结构及与之相关的库函数来扩展TCL命令,将在参考了相关资料及充分实践的基础上作详细的介绍。第 12 页,共 12 页


本文标签: 函数 命令 参数 字符串 变量