⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclnamesp.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
 *	*simpleNamePtr to point to an empty string. * *	If there is an error, this procedure returns TCL_ERROR. If "flags" *	contains TCL_LEAVE_ERR_MSG, an error message is returned in the *	interpreter's result object. Otherwise, the interpreter's result *	object is left unchanged. * *	*actualCxtPtrPtr is set to the actual context namespace. It is *	set to the input context namespace pointer in cxtNsPtr. If cxtNsPtr *	is NULL, it is set to the current namespace context. * * Side effects: *	If flags contains TCL_LEAVE_ERR_MSG and an error is encountered, *	the interpreter's result object will contain an error message. * *---------------------------------------------------------------------- */intTclGetNamespaceForQualName(interp, qualName, cxtNsPtr, flags,	nsPtrPtr, altNsPtrPtr, actualCxtPtrPtr, simpleNamePtr)    Tcl_Interp *interp;		 /* Interpreter in which to find the				  * namespace containing qualName. */    register char *qualName;	 /* A namespace-qualified name of an				  * command, variable, or namespace. */    Namespace *cxtNsPtr;	 /* The namespace in which to start the				  * search for qualName's namespace. If NULL				  * start from the current namespace.				  * Ignored if TCL_GLOBAL_ONLY or				  * TCL_NAMESPACE_ONLY are set. */    int flags;			 /* Flags controlling the search: an OR'd				  * combination of TCL_GLOBAL_ONLY,				  * TCL_NAMESPACE_ONLY,				  * CREATE_NS_IF_UNKNOWN, and				  * FIND_ONLY_NS. */    Namespace **nsPtrPtr;	 /* Address where procedure stores a pointer				  * to containing namespace if qualName is				  * found starting from *cxtNsPtr or, if				  * TCL_GLOBAL_ONLY is set, if qualName is				  * found in the global :: namespace. NULL				  * is stored otherwise. */    Namespace **altNsPtrPtr;	 /* Address where procedure stores a pointer				  * to containing namespace if qualName is				  * found starting from the global ::				  * namespace. NULL is stored if qualName				  * isn't found starting from :: or if the				  * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY,				  * CREATE_NS_IF_UNKNOWN, FIND_ONLY_NS flag				  * is set. */    Namespace **actualCxtPtrPtr; /* Address where procedure stores a pointer				  * to the actual namespace from which the				  * search started. This is either cxtNsPtr,				  * the :: namespace if TCL_GLOBAL_ONLY was				  * specified, or the current namespace if				  * cxtNsPtr was NULL. */    char **simpleNamePtr;	 /* Address where procedure stores the				  * simple name at end of the qualName, or				  * NULL if qualName is "::" or the flag				  * FIND_ONLY_NS was specified. */{    Interp *iPtr = (Interp *) interp;    Namespace *nsPtr = cxtNsPtr;    Namespace *altNsPtr;    Namespace *globalNsPtr = iPtr->globalNsPtr;    register char *start, *end;    char *nsName;    Tcl_HashEntry *entryPtr;    Tcl_DString buffer;    int len, result;    /*     * Determine the context namespace nsPtr in which to start the primary     * search. If TCL_NAMESPACE_ONLY or FIND_ONLY_NS was specified, search     * from the current namespace. If the qualName name starts with a "::"     * or TCL_GLOBAL_ONLY was specified, search from the global     * namespace. Otherwise, use the given namespace given in cxtNsPtr, or     * if that is NULL, use the current namespace context. Note that we     * always treat two or more adjacent ":"s as a namespace separator.     */    if (flags & (TCL_NAMESPACE_ONLY | FIND_ONLY_NS)) {	nsPtr = (Namespace *) Tcl_GetCurrentNamespace(interp);    } else if (flags & TCL_GLOBAL_ONLY) {	nsPtr = globalNsPtr;    } else if (nsPtr == NULL) {	if (iPtr->varFramePtr != NULL) {	    nsPtr = iPtr->varFramePtr->nsPtr;	} else {	    nsPtr = iPtr->globalNsPtr;	}    }    start = qualName;		/* pts to start of qualifying namespace */    if ((*qualName == ':') && (*(qualName+1) == ':')) {	start = qualName+2;	/* skip over the initial :: */	while (*start == ':') {            start++;		/* skip over a subsequent : */	}        nsPtr = globalNsPtr;        if (*start == '\0') {	/* qualName is just two or more ":"s */            *nsPtrPtr        = globalNsPtr;            *altNsPtrPtr     = NULL;	    *actualCxtPtrPtr = globalNsPtr;            *simpleNamePtr   = start; /* points to empty string */            return TCL_OK;        }    }    *actualCxtPtrPtr = nsPtr;    /*     * Start an alternate search path starting with the global namespace.     * However, if the starting context is the global namespace, or if the     * flag is set to search only the namespace *cxtNsPtr, ignore the     * alternate search path.     */    altNsPtr = globalNsPtr;    if ((nsPtr == globalNsPtr)	    || (flags & (TCL_NAMESPACE_ONLY | FIND_ONLY_NS))) {        altNsPtr = NULL;    }    /*     * Loop to resolve each namespace qualifier in qualName.     */    Tcl_DStringInit(&buffer);    end = start;    while (*start != '\0') {        /*         * Find the next namespace qualifier (i.e., a name ending in "::")	 * or the end of the qualified name  (i.e., a name ending in "\0").	 * Set len to the number of characters, starting from start,	 * in the name; set end to point after the "::"s or at the "\0".         */	len = 0;        for (end = start;  *end != '\0';  end++) {	    if ((*end == ':') && (*(end+1) == ':')) {		end += 2;	/* skip over the initial :: */		while (*end == ':') {		    end++;	/* skip over the subsequent : */		}		break;		/* exit for loop; end is after ::'s */	    }            len++;	}	if ((*end == '\0')	        && !((end-start >= 2) && (*(end-1) == ':') && (*(end-2) == ':'))) {	    /*	     * qualName ended with a simple name at start. If FIND_ONLY_NS	     * was specified, look this up as a namespace. Otherwise,	     * start is the name of a cmd or var and we are done.	     */	    	    if (flags & FIND_ONLY_NS) {		nsName = start;	    } else {		*nsPtrPtr      = nsPtr;		*altNsPtrPtr   = altNsPtr;		*simpleNamePtr = start;		Tcl_DStringFree(&buffer);		return TCL_OK;	    }	} else {	    /*	     * start points to the beginning of a namespace qualifier ending	     * in "::". end points to the start of a name in that namespace	     * that might be empty. Copy the namespace qualifier to a	     * buffer so it can be null terminated. We can't modify the	     * incoming qualName since it may be a string constant.	     */	    Tcl_DStringSetLength(&buffer, 0);            Tcl_DStringAppend(&buffer, start, len);            nsName = Tcl_DStringValue(&buffer);        }        /*	 * Look up the namespace qualifier nsName in the current namespace         * context. If it isn't found but CREATE_NS_IF_UNKNOWN is set,         * create that qualifying namespace. This is needed for procedures         * like Tcl_CreateCommand that cannot fail.	 */        if (nsPtr != NULL) {            entryPtr = Tcl_FindHashEntry(&nsPtr->childTable, nsName);            if (entryPtr != NULL) {                nsPtr = (Namespace *) Tcl_GetHashValue(entryPtr);            } else if (flags & CREATE_NS_IF_UNKNOWN) {		Tcl_CallFrame frame;				result = Tcl_PushCallFrame(interp, &frame,		        (Tcl_Namespace *) nsPtr, /*isProcCallFrame*/ 0);                if (result != TCL_OK) {                    Tcl_DStringFree(&buffer);                    return result;                }                nsPtr = (Namespace *) Tcl_CreateNamespace(interp, nsName,		        (ClientData) NULL, (Tcl_NamespaceDeleteProc *) NULL);                Tcl_PopCallFrame(interp);                if (nsPtr == NULL) {                    Tcl_DStringFree(&buffer);                    return TCL_ERROR;                }            } else {		/* namespace not found and wasn't created */                nsPtr = NULL;            }        }        /*         * Look up the namespace qualifier in the alternate search path too.         */        if (altNsPtr != NULL) {            entryPtr = Tcl_FindHashEntry(&altNsPtr->childTable, nsName);            if (entryPtr != NULL) {                altNsPtr = (Namespace *) Tcl_GetHashValue(entryPtr);            } else {                altNsPtr = NULL;            }        }        /*         * If both search paths have failed, return NULL results.         */        if ((nsPtr == NULL) && (altNsPtr == NULL)) {            *nsPtrPtr      = NULL;            *altNsPtrPtr   = NULL;            *simpleNamePtr = NULL;            Tcl_DStringFree(&buffer);            return TCL_OK;        }	start = end;    }    /*     * We ignore trailing "::"s in a namespace name, but in a command or     * variable name, trailing "::"s refer to the cmd or var named {}.     */    if ((flags & FIND_ONLY_NS)	    || ((end > start ) && (*(end-1) != ':'))) {	*simpleNamePtr = NULL; /* found namespace name */    } else {	*simpleNamePtr = end;  /* found cmd/var: points to empty string */    }    /*     * As a special case, if we are looking for a namespace and qualName     * is "" and the current active namespace (nsPtr) is not the global     * namespace, return NULL (no namespace was found). This is because     * namespaces can not have empty names except for the global namespace.     */    if ((flags & FIND_ONLY_NS) && (*qualName == '\0')	    && (nsPtr != globalNsPtr)) {	nsPtr = NULL;    }    *nsPtrPtr    = nsPtr;    *altNsPtrPtr = altNsPtr;    Tcl_DStringFree(&buffer);    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_FindNamespace -- * *	Searches for a namespace. * * Results: *	Returns a pointer to the namespace if it is found. Otherwise, *	returns NULL and leaves an error message in the interpreter's *	result object if "flags" contains TCL_LEAVE_ERR_MSG. * * Side effects: *	None. * *---------------------------------------------------------------------- */Tcl_Namespace *Tcl_FindNamespace(interp, name, contextNsPtr, flags)    Tcl_Interp *interp;		 /* The interpreter in which to find the				  * namespace. */    char *name;			 /* Namespace name. If it starts with "::",				  * will be looked up in global namespace.				  * Else, looked up first in contextNsPtr				  * (current namespace if contextNsPtr is				  * NULL), then in global namespace. */    Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag is set				  * or if the name starts with "::".				  * Otherwise, points to namespace in which				  * to resolve name; if NULL, look up name				  * in the current namespace. */    register int flags;		 /* Flags controlling namespace lookup: an				  * OR'd combination of TCL_GLOBAL_ONLY and				  * TCL_LEAVE_ERR_MSG flags. */{    Namespace *nsPtr, *dummy1Ptr, *dummy2Ptr;    char *dummy;    int result;    /*     * Find the namespace(s) that contain the specified namespace name.     * Add the FIND_ONLY_NS flag to resolve the name all the way down     * to its last component, a namespace.     */    result = TclGetNamespaceForQualName(interp, name,	    (Namespace *) contextNsPtr, /*flags*/ (flags | FIND_ONLY_NS),	    &nsPtr, &dummy1Ptr, &dummy2Ptr, &dummy);    if (result != TCL_OK) {        return NULL;    }    if (nsPtr != NULL) {       return (Tcl_Namespace *) nsPtr;    } else if (flags & TCL_LEAVE_ERR_MSG) {	Tcl_ResetResult(interp);	Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "unknown namespace \"", name, "\"", (char *) NULL);    }    return NULL;}/* *---------------------------------------------------------------------- * * Tcl_FindCommand -- * *	Searches for a command. * * Results: *	Returns a token for the command if it is found. Otherwise, if it *	can't be found or there is an error, returns NULL and leaves an *	error message in the interpreter's result object if "flags" *	contains TCL_LEAVE_ERR_MSG. * * Side effects: *	None. * *---------------------------------------------------------------------- */Tcl_CommandTcl_FindCommand(interp, name, contextNsPtr, flags)    Tcl_Interp *interp;         /* The interpreter in which to find the				  * command and to report errors. */    char *name;		         /* Command's name. If it starts with "::",				  * will be looked up in global namespace.				  * Else, looked up first in contextNsPtr				  * (current namespace if contextNsPtr is				  * NULL), then in global namespace. */    Tcl_Namespace *contextNsPtr; /* Ignored if TCL_GLOBAL_ONLY flag set.				  * Otherwise, points to namespace in which				  * to resolve name. If NULL, look up name				  * in the current namespace. */    int flags;                   /* An OR'd combination of flags:				  * TCL_GLOBAL_ONLY (look up name only in				  * global namespace), TCL_NAMESPACE_ONLY				  * (look up only in contextNsPtr, or the				  * current namespace if contextNsPtr is				  * NULL), and TCL_LEAVE_ERR_MSG. If both				  * TCL_GLOBAL_ONLY and TCL_NAMESPACE_ONLY				  * are given, TCL_GLOBAL_ONLY is				  * ignored. */{    Interp *iPtr = (Interp*)interp;    ResolverScheme *resPtr;    Namespace *nsPtr[2], *cxtNsPtr;    char *simpleName;    register Tcl_HashEntry *entryPtr;    register Command *cmdPtr;    register int search;    int result;    Tcl_Command cmd;    /*     * If this namespace has a command resolver, then give it first     * crack at the command resolution.  If the interpreter has any     * command resolvers, consult them next.  The command resolver     * procedure

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -