📄 itcl_bicmds.c
字号:
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 + -