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

📄 itcl_bicmds.c

📁 linux 下的源代码分析阅读器 red hat公司新版
💻 C
📖 第 1 页 / 共 4 页
字号:
        name = contextNs->name;    } else {        name = contextNs->fullName;    }    Tcl_SetResult(interp, name, TCL_VOLATILE);    return TCL_OK;}/* * ------------------------------------------------------------------------ *  Itcl_BiInfoInheritCmd() * *  Returns the list of base classes for the current class context. *  Returns a status TCL_OK/TCL_ERROR to indicate success/failure. * ------------------------------------------------------------------------ *//* ARGSUSED */intItcl_BiInfoInheritCmd(dummy, interp, objc, objv)    ClientData dummy;     /* not used */    Tcl_Interp *interp;   /* current interpreter */    int objc;                /* number of arguments */    Tcl_Obj *CONST objv[];   /* argument objects */{    Tcl_Namespace *activeNs = Tcl_GetCurrentNamespace(interp);    ItclClass *contextClass;    ItclObject *contextObj;    ItclClass *cdefn;    Itcl_ListElem *elem;    Tcl_Obj *listPtr, *objPtr;    if (objc != 1) {        Tcl_WrongNumArgs(interp, 1, objv, NULL);        return TCL_ERROR;    }    /*     *  If this command is not invoked within a class namespace,     *  signal an error.     */    if (Itcl_GetContext(interp, &contextClass, &contextObj) != TCL_OK) {        char *name = Tcl_GetStringFromObj(objv[0], (int*)NULL);        Tcl_ResetResult(interp);        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),            "\nget info like this instead: ",            "\n  namespace eval className { info ", name, "... }",            (char*)NULL);        return TCL_ERROR;    }    /*     *  Return the list of base classes.     */    listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL);    elem = Itcl_FirstListElem(&contextClass->bases);    while (elem) {        cdefn = (ItclClass*)Itcl_GetListValue(elem);        if (cdefn->namesp->parentPtr == activeNs) {            objPtr = Tcl_NewStringObj(cdefn->namesp->name, -1);        } else {            objPtr = Tcl_NewStringObj(cdefn->namesp->fullName, -1);        }        Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr);        elem = Itcl_NextListElem(elem);    }    Tcl_SetObjResult(interp, listPtr);    return TCL_OK;}/* * ------------------------------------------------------------------------ *  Itcl_BiInfoHeritageCmd() * *  Returns the entire derivation hierarchy for this class, presented *  in the order that classes are traversed for finding data members *  and member functions. * *  Returns a status TCL_OK/TCL_ERROR to indicate success/failure. * ------------------------------------------------------------------------ *//* ARGSUSED */intItcl_BiInfoHeritageCmd(dummy, interp, objc, objv)    ClientData dummy;     /* not used */    Tcl_Interp *interp;   /* current interpreter */    int objc;                /* number of arguments */    Tcl_Obj *CONST objv[];   /* argument objects */{    Tcl_Namespace *activeNs = Tcl_GetCurrentNamespace(interp);    ItclClass *contextClass;    ItclObject *contextObj;    char *name;    ItclHierIter hier;    Tcl_Obj *listPtr, *objPtr;    ItclClass *cdefn;    if (objc != 1) {        Tcl_WrongNumArgs(interp, 1, objv, NULL);        return TCL_ERROR;    }    /*     *  If this command is not invoked within a class namespace,     *  signal an error.     */    if (Itcl_GetContext(interp, &contextClass, &contextObj) != TCL_OK) {        name = Tcl_GetStringFromObj(objv[0], (int*)NULL);        Tcl_ResetResult(interp);        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),            "\nget info like this instead: ",            "\n  namespace eval className { info ", name, "... }",            (char*)NULL);        return TCL_ERROR;    }    /*     *  Traverse through the derivation hierarchy and return     *  base class names.     */    listPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL);    Itcl_InitHierIter(&hier, contextClass);    while ((cdefn=Itcl_AdvanceHierIter(&hier)) != NULL) {        if (cdefn->namesp->parentPtr == activeNs) {            objPtr = Tcl_NewStringObj(cdefn->namesp->name, -1);        } else {            objPtr = Tcl_NewStringObj(cdefn->namesp->fullName, -1);        }        Tcl_ListObjAppendElement((Tcl_Interp*)NULL, listPtr, objPtr);    }    Itcl_DeleteHierIter(&hier);    Tcl_SetObjResult(interp, listPtr);    return TCL_OK;}/* * ------------------------------------------------------------------------ *  Itcl_BiInfoFunctionCmd() * *  Returns information regarding class member functions (methods/procs). *  Handles the following syntax: * *    info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body? * *  If the ?cmdName? is not specified, then a list of all known *  command members is returned.  Otherwise, the information for *  a specific command is returned.  Returns a status TCL_OK/TCL_ERROR *  to indicate success/failure. * ------------------------------------------------------------------------ *//* ARGSUSED */intItcl_BiInfoFunctionCmd(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 = NULL;    Tcl_Obj *resultPtr = NULL;    Tcl_Obj *objPtr = NULL;    static char *options[] = {        "-args", "-body", "-name", "-protection", "-type",        (char*)NULL    };    enum BIfIdx {        BIfArgsIdx, BIfBodyIdx, BIfNameIdx, BIfProtectIdx, BIfTypeIdx    } *iflist, iflistStorage[5];    static enum BIfIdx DefInfoFunction[5] = {        BIfProtectIdx,        BIfTypeIdx,        BIfNameIdx,        BIfArgsIdx,        BIfBodyIdx    };    ItclClass *contextClass, *cdefn;    ItclObject *contextObj;    int i, result;    char *name, *val;    Tcl_HashSearch place;    Tcl_HashEntry *entry;    ItclMemberFunc *mfunc;    ItclMemberCode *mcode;    ItclHierIter hier;    /*     *  If this command is not invoked within a class namespace,     *  signal an error.     */    if (Itcl_GetContext(interp, &contextClass, &contextObj) != TCL_OK) {        name = Tcl_GetStringFromObj(objv[0], (int*)NULL);        Tcl_ResetResult(interp);        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),            "\nget info like this instead: ",            "\n  namespace eval className { info ", name, "... }",            (char*)NULL);        return TCL_ERROR;    }    /*     *  Process args:     *  ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body?     */    objv++;  /* skip over command name */    objc--;    if (objc > 0) {        cmdName = Tcl_GetStringFromObj(*objv, (int*)NULL);        objc--; objv++;    }    /*     *  Return info for a specific command.     */    if (cmdName) {        entry = Tcl_FindHashEntry(&contextClass->resolveCmds, cmdName);        if (entry == NULL) {            Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),                "\"", cmdName, "\" isn't a member function in class \"",                contextClass->namesp->fullName, "\"",                (char*)NULL);            return TCL_ERROR;        }        mfunc = (ItclMemberFunc*)Tcl_GetHashValue(entry);        mcode = mfunc->member->code;        /*         *  By default, return everything.         */        if (objc == 0) {            objc = 5;            iflist = DefInfoFunction;        }        /*         *  Otherwise, scan through all remaining flags and         *  figure out what to return.         */        else {            iflist = &iflistStorage[0];            for (i=0 ; i < objc; i++) {                result = Tcl_GetIndexFromObj(interp, objv[i],                    options, "option", 0, (int*)(&iflist[i]));                if (result != TCL_OK) {                    return TCL_ERROR;                }            }        }        if (objc > 1) {            resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL);        }        for (i=0 ; i < objc; i++) {            switch (iflist[i]) {                case BIfArgsIdx:                    if (mcode && mcode->arglist) {                        objPtr = Itcl_ArgList(mcode->argcount, mcode->arglist);                    }                    else if ((mfunc->member->flags & ITCL_ARG_SPEC) != 0) {                        objPtr = Itcl_ArgList(mfunc->argcount, mfunc->arglist);                    }                    else {                        objPtr = Tcl_NewStringObj("<undefined>", -1);                    }                    break;                case BIfBodyIdx:                    if (mcode && mcode->procPtr->bodyPtr) {                        objPtr = mcode->procPtr->bodyPtr;                    } else {                        objPtr = Tcl_NewStringObj("<undefined>", -1);                    }                    break;                case BIfNameIdx:                    objPtr = Tcl_NewStringObj(mfunc->member->fullname, -1);                    break;                case BIfProtectIdx:                    val = Itcl_ProtectionStr(mfunc->member->protection);                    objPtr = Tcl_NewStringObj(val, -1);                    break;                case BIfTypeIdx:                    val = ((mfunc->member->flags & ITCL_COMMON) != 0)                        ? "proc" : "method";                    objPtr = Tcl_NewStringObj(val, -1);                    break;            }            if (objc == 1) {                resultPtr = objPtr;            } else {                Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr);            }        }        Tcl_SetObjResult(interp, resultPtr);    }    /*     *  Return the list of available commands.     */    else {        resultPtr = Tcl_NewListObj(0, (Tcl_Obj**)NULL);        Itcl_InitHierIter(&hier, contextClass);        while ((cdefn=Itcl_AdvanceHierIter(&hier)) != NULL) {            entry = Tcl_FirstHashEntry(&cdefn->functions, &place);            while (entry) {                mfunc = (ItclMemberFunc*)Tcl_GetHashValue(entry);                objPtr = Tcl_NewStringObj(mfunc->member->fullname, -1);                Tcl_ListObjAppendElement((Tcl_Interp*)NULL, resultPtr, objPtr);                entry = Tcl_NextHashEntry(&place);            }        }        Itcl_DeleteHierIter(&hier);        Tcl_SetObjResult(interp, resultPtr);    }    return TCL_OK;}/* * ------------------------------------------------------------------------ *  Itcl_BiInfoVariableCmd() * *  Returns information regarding class data members (variables and *  commons).  Handles the following syntax: * *    info variable ?varName? ?-protection? ?-type? ?-name? *        ?-init? ?-config? ?-value? * *  If the ?varName? is not specified, then a list of all known *  data members is returned.  Otherwise, the information for a *  specific member is returned.  Returns a status TCL_OK/TCL_ERROR *  to indicate success/failure. * ------------------------------------------------------------------------ *//* ARGSUSED */intItcl_BiInfoVariableCmd(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 *varName = NULL;    Tcl_Obj *resultPtr = NULL;    Tcl_Obj *objPtr = NULL;    static char *options[] = {        "-config", "-init", "-name", "-protection", "-type",        "-value", (char*)NULL    };    enum BIvIdx {        BIvConfigIdx, BIvInitIdx, BIvNameIdx, BIvProtectIdx,        BIvTypeIdx, BIvValueIdx    } *ivlist, ivlistStorage[6];    static enum BIvIdx DefInfoVariable[5] = {        BIvProtectIdx,        BIvTypeIdx,        BIvNameIdx,        BIvInitIdx,        BIvValueIdx    };    static enum BIvIdx DefInfoPubVariable[6] = {        BIvProtectIdx,        BIvTypeIdx,        BIvNameIdx,        BIvInitIdx,        BIvConfigIdx,        BIvValueIdx    };    ItclClass *contextClass;    ItclObject *contextObj;    int i, result;    char *val, *name;    ItclClass *cdefn;    Tcl_HashSearch place;    Tcl_HashEntry *entry;    ItclVarDefn *vdefn;    ItclVarLookup *vlookup;    ItclMember *member;    ItclHierIter hier;    /*     *  If this command is not invoked within a class namespace,     *  signal an error.     */    if (Itcl_GetContext(interp, &contextClass, &contextObj) != TCL_OK) {        name = Tcl_GetStringFromObj(objv[0], (int*)NULL);        Tcl_ResetResult(interp);        Tcl_AppendStringsToObj(Tcl_GetObjResult(interp),            "\nget info like this instead: ",            "\n  namespace eval className { info ", name, "... }",            (char*)NULL);        return TCL_ERROR;    }    /*     *  Process args:     *  ?varName? ?-protection? ?-type? ?-name? ?-init? ?-config? ?-value?     */    objv++;  /* skip over command name */

⌨️ 快捷键说明

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