tclcmdil.c

来自「tcl是工具命令语言」· C语言 代码 · 共 2,174 行 · 第 1/5 页

C
2,174
字号
	case ICmdCountIdx:	    result = InfoCmdCountCmd(clientData, interp, objc, objv);	    break;        case ICommandsIdx:	    result = InfoCommandsCmd(clientData, interp, objc, objv);	    break;        case ICompleteIdx:	    result = InfoCompleteCmd(clientData, interp, objc, objv);	    break;	case IDefaultIdx:	    result = InfoDefaultCmd(clientData, interp, objc, objv);	    break;	case IExistsIdx:	    result = InfoExistsCmd(clientData, interp, objc, objv);	    break;	case IFunctionsIdx:	    result = InfoFunctionsCmd(clientData, interp, objc, objv);	    break;        case IGlobalsIdx:	    result = InfoGlobalsCmd(clientData, interp, objc, objv);	    break;        case IHostnameIdx:	    result = InfoHostnameCmd(clientData, interp, objc, objv);	    break;	case ILevelIdx:	    result = InfoLevelCmd(clientData, interp, objc, objv);	    break;	case ILibraryIdx:	    result = InfoLibraryCmd(clientData, interp, objc, objv);	    break;        case ILoadedIdx:	    result = InfoLoadedCmd(clientData, interp, objc, objv);	    break;        case ILocalsIdx:	    result = InfoLocalsCmd(clientData, interp, objc, objv);	    break;	case INameOfExecutableIdx:	    result = InfoNameOfExecutableCmd(clientData, interp, objc, objv);	    break;	case IPatchLevelIdx:	    result = InfoPatchLevelCmd(clientData, interp, objc, objv);	    break;        case IProcsIdx:	    result = InfoProcsCmd(clientData, interp, objc, objv);	    break;        case IScriptIdx:	    result = InfoScriptCmd(clientData, interp, objc, objv);	    break;	case ISharedLibExtensionIdx:	    result = InfoSharedlibCmd(clientData, interp, objc, objv);	    break;	case ITclVersionIdx:	    result = InfoTclVersionCmd(clientData, interp, objc, objv);	    break;	case IVarsIdx:	    result = InfoVarsCmd(clientData, interp, objc, objv);	    break;    }    return result;}/* *---------------------------------------------------------------------- * * InfoArgsCmd -- * *      Called to implement the "info args" command that returns the *      argument list for a procedure. Handles the following syntax: * *          info args procName * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoArgsCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    register Interp *iPtr = (Interp *) interp;    char *name;    Proc *procPtr;    CompiledLocal *localPtr;    Tcl_Obj *listObjPtr;    if (objc != 3) {        Tcl_WrongNumArgs(interp, 2, objv, "procname");        return TCL_ERROR;    }    name = Tcl_GetString(objv[2]);    procPtr = TclFindProc(iPtr, name);    if (procPtr == NULL) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "\"", name, "\" isn't a procedure", (char *) NULL);        return TCL_ERROR;    }    /*     * Build a return list containing the arguments.     */        listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);    for (localPtr = procPtr->firstLocalPtr;  localPtr != NULL;            localPtr = localPtr->nextPtr) {        if (TclIsVarArgument(localPtr)) {            Tcl_ListObjAppendElement(interp, listObjPtr,		    Tcl_NewStringObj(localPtr->name, -1));        }    }    Tcl_SetObjResult(interp, listObjPtr);    return TCL_OK;}/* *---------------------------------------------------------------------- * * InfoBodyCmd -- * *      Called to implement the "info body" command that returns the body *      for a procedure. Handles the following syntax: * *          info body procName * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoBodyCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    register Interp *iPtr = (Interp *) interp;    char *name;    Proc *procPtr;    Tcl_Obj *bodyPtr, *resultPtr;        if (objc != 3) {        Tcl_WrongNumArgs(interp, 2, objv, "procname");        return TCL_ERROR;    }    name = Tcl_GetString(objv[2]);    procPtr = TclFindProc(iPtr, name);    if (procPtr == NULL) {        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),		"\"", name, "\" isn't a procedure", (char *) NULL);        return TCL_ERROR;    }    /*      * Here we used to return procPtr->bodyPtr, except when the body was     * bytecompiled - in that case, the return was a copy of the body's     * string rep. In order to better isolate the implementation details     * of the compiler/engine subsystem, we now always return a copy of      * the string rep. It is important to return a copy so that later      * manipulations of the object do not invalidate the internal rep.     */    bodyPtr = procPtr->bodyPtr;    if (bodyPtr->bytes == NULL) {	/*	 * The string rep might not be valid if the procedure has	 * never been run before.  [Bug #545644]	 */	(void) Tcl_GetString(bodyPtr);    }    resultPtr = Tcl_NewStringObj(bodyPtr->bytes, bodyPtr->length);        Tcl_SetObjResult(interp, resultPtr);    return TCL_OK;}/* *---------------------------------------------------------------------- * * InfoCmdCountCmd -- * *      Called to implement the "info cmdcount" command that returns the *      number of commands that have been executed. Handles the following *      syntax: * *          info cmdcount * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoCmdCountCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    Interp *iPtr = (Interp *) interp;        if (objc != 2) {        Tcl_WrongNumArgs(interp, 2, objv, NULL);        return TCL_ERROR;    }    Tcl_SetIntObj(Tcl_GetObjResult(interp), iPtr->cmdCount);    return TCL_OK;}/* *---------------------------------------------------------------------- * * InfoCommandsCmd -- * *	Called to implement the "info commands" command that returns the *	list of commands in the interpreter that match an optional pattern. *	The pattern, if any, consists of an optional sequence of namespace *	names separated by "::" qualifiers, which is followed by a *	glob-style pattern that restricts which commands are returned. *	Handles the following syntax: * *          info commands ?pattern? * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoCommandsCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    char *cmdName, *pattern;    CONST char *simplePattern;    register Tcl_HashEntry *entryPtr;    Tcl_HashSearch search;    Namespace *nsPtr;    Namespace *globalNsPtr = (Namespace *) Tcl_GetGlobalNamespace(interp);    Namespace *currNsPtr   = (Namespace *) Tcl_GetCurrentNamespace(interp);    Tcl_Obj *listPtr, *elemObjPtr;    int specificNsInPattern = 0;  /* Init. to avoid compiler warning. */    Tcl_Command cmd;    /*     * Get the pattern and find the "effective namespace" in which to     * list commands.     */    if (objc == 2) {        simplePattern = NULL;	nsPtr = currNsPtr;	specificNsInPattern = 0;    } else if (objc == 3) {	/*	 * From the pattern, get the effective namespace and the simple	 * pattern (no namespace qualifiers or ::'s) at the end. If an	 * error was found while parsing the pattern, return it. Otherwise,	 * if the namespace wasn't found, just leave nsPtr NULL: we will	 * return an empty list since no commands there can be found.	 */	Namespace *dummy1NsPtr, *dummy2NsPtr;		pattern = Tcl_GetString(objv[2]);	TclGetNamespaceForQualName(interp, pattern, (Namespace *) NULL,           /*flags*/ 0, &nsPtr, &dummy1NsPtr, &dummy2NsPtr, &simplePattern);	if (nsPtr != NULL) {	/* we successfully found the pattern's ns */	    specificNsInPattern = (strcmp(simplePattern, pattern) != 0);	}    } else {        Tcl_WrongNumArgs(interp, 2, objv, "?pattern?");        return TCL_ERROR;    }    /*     * Scan through the effective namespace's command table and create a     * list with all commands that match the pattern. If a specific     * namespace was requested in the pattern, qualify the command names     * with the namespace name.     */    listPtr = Tcl_NewListObj(0, (Tcl_Obj **) NULL);    if (nsPtr != NULL) {	entryPtr = Tcl_FirstHashEntry(&nsPtr->cmdTable, &search);	while (entryPtr != NULL) {	    cmdName = Tcl_GetHashKey(&nsPtr->cmdTable, entryPtr);	    if ((simplePattern == NULL)	            || Tcl_StringMatch(cmdName, simplePattern)) {		if (specificNsInPattern) {		    cmd = (Tcl_Command) Tcl_GetHashValue(entryPtr);		    elemObjPtr = Tcl_NewObj();		    Tcl_GetCommandFullName(interp, cmd, elemObjPtr);		} else {		    elemObjPtr = Tcl_NewStringObj(cmdName, -1);		}		Tcl_ListObjAppendElement(interp, listPtr, elemObjPtr);	    }	    entryPtr = Tcl_NextHashEntry(&search);	}	/*	 * If the effective namespace isn't the global :: namespace, and a	 * specific namespace wasn't requested in the pattern, then add in	 * all global :: commands that match the simple pattern. Of course,	 * we add in only those commands that aren't hidden by a command in	 * the effective namespace.	 */		if ((nsPtr != globalNsPtr) && !specificNsInPattern) {	    entryPtr = Tcl_FirstHashEntry(&globalNsPtr->cmdTable, &search);	    while (entryPtr != NULL) {		cmdName = Tcl_GetHashKey(&globalNsPtr->cmdTable, entryPtr);		if ((simplePattern == NULL)	                || Tcl_StringMatch(cmdName, simplePattern)) {		    if (Tcl_FindHashEntry(&nsPtr->cmdTable, cmdName) == NULL) {			Tcl_ListObjAppendElement(interp, listPtr,				Tcl_NewStringObj(cmdName, -1));		    }		}		entryPtr = Tcl_NextHashEntry(&search);	    }	}    }        Tcl_SetObjResult(interp, listPtr);    return TCL_OK;}/* *---------------------------------------------------------------------- * * InfoCompleteCmd -- * *      Called to implement the "info complete" command that determines *      whether a string is a complete Tcl command. Handles the following *      syntax: * *          info complete command * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoCompleteCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    if (objc != 3) {        Tcl_WrongNumArgs(interp, 2, objv, "command");        return TCL_ERROR;    }    if (TclObjCommandComplete(objv[2])) {	Tcl_SetIntObj(Tcl_GetObjResult(interp), 1);    } else {	Tcl_SetIntObj(Tcl_GetObjResult(interp), 0);    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * InfoDefaultCmd -- * *      Called to implement the "info default" command that returns the *      default value for a procedure argument. Handles the following *      syntax: * *          info default procName arg varName * * Results: *      Returns TCL_OK if successful and TCL_ERROR if there is an error. * * Side effects: *      Returns a result in the interpreter's result object. If there is *	an error, the result is an error message. * *---------------------------------------------------------------------- */static intInfoDefaultCmd(dummy, interp, objc, objv)    ClientData dummy;		/* Not used. */    Tcl_Interp *interp;		/* Current interpreter. */    int objc;			/* Number of arguments. */    Tcl_Obj *CONST objv[];	/* Argument objects. */{    Interp *iPtr = (Interp *) interp;    char *procName, *argName, *varName;    Proc *procPtr;    CompiledLocal *localPtr;    Tcl_Obj *valueObjPtr;

⌨️ 快捷键说明

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