globle const char *DataObjectToString( void *theEnv, DATA_OBJECT *theDO) { void *thePtr; const char *theString; char *newString; const char *prefix, *postfix; size_t length; struct externalAddressHashNode *theAddress; char buffer[30]; switch (GetpType(theDO)) { case MULTIFIELD: prefix = "("; theString = ValueToString(ImplodeMultifield(theEnv,theDO)); postfix = ")"; break; case STRING: prefix = "\""; theString = DOPToString(theDO); postfix = "\""; break; case INSTANCE_NAME: prefix = "["; theString = DOPToString(theDO); postfix = "]"; break; case SYMBOL: return(DOPToString(theDO)); case FLOAT: return(FloatToString(theEnv,DOPToDouble(theDO))); case INTEGER: return(LongIntegerToString(theEnv,DOPToLong(theDO))); case RVOID: return(""); #if OBJECT_SYSTEM case INSTANCE_ADDRESS: thePtr = DOPToPointer(theDO); if (thePtr == (void *) &InstanceData(theEnv)->DummyInstance) { return("<Dummy Instance>"); } if (((struct instance *) thePtr)->garbage) { prefix = "<Stale Instance-"; theString = ValueToString(((struct instance *) thePtr)->name); postfix = ">"; } else { prefix = "<Instance-"; theString = ValueToString(GetFullInstanceName(theEnv,(INSTANCE_TYPE *) thePtr)); postfix = ">"; } break; #endif case EXTERNAL_ADDRESS: theAddress = (struct externalAddressHashNode *) DOPToPointer(theDO); /* TBD Need specific routine for creating name string. */ gensprintf(buffer,"<Pointer-%d-%p>",(int) theAddress->type,DOPToExternalAddress(theDO)); thePtr = EnvAddSymbol(theEnv,buffer); return(ValueToString(thePtr)); #if DEFTEMPLATE_CONSTRUCT case FACT_ADDRESS: if (DOPToPointer(theDO) == (void *) &FactData(theEnv)->DummyFact) { return("<Dummy Fact>"); } thePtr = DOPToPointer(theDO); gensprintf(buffer,"<Fact-%lld>",((struct fact *) thePtr)->factIndex); thePtr = EnvAddSymbol(theEnv,buffer); return(ValueToString(thePtr)); #endif default: return("UNK"); } length = strlen(prefix) + strlen(theString) + strlen(postfix) + 1; newString = (char *) genalloc(theEnv,length); newString[0] = '\0'; genstrcat(newString,prefix); genstrcat(newString,theString); genstrcat(newString,postfix); thePtr = EnvAddSymbol(theEnv,newString); genfree(theEnv,newString,length); return(ValueToString(thePtr)); }
const char *DataObjectToString( Environment *theEnv, UDFValue *theDO) { CLIPSLexeme *thePtr; const char *theString; char *newString; const char *prefix, *postfix; size_t length; CLIPSExternalAddress *theAddress; StringBuilder *theSB; char buffer[30]; switch (theDO->header->type) { case MULTIFIELD_TYPE: prefix = "("; theString = ImplodeMultifield(theEnv,theDO)->contents; postfix = ")"; break; case STRING_TYPE: prefix = "\""; theString = theDO->lexemeValue->contents; postfix = "\""; break; case INSTANCE_NAME_TYPE: prefix = "["; theString = theDO->lexemeValue->contents; postfix = "]"; break; case SYMBOL_TYPE: return theDO->lexemeValue->contents; case FLOAT_TYPE: return(FloatToString(theEnv,theDO->floatValue->contents)); case INTEGER_TYPE: return(LongIntegerToString(theEnv,theDO->integerValue->contents)); case VOID_TYPE: return(""); #if OBJECT_SYSTEM case INSTANCE_ADDRESS_TYPE: if (theDO->instanceValue == &InstanceData(theEnv)->DummyInstance) { return("<Dummy Instance>"); } if (theDO->instanceValue->garbage) { prefix = "<Stale Instance-"; theString = theDO->instanceValue->name->contents; postfix = ">"; } else { prefix = "<Instance-"; theString = GetFullInstanceName(theEnv,theDO->instanceValue)->contents; postfix = ">"; } break; #endif case EXTERNAL_ADDRESS_TYPE: theAddress = theDO->externalAddressValue; theSB = CreateStringBuilder(theEnv,30); OpenStringBuilderDestination(theEnv,"DOTS",theSB); if ((EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type] != NULL) && (EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type]->longPrintFunction != NULL)) { (*EvaluationData(theEnv)->ExternalAddressTypes[theAddress->type]->longPrintFunction)(theEnv,"DOTS",theAddress); } else { WriteString(theEnv,"DOTS","<Pointer-"); gensprintf(buffer,"%d-",theAddress->type); WriteString(theEnv,"DOTS",buffer); gensprintf(buffer,"%p",theAddress->contents); WriteString(theEnv,"DOTS",buffer); WriteString(theEnv,"DOTS",">"); } thePtr = CreateString(theEnv,theSB->contents); SBDispose(theSB); CloseStringBuilderDestination(theEnv,"DOTS"); return thePtr->contents; #if DEFTEMPLATE_CONSTRUCT case FACT_ADDRESS_TYPE: if (theDO->factValue == &FactData(theEnv)->DummyFact) { return("<Dummy Fact>"); } gensprintf(buffer,"<Fact-%lld>",theDO->factValue->factIndex); thePtr = CreateString(theEnv,buffer); return thePtr->contents; #endif default: return("UNK"); } length = strlen(prefix) + strlen(theString) + strlen(postfix) + 1; newString = (char *) genalloc(theEnv,length); newString[0] = '\0'; genstrcat(newString,prefix); genstrcat(newString,theString); genstrcat(newString,postfix); thePtr = CreateString(theEnv,newString); genfree(theEnv,newString,length); return thePtr->contents; }