📄 classinf.c
字号:
globle VOID SlotCardinalityCommand(result) DATA_OBJECT *result; { SlotInfoSupportFunction(result,"slot-cardinality",SlotCardinality); }/******************************************************************** NAME : ClassAbstractP DESCRIPTION : Determines if a class is abstract or not INPUTS : Generic pointer to class RETURNS : 1 if class is abstract, 0 otherwise SIDE EFFECTS : None NOTES : None ********************************************************************/globle BOOLEAN ClassAbstractP(clsptr) VOID *clsptr; { return(((DEFCLASS *) clsptr)->abstract); }#if INSTANCE_PATTERN_MATCHING/******************************************************************** NAME : ClassReactiveP DESCRIPTION : Determines if a class is reactive or not INPUTS : Generic pointer to class RETURNS : 1 if class is reactive, 0 otherwise SIDE EFFECTS : None NOTES : None ********************************************************************/globle BOOLEAN ClassReactiveP(clsptr) VOID *clsptr; { return(((DEFCLASS *) clsptr)->reactive); }#endif/******************************************************************** NAME : ClassSlots DESCRIPTION : Groups slot info for a class into a multifield value for dynamic perusal INPUTS : 1) Generic pointer to class 2) Data object buffer to hold the slots of the class 3) Include (1) or exclude (0) inherited slots RETURNS : Nothing useful SIDE EFFECTS : Creates a multifield storing the names of the slots of the class NOTES : None ********************************************************************/globle VOID ClassSlots(clsptr,result,inhp) VOID *clsptr; DATA_OBJECT *result; int inhp; { long size; /* 6.04 Bug Fix */ register DEFCLASS *cls; register long i; /* 6.04 Bug Fix */ cls = (DEFCLASS *) clsptr; size = inhp ? cls->instanceSlotCount : cls->slotCount; result->type = MULTIFIELD; result->begin = 0; result->end = size - 1; result->value = (VOID *) CreateMultifield(size); if (size == 0) return; if (inhp) { for (i = 0 ; i < cls->instanceSlotCount ; i++) { SetMFType(result->value,i+1,SYMBOL); SetMFValue(result->value,i+1,cls->instanceTemplate[i]->slotName->name); } } else { for (i = 0 ; i < cls->slotCount ; i++) { SetMFType(result->value,i+1,SYMBOL); SetMFValue(result->value,i+1,cls->slots[i].slotName->name); } } } /************************************************************************ NAME : GetDefmessageHandlerList DESCRIPTION : Groups handler info for a class into a multifield value for dynamic perusal INPUTS : 1) Generic pointer to class (NULL to get handlers for all classes) 2) Data object buffer to hold the handlers of the class 3) Include (1) or exclude (0) inherited handlers RETURNS : Nothing useful SIDE EFFECTS : Creates a multifield storing the names and types of the message-handlers of the class NOTES : None ************************************************************************/globle VOID GetDefmessageHandlerList(clsptr,result,inhp) VOID *clsptr; DATA_OBJECT *result; int inhp; { DEFCLASS *cls,*svcls,*svnxt,*supcls; register int j,classi,classiLimit; long i,len,sublen; if (clsptr == NULL) { inhp = 0; cls = (DEFCLASS *) GetNextDefclass(NULL); svnxt = (DEFCLASS *) GetNextDefclass((VOID *) cls); } else { cls = (DEFCLASS *) clsptr; svnxt = (DEFCLASS *) GetNextDefclass((VOID *) cls); SetNextDefclass((VOID *) cls,NULL); } for (svcls = cls , i = 0 ; cls != NULL ; cls = (DEFCLASS *) GetNextDefclass((VOID *) cls)) { classiLimit = inhp ? cls->allSuperclasses.classCount : 1; for (classi = 0 ; classi < classiLimit ; classi++) i += cls->allSuperclasses.classArray[classi]->handlerCount; } len = i * 3; result->type = MULTIFIELD; result->begin = 0; result->end = len - 1; result->value = (VOID *) CreateMultifield(len); for (cls = svcls , sublen = 0 ; cls != NULL ; cls = (DEFCLASS *) GetNextDefclass((VOID *) cls)) { classiLimit = inhp ? cls->allSuperclasses.classCount : 1; for (classi = 0 ; classi < classiLimit ; classi++) { supcls = cls->allSuperclasses.classArray[classi]; if (inhp == 0) i = sublen + 1; else i = len - (supcls->handlerCount * 3) - sublen + 1; for (j = 0 ; j < supcls->handlerCount ; j++) { SetMFType(result->value,i,SYMBOL); SetMFValue(result->value,i++,GetDefclassNamePointer((VOID *) supcls)); SetMFType(result->value,i,SYMBOL); SetMFValue(result->value,i++,supcls->handlers[j].name); SetMFType(result->value,i,SYMBOL); SetMFValue(result->value,i++,AddSymbol(hndquals[supcls->handlers[j].type])); } sublen += supcls->handlerCount * 3; } } if (svcls != NULL) SetNextDefclass((VOID *) svcls,(VOID *) svnxt); } /*************************************************************************** NAME : ClassSuperclasses DESCRIPTION : Groups the names of superclasses into a multifield value for dynamic perusal INPUTS : 1) Generic pointer to class 2) Data object buffer to hold the superclasses of the class 3) Include (1) or exclude (0) indirect superclasses RETURNS : Nothing useful SIDE EFFECTS : Creates a multifield storing the names of the superclasses of the class NOTES : None ***************************************************************************/globle VOID ClassSuperclasses(clsptr,result,inhp) VOID *clsptr; DATA_OBJECT *result; int inhp; { PACKED_CLASS_LINKS *plinks; int offset; register unsigned i,j; if (inhp) { plinks = &((DEFCLASS *) clsptr)->allSuperclasses; offset = 1; } else { plinks = &((DEFCLASS *) clsptr)->directSuperclasses; offset = 0; } result->type = MULTIFIELD; result->begin = 0; result->end = plinks->classCount - offset - 1; result->value = (VOID *) CreateMultifield(result->end + 1); if (result->end == -1) return; for (i = offset , j = 1 ; i < plinks->classCount ; i++ , j++) { SetMFType(result->value,j,SYMBOL); SetMFValue(result->value,j,GetDefclassNamePointer((VOID *) plinks->classArray[i])); } } /************************************************************************** NAME : ClassSubclasses DESCRIPTION : Groups the names of subclasses for a class into a multifield value for dynamic perusal INPUTS : 1) Generic pointer to class 2) Data object buffer to hold the sublclasses of the class 3) Include (1) or exclude (0) indirect subclasses RETURNS : Nothing useful SIDE EFFECTS : Creates a multifield storing the names the subclasses of the class NOTES : None **************************************************************************/globle VOID ClassSubclasses(clsptr,result,inhp) VOID *clsptr; DATA_OBJECT *result; int inhp; { register int i,id; if ((id = GetTraversalID()) == -1) return; i = CountSubclasses((DEFCLASS *) clsptr,inhp,id); ReleaseTraversalID(); result->type = MULTIFIELD; result->begin = 0; result->end = i - 1; result->value = (VOID *) CreateMultifield(i); if (i == 0) return; if ((id = GetTraversalID()) == -1) return; StoreSubclasses(result->value,1,(DEFCLASS *) clsptr,inhp,id); ReleaseTraversalID(); }/************************************************************************** NAME : Slot... Slot information access functions DESCRIPTION : Groups the sources/facets/types/allowed-values/range or cardinality of a slot for a class into a multifield value for dynamic perusal INPUTS : 1) Generic pointer to class 2) Name of the slot 3) Data object buffer to hold the attributes of the class RETURNS : Nothing useful SIDE EFFECTS : Creates a multifield storing the attributes for the slot of the class NOTES : None **************************************************************************/globle VOID SlotFacets(clsptr,sname,result) VOID *clsptr; char *sname; DATA_OBJECT *result; { register int i; register SLOT_DESC *sp; if ((sp = SlotInfoSlot(result,(DEFCLASS *) clsptr,sname,"slot-facets")) == NULL) return;#if INSTANCE_PATTERN_MATCHING result->end = 9; result->value = (VOID *) CreateMultifield(10L); for (i = 1 ; i <= 10 ; i++) SetMFType(result->value,i,SYMBOL);#else result->end = 8; result->value = (VOID *) CreateMultifield(9L); for (i = 1 ; i <= 9 ; i++) SetMFType(result->value,i,SYMBOL);#endif SetMFValue(result->value,1,AddSymbol(sp->multiple ? "MLT" : "SGL")); if (sp->noDefault) SetMFValue(result->value,2,AddSymbol("NIL")); else SetMFValue(result->value,2,AddSymbol(sp->dynamicDefault ? "DYN" : "STC")); SetMFValue(result->value,3,AddSymbol(sp->noInherit ? "NIL" : "INH")); if (sp->initializeOnly) SetMFValue(result->value,4,AddSymbol("INT")); else if (sp->noWrite) SetMFValue(result->value,4,AddSymbol("R")); else SetMFValue(result->value,4,AddSymbol("RW")); SetMFValue(result->value,5,AddSymbol(sp->shared ? "SHR" : "LCL"));#if INSTANCE_PATTERN_MATCHING SetMFValue(result->value,6,AddSymbol(sp->reactive ? "RCT" : "NIL")); SetMFValue(result->value,7,AddSymbol(sp->composite ? "CMP" : "EXC")); SetMFValue(result->value,8,AddSymbol(sp->publicVisibility ? "PUB" : "PRV")); SetMFValue(result->value,9,AddSymbol(GetCreateAccessorString((VOID *) sp))); SetMFValue(result->value,10,sp->noWrite ? AddSymbol("NIL") : (VOID *) sp->overrideMessage);#else SetMFValue(result->value,6,AddSymbol(sp->composite ? "CMP" : "EXC")); SetMFValue(result->value,7,AddSymbol(sp->publicVisibility ? "PUB" : "PRV")); SetMFValue(result->value,8,AddSymbol(GetCreateAccessorString((VOID *) sp))); SetMFValue(result->value,9,sp->noWrite ? AddSymbol("NIL") : (VOID *) sp->overrideMessage);#endif }globle VOID SlotSources(clsptr,sname,result) VOID *clsptr; char *sname; DATA_OBJECT *result; { register int i,classi; register SLOT_DESC *sp,*csp; CLASS_LINK *ctop,*ctmp; DEFCLASS *cls; if ((sp = SlotInfoSlot(result,(DEFCLASS *) clsptr,sname,"slot-sources")) == NULL) return; i = 1; ctop = get_struct(classLink); ctop->cls = sp->cls; ctop->nxt = NULL; if (sp->composite) { for (classi = 1 ; classi < sp->cls->allSuperclasses.classCount ; classi++) { cls = sp->cls->allSuperclasses.classArray[classi]; csp = FindClassSlot(cls,sp->slotName->name); if ((csp != NULL) ? (csp->noInherit == 0) : CLIPS_FALSE) { ctmp = get_struct(classLink); ctmp->cls = cls; ctmp->nxt = ctop; ctop = ctmp; i++; if (csp->composite == 0) break; } } } result->end = i - 1; result->value = (VOID *) CreateMultifield(i); for (ctmp = ctop , i = 1 ; ctmp != NULL ; ctmp = ctmp->nxt , i++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -