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

📄 tclload.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
	    goto done;	}	/*	 * Create a new record to describe this package.	 */	if (firstPackagePtr == NULL) {	    Tcl_CreateExitHandler(LoadExitProc, (ClientData) NULL);	}	pkgPtr = (LoadedPackage *) ckalloc(sizeof(LoadedPackage));	pkgPtr->fileName = (char *) ckalloc((unsigned)		(strlen(fullFileName) + 1));	strcpy(pkgPtr->fileName, fullFileName);	pkgPtr->packageName = (char *) ckalloc((unsigned)		(Tcl_DStringLength(&pkgName) + 1));	strcpy(pkgPtr->packageName, Tcl_DStringValue(&pkgName));	pkgPtr->initProc = initProc;	pkgPtr->safeInitProc = safeInitProc;	pkgPtr->nextPtr = firstPackagePtr;	firstPackagePtr = pkgPtr;    }    /*     * Invoke the package's initialization procedure (either the     * normal one or the safe one, depending on whether or not the     * interpreter is safe).     */    if (Tcl_IsSafe(target)) {	if (pkgPtr->safeInitProc != NULL) {	    code = (*pkgPtr->safeInitProc)(target);	} else {	    Tcl_AppendResult(interp,		    "can't use package in a safe interpreter: ",		    "no ", pkgPtr->packageName, "_SafeInit procedure",		    (char *) NULL);	    code = TCL_ERROR;	    goto done;	}    } else {	code = (*pkgPtr->initProc)(target);    }    if ((code == TCL_ERROR) && (target != interp)) {	/*	 * An error occurred, so transfer error information from the	 * destination interpreter back to our interpreter.  Must clear	 * interp's result before calling Tcl_AddErrorInfo, since	 * Tcl_AddErrorInfo will store the interp's result in errorInfo	 * before appending target's $errorInfo;  we've already got	 * everything we need in target's $errorInfo.	 */	/*         * It is (abusively) assumed that errorInfo and errorCode vars exists.         * we changed SetVar2 to accept NULL values to avoid crashes. --dl	 */	Tcl_ResetResult(interp);	Tcl_AddErrorInfo(interp, Tcl_GetVar2(target,		"errorInfo", (char *) NULL, TCL_GLOBAL_ONLY));	Tcl_SetVar2(interp, "errorCode", (char *) NULL,		Tcl_GetVar2(target, "errorCode", (char *) NULL,		TCL_GLOBAL_ONLY), TCL_GLOBAL_ONLY);	Tcl_SetResult(interp, target->result, TCL_VOLATILE);    }    /*     * Record the fact that the package has been loaded in the     * target interpreter.     */    if (code == TCL_OK) {	/*	 * Refetch ipFirstPtr: loading the package may have introduced	 * additional static packages at the head of the linked list!	 */	ipFirstPtr = (InterpPackage *) Tcl_GetAssocData(target, "tclLoad",		(Tcl_InterpDeleteProc **) NULL);	ipPtr = (InterpPackage *) ckalloc(sizeof(InterpPackage));	ipPtr->pkgPtr = pkgPtr;	ipPtr->nextPtr = ipFirstPtr;	Tcl_SetAssocData(target, "tclLoad", LoadCleanupProc,		(ClientData) ipPtr);    }    done:    Tcl_DStringFree(&pkgName);    Tcl_DStringFree(&initName);    Tcl_DStringFree(&safeInitName);    Tcl_DStringFree(&fileName);    return code;}/* *---------------------------------------------------------------------- * * Tcl_StaticPackage -- * *	This procedure is invoked to indicate that a particular *	package has been linked statically with an application. * * Results: *	None. * * Side effects: *	Once this procedure completes, the package becomes loadable *	via the "load" command with an empty file name. * *---------------------------------------------------------------------- */voidTcl_StaticPackage(interp, pkgName, initProc, safeInitProc)    Tcl_Interp *interp;			/* If not NULL, it means that the					 * package has already been loaded					 * into the given interpreter by					 * calling the appropriate init proc. */    char *pkgName;			/* Name of package (must be properly					 * capitalized: first letter upper					 * case, others lower case). */    Tcl_PackageInitProc *initProc;	/* Procedure to call to incorporate					 * this package into a trusted					 * interpreter. */    Tcl_PackageInitProc *safeInitProc;	/* Procedure to call to incorporate					 * this package into a safe interpreter					 * (one that will execute untrusted					 * scripts).   NULL means the package					 * can't be used in safe					 * interpreters. */{    LoadedPackage *pkgPtr;    InterpPackage *ipPtr, *ipFirstPtr;    /*     * Check to see if someone else has already reported this package as     * statically loaded.  If this call is redundant then just return.     */    for (pkgPtr = firstPackagePtr; pkgPtr != NULL; pkgPtr = pkgPtr->nextPtr) {	if ((pkgPtr->initProc == initProc)		&& (pkgPtr->safeInitProc == safeInitProc)		&& (strcmp(pkgPtr->packageName, pkgName) == 0)) {	    return;	}    }    if (firstPackagePtr == NULL) {	Tcl_CreateExitHandler(LoadExitProc, (ClientData) NULL);    }    pkgPtr = (LoadedPackage *) ckalloc(sizeof(LoadedPackage));    pkgPtr->fileName = (char *) ckalloc((unsigned) 1);    pkgPtr->fileName[0] = 0;    pkgPtr->packageName = (char *) ckalloc((unsigned)	    (strlen(pkgName) + 1));    strcpy(pkgPtr->packageName, pkgName);    pkgPtr->initProc = initProc;    pkgPtr->safeInitProc = safeInitProc;    pkgPtr->nextPtr = firstPackagePtr;    firstPackagePtr = pkgPtr;    if (interp != NULL) {	ipFirstPtr = (InterpPackage *) Tcl_GetAssocData(interp, "tclLoad",		(Tcl_InterpDeleteProc **) NULL);	ipPtr = (InterpPackage *) ckalloc(sizeof(InterpPackage));	ipPtr->pkgPtr = pkgPtr;	ipPtr->nextPtr = ipFirstPtr;	Tcl_SetAssocData(interp, "tclLoad", LoadCleanupProc,		(ClientData) ipPtr);    }}/* *---------------------------------------------------------------------- * * TclGetLoadedPackages -- * *	This procedure returns information about all of the files *	that are loaded (either in a particular intepreter, or *	for all interpreters). * * Results: *	The return value is a standard Tcl completion code.  If *	successful, a list of lists is placed in interp->result. *	Each sublist corresponds to one loaded file;  its first *	element is the name of the file (or an empty string for *	something that's statically loaded) and the second element *	is the name of the package in that file. * * Side effects: *	None. * *---------------------------------------------------------------------- */intTclGetLoadedPackages(interp, targetName)    Tcl_Interp *interp;		/* Interpreter in which to return				 * information or error message. */    char *targetName;		/* Name of target interpreter or NULL.				 * If NULL, return info about all interps;				 * otherwise, just return info about this				 * interpreter. */{    Tcl_Interp *target;    LoadedPackage *pkgPtr;    InterpPackage *ipPtr;    char *prefix;    if (targetName == NULL) {	/* 	 * Return information about all of the available packages.	 */	prefix = "{";	for (pkgPtr = firstPackagePtr; pkgPtr != NULL;		pkgPtr = pkgPtr->nextPtr) {	    Tcl_AppendResult(interp, prefix, (char *) NULL);	    Tcl_AppendElement(interp, pkgPtr->fileName);	    Tcl_AppendElement(interp, pkgPtr->packageName);	    Tcl_AppendResult(interp, "}", (char *) NULL);	    prefix = " {";	}	return TCL_OK;    }    /*     * Return information about only the packages that are loaded in     * a given interpreter.     */    target = Tcl_GetSlave(interp, targetName);    if (target == NULL) {	Tcl_AppendResult(interp, "couldn't find slave interpreter named \"",		targetName, "\"", (char *) NULL);	return TCL_ERROR;    }    ipPtr = (InterpPackage *) Tcl_GetAssocData(target, "tclLoad",	    (Tcl_InterpDeleteProc **) NULL);    prefix = "{";    for ( ; ipPtr != NULL; ipPtr = ipPtr->nextPtr) {	pkgPtr = ipPtr->pkgPtr;	Tcl_AppendResult(interp, prefix, (char *) NULL);	Tcl_AppendElement(interp, pkgPtr->fileName);	Tcl_AppendElement(interp, pkgPtr->packageName);	Tcl_AppendResult(interp, "}", (char *) NULL);	prefix = " {";    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * LoadCleanupProc -- * *	This procedure is called to delete all of the InterpPackage *	structures for an interpreter when the interpreter is deleted. *	It gets invoked via the Tcl AssocData mechanism. * * Results: *	None. * * Side effects: *	Storage for all of the InterpPackage procedures for interp *	get deleted. * *---------------------------------------------------------------------- */static voidLoadCleanupProc(clientData, interp)    ClientData clientData;	/* Pointer to first InterpPackage structure				 * for interp. */    Tcl_Interp *interp;		/* Interpreter that is being deleted. */{    InterpPackage *ipPtr, *nextPtr;    ipPtr = (InterpPackage *) clientData;    while (ipPtr != NULL) {	nextPtr = ipPtr->nextPtr;	ckfree((char *) ipPtr);	ipPtr = nextPtr;    }}/* *---------------------------------------------------------------------- * * LoadExitProc -- * *	This procedure is invoked just before the application exits. *	It frees all of the LoadedPackage structures. * * Results: *	None. * * Side effects: *	Memory is freed. * *---------------------------------------------------------------------- */static voidLoadExitProc(clientData)    ClientData clientData;		/* Not used. */{    LoadedPackage *pkgPtr;    while (firstPackagePtr != NULL) {	pkgPtr = firstPackagePtr;	firstPackagePtr = pkgPtr->nextPtr;	ckfree(pkgPtr->fileName);	ckfree(pkgPtr->packageName);	ckfree((char *) pkgPtr);    }}

⌨️ 快捷键说明

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