/****************************************************** NAME : EnvDescribeClass DESCRIPTION : Displays direct superclasses and subclasses and the entire precedence list for a class INPUTS : 1) The logical name of the output 2) Class pointer RETURNS : Nothing useful SIDE EFFECTS : None NOTES : None ******************************************************/ globle void EnvDescribeClass( void *theEnv, char *logicalName, void *clsptr) { DEFCLASS *cls; char buf[83], slotNamePrintFormat[12], overrideMessagePrintFormat[12]; int messageBanner; long i; size_t slotNameLength, maxSlotNameLength; size_t overrideMessageLength, maxOverrideMessageLength; cls = (DEFCLASS *) clsptr; DisplaySeparator(theEnv,logicalName,buf,82,'='); DisplaySeparator(theEnv,logicalName,buf,82,'*'); if (cls->abstract) EnvPrintRouter(theEnv,logicalName,"Abstract: direct instances of this class cannot be created.\n\n"); else { EnvPrintRouter(theEnv,logicalName,"Concrete: direct instances of this class can be created.\n"); #if DEFRULE_CONSTRUCT if (cls->reactive) EnvPrintRouter(theEnv,logicalName,"Reactive: direct instances of this class can match defrule patterns.\n\n"); else EnvPrintRouter(theEnv,logicalName,"Non-reactive: direct instances of this class cannot match defrule patterns.\n\n"); #else EnvPrintRouter(theEnv,logicalName,"\n"); #endif } PrintPackedClassLinks(theEnv,logicalName,"Direct Superclasses:",&cls->directSuperclasses); PrintPackedClassLinks(theEnv,logicalName,"Inheritance Precedence:",&cls->allSuperclasses); PrintPackedClassLinks(theEnv,logicalName,"Direct Subclasses:",&cls->directSubclasses); if (cls->instanceTemplate != NULL) { DisplaySeparator(theEnv,logicalName,buf,82,'-'); maxSlotNameLength = 5; maxOverrideMessageLength = 8; for (i = 0 ; i < cls->instanceSlotCount ; i++) { slotNameLength = strlen(ValueToString(cls->instanceTemplate[i]->slotName->name)); if (slotNameLength > maxSlotNameLength) maxSlotNameLength = slotNameLength; if (cls->instanceTemplate[i]->noWrite == 0) { overrideMessageLength = strlen(ValueToString(cls->instanceTemplate[i]->overrideMessage)); if (overrideMessageLength > maxOverrideMessageLength) maxOverrideMessageLength = overrideMessageLength; } } if (maxSlotNameLength > 16) maxSlotNameLength = 16; if (maxOverrideMessageLength > 12) maxOverrideMessageLength = 12; #if WIN_MVC gensprintf(slotNamePrintFormat,"%%-%Id.%Ids : ",maxSlotNameLength,maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%Id.%Ids ",maxOverrideMessageLength, maxOverrideMessageLength); #elif WIN_GCC gensprintf(slotNamePrintFormat,"%%-%ld.%lds : ",(long) maxSlotNameLength,(long) maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%ld.%lds ",(long) maxOverrideMessageLength, (long) maxOverrideMessageLength); #else gensprintf(slotNamePrintFormat,"%%-%zd.%zds : ",maxSlotNameLength,maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%zd.%zds ",maxOverrideMessageLength, maxOverrideMessageLength); #endif DisplaySlotBasicInfo(theEnv,logicalName,slotNamePrintFormat,overrideMessagePrintFormat,buf,cls); EnvPrintRouter(theEnv,logicalName,"\nConstraint information for slots:\n\n"); DisplaySlotConstraintInfo(theEnv,logicalName,slotNamePrintFormat,buf,82,cls); } if (cls->handlerCount > 0) messageBanner = TRUE; else { messageBanner = FALSE; for (i = 1 ; i < cls->allSuperclasses.classCount ; i++) if (cls->allSuperclasses.classArray[i]->handlerCount > 0) { messageBanner = TRUE; break; } } if (messageBanner) { DisplaySeparator(theEnv,logicalName,buf,82,'-'); EnvPrintRouter(theEnv,logicalName,"Recognized message-handlers:\n"); DisplayHandlersInLinks(theEnv,logicalName,&cls->allSuperclasses,0); } DisplaySeparator(theEnv,logicalName,buf,82,'*'); DisplaySeparator(theEnv,logicalName,buf,82,'='); }
/****************************************************** NAME : DescribeClass DESCRIPTION : Displays direct superclasses and subclasses and the entire precedence list for a class INPUTS : 1) The logical name of the output 2) Class pointer RETURNS : Nothing useful SIDE EFFECTS : None NOTES : None ******************************************************/ void DescribeClass( Defclass *theDefclass, const char *logicalName) { char buf[83], slotNamePrintFormat[12], overrideMessagePrintFormat[12]; bool messageBanner; unsigned long i; size_t slotNameLength, maxSlotNameLength; size_t overrideMessageLength, maxOverrideMessageLength; Environment *theEnv = theDefclass->header.env; DisplaySeparator(theEnv,logicalName,buf,82,'='); DisplaySeparator(theEnv,logicalName,buf,82,'*'); if (theDefclass->abstract) WriteString(theEnv,logicalName,"Abstract: direct instances of this class cannot be created.\n\n"); else { WriteString(theEnv,logicalName,"Concrete: direct instances of this class can be created.\n"); #if DEFRULE_CONSTRUCT if (theDefclass->reactive) WriteString(theEnv,logicalName,"Reactive: direct instances of this class can match defrule patterns.\n\n"); else WriteString(theEnv,logicalName,"Non-reactive: direct instances of this class cannot match defrule patterns.\n\n"); #else WriteString(theEnv,logicalName,"\n"); #endif } PrintPackedClassLinks(theEnv,logicalName,"Direct Superclasses:",&theDefclass->directSuperclasses); PrintPackedClassLinks(theEnv,logicalName,"Inheritance Precedence:",&theDefclass->allSuperclasses); PrintPackedClassLinks(theEnv,logicalName,"Direct Subclasses:",&theDefclass->directSubclasses); if (theDefclass->instanceTemplate != NULL) { DisplaySeparator(theEnv,logicalName,buf,82,'-'); maxSlotNameLength = 5; maxOverrideMessageLength = 8; for (i = 0 ; i < theDefclass->instanceSlotCount ; i++) { slotNameLength = strlen(theDefclass->instanceTemplate[i]->slotName->name->contents); if (slotNameLength > maxSlotNameLength) maxSlotNameLength = slotNameLength; if (theDefclass->instanceTemplate[i]->noWrite == 0) { overrideMessageLength = strlen(theDefclass->instanceTemplate[i]->overrideMessage->contents); if (overrideMessageLength > maxOverrideMessageLength) maxOverrideMessageLength = overrideMessageLength; } } if (maxSlotNameLength > 16) maxSlotNameLength = 16; if (maxOverrideMessageLength > 12) maxOverrideMessageLength = 12; /* #if WIN_MVC gensprintf(slotNamePrintFormat,"%%-%Id.%Ids : ",maxSlotNameLength,maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%Id.%Ids ",maxOverrideMessageLength, maxOverrideMessageLength); #elif WIN_GCC gensprintf(slotNamePrintFormat,"%%-%ld.%lds : ",(long) maxSlotNameLength,(long) maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%ld.%lds ",(long) maxOverrideMessageLength, (long) maxOverrideMessageLength); #else */ gensprintf(slotNamePrintFormat,"%%-%zd.%zds : ",maxSlotNameLength,maxSlotNameLength); gensprintf(overrideMessagePrintFormat,"%%-%zd.%zds ",maxOverrideMessageLength, maxOverrideMessageLength); /* #endif */ DisplaySlotBasicInfo(theEnv,logicalName,slotNamePrintFormat,overrideMessagePrintFormat,buf,theDefclass); WriteString(theEnv,logicalName,"\nConstraint information for slots:\n\n"); DisplaySlotConstraintInfo(theEnv,logicalName,slotNamePrintFormat,buf,82,theDefclass); } if (theDefclass->handlerCount > 0) messageBanner = true; else { messageBanner = false; for (i = 1 ; i < theDefclass->allSuperclasses.classCount ; i++) if (theDefclass->allSuperclasses.classArray[i]->handlerCount > 0) { messageBanner = true; break; } } if (messageBanner) { DisplaySeparator(theEnv,logicalName,buf,82,'-'); WriteString(theEnv,logicalName,"Recognized message-handlers:\n"); DisplayHandlersInLinks(theEnv,logicalName,&theDefclass->allSuperclasses,0); } DisplaySeparator(theEnv,logicalName,buf,82,'*'); DisplaySeparator(theEnv,logicalName,buf,82,'='); }