/********************************************************************* NAME : StoreSubclasses DESCRIPTION : Stores the names of direct or indirect subclasses for a class in a mutlifield INPUTS : 1) Caller's multifield buffer 2) Starting index 3) Address of the class 4) Include (1) or exclude (0) indirect subclasses 5) Traversal id RETURNS : The number of subclass names stored in the multifield SIDE EFFECTS : Multifield set with subclass names NOTES : Assumes multifield is big enough to hold subclasses *********************************************************************/ static unsigned StoreSubclasses( void *mfval, unsigned si, DEFCLASS *cls, int inhp, int tvid, short storeName) { long i,classi; register DEFCLASS *subcls; for (i = si , classi = 0 ; classi < cls->directSubclasses.classCount ; classi++) { subcls = cls->directSubclasses.classArray[classi]; if (TestTraversalID(subcls->traversalRecord,tvid) == 0) { SetTraversalID(subcls->traversalRecord,tvid); if (storeName) { SetMFType(mfval,i,SYMBOL); SetMFValue(mfval,i++,(void *) GetDefclassNamePointer((void *) subcls)); } else { SetMFType(mfval,i,DEFCLASS_PTR); SetMFValue(mfval,i++,(void *) subcls); } if (inhp && (subcls->directSubclasses.classCount != 0)) i += StoreSubclasses(mfval,i,subcls,inhp,tvid,storeName); } } return(i - si); }
/************************************************************************** NAME : ClassSubclassAddresses DESCRIPTION : Groups the class addresses 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 subclass addresss of the class NOTES : None **************************************************************************/ globle void ClassSubclassAddresses( 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,FALSE); ReleaseTraversalID(); }
/************************************************************************** NAME : ClassSubclassAddresses DESCRIPTION : Groups the class addresses 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 subclass addresss of the class NOTES : None **************************************************************************/ globle void ClassSubclassAddresses( void *theEnv, void *clsptr, DATA_OBJECT *result, int inhp) { register int i; // Bug fix 2014-07-18: Previously unsigned and SetpDOEnd decremented to -1. register int id; if ((id = GetTraversalID(theEnv)) == -1) return; i = CountSubclasses((DEFCLASS *) clsptr,inhp,id); ReleaseTraversalID(theEnv); result->type = MULTIFIELD; result->begin = 0; SetpDOEnd(result,i); result->value = (void *) EnvCreateMultifield(theEnv,i); if (i == 0) return; if ((id = GetTraversalID(theEnv)) == -1) return; StoreSubclasses(result->value,1,(DEFCLASS *) clsptr,inhp,id,FALSE); ReleaseTraversalID(theEnv); }
/************************************************************************** NAME : EnvClassSubclasses 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 EnvClassSubclasses( void *theEnv, void *clsptr, DATA_OBJECT *result, int inhp) { register unsigned i; register int id; if ((id = GetTraversalID(theEnv)) == -1) return; i = CountSubclasses((DEFCLASS *) clsptr,inhp,id); ReleaseTraversalID(theEnv); result->type = MULTIFIELD; result->begin = 0; SetpDOEnd(result,i); result->value = (void *) EnvCreateMultifield(theEnv,i); if (i == 0) return; if ((id = GetTraversalID(theEnv)) == -1) return; StoreSubclasses(result->value,1,(DEFCLASS *) clsptr,inhp,id,TRUE); ReleaseTraversalID(theEnv); }