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

📄 tclbasic.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
      (void)Tcl_SetVar2((Tcl_Interp *)iPtr, "errorInfo", (char *) NULL, "",         TCL_GLOBAL_ONLY);      (void)Tcl_SetVar2((Tcl_Interp *)iPtr, "errorCode", (char *) NULL, "NONE",	    TCL_GLOBAL_ONLY);     */#ifndef TCL_GENERIC_ONLY    TclSetupEnv((Tcl_Interp *) iPtr);#endif    /*     * Do Multiple/Safe Interps Tcl init stuff     */    (void) TclInterpInit((Tcl_Interp *)iPtr);    /*     * Set up variables such as tcl_version.     */    TclPlatformInit((Tcl_Interp *)iPtr);    Tcl_SetVar((Tcl_Interp *) iPtr, "tcl_patchLevel", TCL_PATCH_LEVEL,	    TCL_GLOBAL_ONLY);    Tcl_SetVar((Tcl_Interp *) iPtr, "tcl_version", TCL_VERSION,	    TCL_GLOBAL_ONLY);    Tcl_TraceVar2((Tcl_Interp *) iPtr, "tcl_precision", (char *) NULL,	    TCL_GLOBAL_ONLY|TCL_TRACE_READS|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,	    TclPrecTraceProc, (ClientData) NULL);    /*     * Compute the byte order of this machine.     */    order.s = 1;    Tcl_SetVar2((Tcl_Interp *) iPtr, "tcl_platform", "byteOrder",	    (order.c[0] == 1) ? "littleEndian" : "bigEndian",	    TCL_GLOBAL_ONLY);    /*     * Register Tcl's version number.     */    Tcl_PkgProvide((Tcl_Interp *) iPtr, "Tcl", TCL_VERSION);        return (Tcl_Interp *) iPtr;}/* *---------------------------------------------------------------------- * * TclHideUnsafeCommands -- * *	Hides base commands that are not marked as safe from this *	interpreter. * * Results: *	TCL_OK if it succeeds, TCL_ERROR else. * * Side effects: *	Hides functionality in an interpreter. * *---------------------------------------------------------------------- */intTclHideUnsafeCommands(interp)    Tcl_Interp *interp;		/* Hide commands in this interpreter. */{    register CmdInfo *cmdInfoPtr;    if (interp == (Tcl_Interp *) NULL) {        return TCL_ERROR;    }    for (cmdInfoPtr = builtInCmds; cmdInfoPtr->name != NULL; cmdInfoPtr++) {        if (!cmdInfoPtr->isSafe) {            Tcl_HideCommand(interp, cmdInfoPtr->name, cmdInfoPtr->name);        }    }    return TCL_OK;}/* *-------------------------------------------------------------- * * Tcl_CallWhenDeleted -- * *	Arrange for a procedure to be called before a given *	interpreter is deleted. The procedure is called as soon *	as Tcl_DeleteInterp is called; if Tcl_CallWhenDeleted is *	called on an interpreter that has already been deleted, *	the procedure will be called when the last Tcl_Release is *	done on the interpreter. * * Results: *	None. * * Side effects: *	When Tcl_DeleteInterp is invoked to delete interp, *	proc will be invoked.  See the manual entry for *	details. * *-------------------------------------------------------------- */voidTcl_CallWhenDeleted(interp, proc, clientData)    Tcl_Interp *interp;		/* Interpreter to watch. */    Tcl_InterpDeleteProc *proc;	/* Procedure to call when interpreter				 * is about to be deleted. */    ClientData clientData;	/* One-word value to pass to proc. */{    Interp *iPtr = (Interp *) interp;    static int assocDataCounter = 0;    int new;    char buffer[128];    AssocData *dPtr = (AssocData *) ckalloc(sizeof(AssocData));    Tcl_HashEntry *hPtr;    sprintf(buffer, "Assoc Data Key #%d", assocDataCounter);    assocDataCounter++;    if (iPtr->assocData == (Tcl_HashTable *) NULL) {        iPtr->assocData = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));        Tcl_InitHashTable(iPtr->assocData, TCL_STRING_KEYS);    }    hPtr = Tcl_CreateHashEntry(iPtr->assocData, buffer, &new);    dPtr->proc = proc;    dPtr->clientData = clientData;    Tcl_SetHashValue(hPtr, dPtr);}/* *-------------------------------------------------------------- * * Tcl_DontCallWhenDeleted -- * *	Cancel the arrangement for a procedure to be called when *	a given interpreter is deleted. * * Results: *	None. * * Side effects: *	If proc and clientData were previously registered as a *	callback via Tcl_CallWhenDeleted, they are unregistered. *	If they weren't previously registered then nothing *	happens. * *-------------------------------------------------------------- */voidTcl_DontCallWhenDeleted(interp, proc, clientData)    Tcl_Interp *interp;		/* Interpreter to watch. */    Tcl_InterpDeleteProc *proc;	/* Procedure to call when interpreter				 * is about to be deleted. */    ClientData clientData;	/* One-word value to pass to proc. */{    Interp *iPtr = (Interp *) interp;    Tcl_HashTable *hTablePtr;    Tcl_HashSearch hSearch;    Tcl_HashEntry *hPtr;    AssocData *dPtr;    hTablePtr = iPtr->assocData;    if (hTablePtr == (Tcl_HashTable *) NULL) {        return;    }    for (hPtr = Tcl_FirstHashEntry(hTablePtr, &hSearch); hPtr != NULL;	    hPtr = Tcl_NextHashEntry(&hSearch)) {        dPtr = (AssocData *) Tcl_GetHashValue(hPtr);        if ((dPtr->proc == proc) && (dPtr->clientData == clientData)) {            ckfree((char *) dPtr);            Tcl_DeleteHashEntry(hPtr);            return;        }    }}/* *---------------------------------------------------------------------- * * Tcl_SetAssocData -- * *	Creates a named association between user-specified data, a delete *	function and this interpreter. If the association already exists *	the data is overwritten with the new data. The delete function will *	be invoked when the interpreter is deleted. * * Results: *	None. * * Side effects: *	Sets the associated data, creates the association if needed. * *---------------------------------------------------------------------- */voidTcl_SetAssocData(interp, name, proc, clientData)    Tcl_Interp *interp;		/* Interpreter to associate with. */    char *name;			/* Name for association. */    Tcl_InterpDeleteProc *proc;	/* Proc to call when interpreter is                                 * about to be deleted. */    ClientData clientData;	/* One-word value to pass to proc. */{    Interp *iPtr = (Interp *) interp;    AssocData *dPtr;    Tcl_HashEntry *hPtr;    int new;    if (iPtr->assocData == (Tcl_HashTable *) NULL) {        iPtr->assocData = (Tcl_HashTable *) ckalloc(sizeof(Tcl_HashTable));        Tcl_InitHashTable(iPtr->assocData, TCL_STRING_KEYS);    }    hPtr = Tcl_CreateHashEntry(iPtr->assocData, name, &new);    if (new == 0) {        dPtr = (AssocData *) Tcl_GetHashValue(hPtr);    } else {        dPtr = (AssocData *) ckalloc(sizeof(AssocData));    }    dPtr->proc = proc;    dPtr->clientData = clientData;    Tcl_SetHashValue(hPtr, dPtr);}/* *---------------------------------------------------------------------- * * Tcl_DeleteAssocData -- * *	Deletes a named association of user-specified data with *	the specified interpreter. * * Results: *	None. * * Side effects: *	Deletes the association. * *---------------------------------------------------------------------- */voidTcl_DeleteAssocData(interp, name)    Tcl_Interp *interp;			/* Interpreter to associate with. */    char *name;				/* Name of association. */{    Interp *iPtr = (Interp *) interp;    AssocData *dPtr;    Tcl_HashEntry *hPtr;    if (iPtr->assocData == (Tcl_HashTable *) NULL) {        return;    }    hPtr = Tcl_FindHashEntry(iPtr->assocData, name);    if (hPtr == (Tcl_HashEntry *) NULL) {        return;    }    dPtr = (AssocData *) Tcl_GetHashValue(hPtr);    if (dPtr->proc != NULL) {        (dPtr->proc) (dPtr->clientData, interp);    }    ckfree((char *) dPtr);    Tcl_DeleteHashEntry(hPtr);}/* *---------------------------------------------------------------------- * * Tcl_GetAssocData -- * *	Returns the client data associated with this name in the *	specified interpreter. * * Results: *	The client data in the AssocData record denoted by the named *	association, or NULL. * * Side effects: *	None. * *---------------------------------------------------------------------- */ClientDataTcl_GetAssocData(interp, name, procPtr)    Tcl_Interp *interp;			/* Interpreter associated with. */    char *name;				/* Name of association. */    Tcl_InterpDeleteProc **procPtr;	/* Pointer to place to store address					 * of current deletion callback. */{    Interp *iPtr = (Interp *) interp;    AssocData *dPtr;    Tcl_HashEntry *hPtr;    if (iPtr->assocData == (Tcl_HashTable *) NULL) {        return (ClientData) NULL;    }    hPtr = Tcl_FindHashEntry(iPtr->assocData, name);    if (hPtr == (Tcl_HashEntry *) NULL) {        return (ClientData) NULL;    }    dPtr = (AssocData *) Tcl_GetHashValue(hPtr);    if (procPtr != (Tcl_InterpDeleteProc **) NULL) {        *procPtr = dPtr->proc;    }    return dPtr->clientData;}/* *---------------------------------------------------------------------- * * DeleteInterpProc -- * *	Helper procedure to delete an interpreter. This procedure is *	called when the last call to Tcl_Preserve on this interpreter *	is matched by a call to Tcl_Release. The procedure cleans up *	all resources used in the interpreter and calls all currently *	registered interpreter deletion callbacks. * * Results: *	None. * * Side effects: *	Whatever the interpreter deletion callbacks do. Frees resources *	used by the interpreter. * *---------------------------------------------------------------------- */static voidDeleteInterpProc(interp)    Tcl_Interp *interp;			/* Interpreter to delete. */{    Interp *iPtr = (Interp *) interp;    Tcl_HashEntry *hPtr;    Tcl_HashSearch search;    Tcl_HashTable *hTablePtr;    AssocData *dPtr;    ResolverScheme *resPtr, *nextResPtr;    int i;    /*     * Punt if there is an error in the Tcl_Release/Tcl_Preserve matchup.     */        if (iPtr->numLevels > 0) {        panic("DeleteInterpProc called with active evals");    }    /*     * The interpreter should already be marked deleted; otherwise how     * did we get here?     */    if (!(iPtr->flags & DELETED)) {        panic("DeleteInterpProc called on interpreter not marked deleted");    }    /*     * Dismantle everything in the global namespace except for the     * "errorInfo" and "errorCode" variables. These remain until the     * namespace is actually destroyed, in case any errors occur.     *        * Dismantle the namespace here, before we clear the assocData. If any     * background errors occur here, they will be deleted below.     */        TclTeardownNamespace(iPtr->globalNsPtr);    /*     * Tear down the math function table.     */    for (hPtr = Tcl_FirstHashEntry(&iPtr->mathFuncTable, &search);	     hPtr != NULL;             hPtr = Tcl_NextHashEntry(&search)) {	ckfree((char *) Tcl_GetHashValue(hPtr));    }    Tcl_DeleteHashTable(&iPtr->mathFuncTable);    /*     * Invoke deletion callbacks; note that a callback can create new     * callbacks, so we iterate.     */    while (iPtr->assocData != (Tcl_HashTable *) NULL) {        hTablePtr = iPtr->assocData;        iPtr->assocData = (Tcl_HashTable *) NULL;        for (hPtr = Tcl_FirstHashEntry(hTablePtr, &search);                 hPtr != NULL;                 hPtr = Tcl_FirstHashEntry(hTablePtr, &search)) {            dPtr = (AssocData *) Tcl_GetHashValue(hPtr);            Tcl_DeleteHashEntry(hPtr);            if (dPtr->proc != NULL) {                (*dPtr->proc)(dPtr->clientData, interp);            }            ckfree((char *) dPtr);        }        Tcl_DeleteHashTable(hTablePtr);        ckfree((char *) hTablePtr);    }    /*     * Finish deleting the global namespace.     */        Tcl_DeleteNamespace((Tcl_Namespace *) iPtr->globalNsPtr);    /*     * Free up the result *after* deleting variables, since variable     * deletion could have transferred ownership of the result string     * to Tcl.     */

⌨️ 快捷键说明

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