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

📄 tclbasic.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
    Namespace *nsPtr;    Tcl_HashEntry *hPtr;    Tcl_HashTable *hTblPtr;    int new;    if (iPtr->flags & DELETED) {        /*         * The interpreter is being deleted. Do not create any new         * structures, because it is not safe to modify the interpreter.         */                return TCL_ERROR;    }    /*     * Check that we have a regular name for the command     * (that the user is not trying to do an expose and a rename     *  (to another namespace) at the same time)     */    if (strstr(cmdName, "::") != NULL) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "can not expose to a namespace ",		"(use expose to toplevel, then rename)",                 (char *) NULL);        return TCL_ERROR;    }    /*     * Find the hash table for the hidden commands; error out if there     * is none.     */    hTblPtr = (Tcl_HashTable *) Tcl_GetAssocData(interp, "tclHiddenCmds",            NULL);    if (hTblPtr == NULL) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "unknown hidden command \"", hiddenCmdToken,                "\"", (char *) NULL);        return TCL_ERROR;    }            /*     * Get the command from the hidden command table:     */    hPtr = Tcl_FindHashEntry(hTblPtr, hiddenCmdToken);    if (hPtr == (Tcl_HashEntry *) NULL) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "unknown hidden command \"", hiddenCmdToken,                "\"", (char *) NULL);        return TCL_ERROR;    }    cmdPtr = (Command *) Tcl_GetHashValue(hPtr);        /*     * Check that we have a true global namespace     * command (enforced by Tcl_HideCommand() but let's double     * check. (If it was not, we would not really know how to     * handle it).     */    if ( cmdPtr->nsPtr != iPtr->globalNsPtr ) {	/* 	 * This case is theoritically impossible,	 * we might rather panic() than 'nicely' erroring out ?	 */        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "trying to expose a non global command name space command",		(char *) NULL);        return TCL_ERROR;    }        /* This is the global table */    nsPtr = cmdPtr->nsPtr;    /*     * It is an error to overwrite an existing exposed command as a result     * of exposing a previously hidden command.     */    hPtr = Tcl_CreateHashEntry(&nsPtr->cmdTable, cmdName, &new);    if (!new) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "exposed command \"", cmdName,                "\" already exists", (char *) NULL);        return TCL_ERROR;    }    /*     * Remove the hash entry for the command from the interpreter hidden     * command table.     */    if (cmdPtr->hPtr != NULL) {        Tcl_DeleteHashEntry(cmdPtr->hPtr);        cmdPtr->hPtr = NULL;    }    /*     * Now link the hash table entry with the command structure.     * This is like creating a new command, so deal with any shadowing     * of commands in the global namespace.     */        cmdPtr->hPtr = hPtr;    Tcl_SetHashValue(hPtr, (ClientData) cmdPtr);    /*     * Not needed as we are only in the global namespace     * (but would be needed again if we supported namespace command hiding)     *     * TclResetShadowedCmdRefs(interp, cmdPtr);     */    /*     * If the command being exposed has a compile procedure, increment     * interpreter's compileEpoch to invalidate its compiled code. This     * makes sure that we don't later try to execute old code compiled     * assuming the command is hidden. This field is checked in Tcl_EvalObj     * and ObjInterpProc, and code whose compilation epoch doesn't match is     * recompiled.     */    if (cmdPtr->compileProc != NULL) {	iPtr->compileEpoch++;    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * Tcl_CreateCommand -- * *	Define a new command in a command table. * * Results: *	The return value is a token for the command, which can *	be used in future calls to Tcl_GetCommandName. * * Side effects: *	If a command named cmdName already exists for interp, it is deleted. *	In the future, when cmdName is seen as the name of a command by *	Tcl_Eval, proc will be called. To support the bytecode interpreter, *	the command is created with a wrapper Tcl_ObjCmdProc *	(TclInvokeStringCommand) that eventially calls proc. When the *	command is deleted from the table, deleteProc will be called. *	See the manual entry for details on the calling sequence. * *---------------------------------------------------------------------- */Tcl_CommandTcl_CreateCommand(interp, cmdName, proc, clientData, deleteProc)    Tcl_Interp *interp;		/* Token for command interpreter returned by				 * a previous call to Tcl_CreateInterp. */    char *cmdName;		/* Name of command. If it contains namespace				 * qualifiers, the new command is put in the				 * specified namespace; otherwise it is put				 * in the global namespace. */    Tcl_CmdProc *proc;		/* Procedure to associate with cmdName. */    ClientData clientData;	/* Arbitrary value passed to string proc. */    Tcl_CmdDeleteProc *deleteProc;				/* If not NULL, gives a procedure to call				 * when this command is deleted. */{    Interp *iPtr = (Interp *) interp;    ImportRef *oldRefPtr = NULL;    Namespace *nsPtr, *dummy1, *dummy2;    Command *cmdPtr, *refCmdPtr;    Tcl_HashEntry *hPtr;    char *tail;    int new, result;    ImportedCmdData *dataPtr;    if (iPtr->flags & DELETED) {	/*	 * The interpreter is being deleted.  Don't create any new	 * commands; it's not safe to muck with the interpreter anymore.	 */	return (Tcl_Command) NULL;    }    /*     * Determine where the command should reside. If its name contains      * namespace qualifiers, we put it in the specified namespace;      * otherwise, we always put it in the global namespace.     */    if (strstr(cmdName, "::") != NULL) {	result = TclGetNamespaceForQualName(interp, cmdName,                 (Namespace *) NULL, CREATE_NS_IF_UNKNOWN, &nsPtr,                 &dummy1, &dummy2, &tail);	if ((result != TCL_OK) || (nsPtr == NULL) || (tail == NULL)) {	    return (Tcl_Command) NULL;	}    } else {	nsPtr = iPtr->globalNsPtr;	tail = cmdName;    }        hPtr = Tcl_CreateHashEntry(&nsPtr->cmdTable, tail, &new);    if (!new) {	/*	 * Command already exists. Delete the old one.	 * Be careful to preserve any existing import links so we can	 * restore them down below.  That way, you can redefine a	 * command and its import status will remain intact.	 */	cmdPtr = (Command *) Tcl_GetHashValue(hPtr);	oldRefPtr = cmdPtr->importRefPtr;	cmdPtr->importRefPtr = NULL;	Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr);	hPtr = Tcl_CreateHashEntry(&nsPtr->cmdTable, tail, &new);	if (!new) {	    /*	     * If the deletion callback recreated the command, just throw             * away the new command (if we try to delete it again, we             * could get stuck in an infinite loop).	     */	     ckfree((char*) cmdPtr);	}    }    cmdPtr = (Command *) ckalloc(sizeof(Command));    Tcl_SetHashValue(hPtr, cmdPtr);    cmdPtr->hPtr = hPtr;    cmdPtr->nsPtr = nsPtr;    cmdPtr->refCount = 1;    cmdPtr->cmdEpoch = 0;    cmdPtr->compileProc = (CompileProc *) NULL;    cmdPtr->objProc = TclInvokeStringCommand;    cmdPtr->objClientData = (ClientData) cmdPtr;    cmdPtr->proc = proc;    cmdPtr->clientData = clientData;    cmdPtr->deleteProc = deleteProc;    cmdPtr->deleteData = clientData;    cmdPtr->deleted = 0;    cmdPtr->importRefPtr = NULL;    /*     * Plug in any existing import references found above.  Be sure     * to update all of these references to point to the new command.     */    if (oldRefPtr != NULL) {	cmdPtr->importRefPtr = oldRefPtr;	while (oldRefPtr != NULL) {	    refCmdPtr = oldRefPtr->importedCmdPtr;	    dataPtr = (ImportedCmdData*)refCmdPtr->objClientData;	    dataPtr->realCmdPtr = cmdPtr;	    oldRefPtr = oldRefPtr->nextPtr;	}    }    /*     * We just created a command, so in its namespace and all of its parent     * namespaces, it may shadow global commands with the same name. If any     * shadowed commands are found, invalidate all cached command references     * in the affected namespaces.     */        TclResetShadowedCmdRefs(interp, cmdPtr);    return (Tcl_Command) cmdPtr;}/* *---------------------------------------------------------------------- * * Tcl_CreateObjCommand -- * *	Define a new object-based command in a command table. * * Results: *	The return value is a token for the command, which can *	be used in future calls to Tcl_NameOfCommand. * * Side effects: *	If no command named "cmdName" already exists for interp, one is *	created. Otherwise, if a command does exist, then if the *	object-based Tcl_ObjCmdProc is TclInvokeStringCommand, we assume *	Tcl_CreateCommand was called previously for the same command and *	just set its Tcl_ObjCmdProc to the argument "proc"; otherwise, we *	delete the old command. * *	In the future, during bytecode evaluation when "cmdName" is seen as *	the name of a command by Tcl_EvalObj or Tcl_Eval, the object-based *	Tcl_ObjCmdProc proc will be called. When the command is deleted from *	the table, deleteProc will be called. See the manual entry for *	details on the calling sequence. * *---------------------------------------------------------------------- */Tcl_CommandTcl_CreateObjCommand(interp, cmdName, proc, clientData, deleteProc)    Tcl_Interp *interp;		/* Token for command interpreter (returned				 * by previous call to Tcl_CreateInterp). */    char *cmdName;		/* Name of command. If it contains namespace				 * qualifiers, the new command is put in the				 * specified namespace; otherwise it is put				 * in the global namespace. */    Tcl_ObjCmdProc *proc;	/* Object-based procedure to associate with				 * name. */    ClientData clientData;	/* Arbitrary value to pass to object    				 * procedure. */    Tcl_CmdDeleteProc *deleteProc;				/* If not NULL, gives a procedure to call				 * when this command is deleted. */{    Interp *iPtr = (Interp *) interp;    ImportRef *oldRefPtr = NULL;    Namespace *nsPtr, *dummy1, *dummy2;    Command *cmdPtr, *refCmdPtr;    Tcl_HashEntry *hPtr;    char *tail;    int new, result;    ImportedCmdData *dataPtr;    if (iPtr->flags & DELETED) {	/*	 * The interpreter is being deleted.  Don't create any new	 * commands;  it's not safe to muck with the interpreter anymore.	 */	return (Tcl_Command) NULL;    }    /*     * Determine where the command should reside. If its name contains      * namespace qualifiers, we put it in the specified namespace;      * otherwise, we always put it in the global namespace.     */    if (strstr(cmdName, "::") != NULL) {	result = TclGetNamespaceForQualName(interp, cmdName,                 (Namespace *) NULL, CREATE_NS_IF_UNKNOWN, &nsPtr,                 &dummy1, &dummy2, &tail);	if ((result != TCL_OK) || (nsPtr == NULL) || (tail == NULL)) {	    return (Tcl_Command) NULL;	}    } else {	nsPtr = iPtr->globalNsPtr;	tail = cmdName;    }    hPtr = Tcl_CreateHashEntry(&nsPtr->cmdTable, tail, &new);    if (!new) {	cmdPtr = (Command *) Tcl_GetHashValue(hPtr);	/*	 * Command already exists. If its object-based Tcl_ObjCmdProc is	 * TclInvokeStringCommand, we just set its Tcl_ObjCmdProc to the	 * argument "proc". Otherwise, we delete the old command. 	 */	if (cmdPtr->objProc == TclInvokeStringCommand) {	    cmdPtr->objProc = proc;	    cmdPtr->objClientData = clientData;            cmdPtr->deleteProc = deleteProc;            cmdPtr->deleteData = clientData;	    return (Tcl_Command) cmdPtr;	}	/*	 * Otherwise, we delete the old command.  Be careful to preserve	 * any existing import links so we can restore them down below.	 * That way, you can redefine a command and its import status	 * will remain intact.	 */	oldRefPtr = cmdPtr->importRefPtr;	cmdPtr->importRefPtr = NULL;	Tcl_DeleteCommandFromToken(interp, (Tcl_Command) cmdPtr);	hPtr = Tcl_CreateHashEntry(&nsPtr->cmdTable, tail, &new);	if (!new) {	    /*	     * If the deletion callback recreated the command, just throw	     * away the new command (if we try to delete it again, we	     * could get stuck in an infinite loop).	     */	     ckfree((char *) Tcl_GetHashValue(hPtr));	}    }    cmdPtr = (Command *) ckalloc(sizeof(Command));    Tcl_SetHashValue(hPtr, cmdPtr);    cmdPtr->hPtr = hPtr;    cmdPtr->nsPtr = nsPtr;    cmdPtr->refCount = 1;    cmdPtr->cmdEpoch = 0;    cmdPtr->compileProc = (CompileProc *) NULL;    cmdPtr->objProc = proc;    cmdPtr->objClientData = clientData;    cmdPtr->proc = TclInvokeObjectCommand;    cmdPtr->clientData = (ClientData) cmdPtr;    cmdPtr->deleteProc = deleteProc;    cmdPtr->deleteData = clientData;    cmdPtr->deleted = 0;    cmdPtr->importRefPtr = NULL;    /*     * Plug in any existing import references found above.  Be sure     * to update all of these references to point to the new command.     */    if (oldRefPtr != NULL) {	cmdPtr->importRefPtr = oldRefPtr;	while (oldRefPtr != NULL) {

⌨️ 快捷键说明

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