/*************************************************************************** NAME : GetQueryInstanceSlot DESCRIPTION : Internal function for referring to slots of instances in instance array on instance-queries INPUTS : The caller's result buffer RETURNS : Nothing useful SIDE EFFECTS : Caller's result buffer set appropriately NOTES : H/L Syntax : ((query-instance-slot) <index> <slot-name>) **************************************************************************/ globle void GetQueryInstanceSlot( DATA_OBJECT *result) { INSTANCE_TYPE *ins; INSTANCE_SLOT *sp; DATA_OBJECT temp; QUERY_CORE *core; result->type = SYMBOL; result->value = FalseSymbol; core = FindQueryCore(DOPToInteger(GetFirstArgument())); ins = core->solns[DOPToInteger(GetFirstArgument()->nextArg)]; EvaluateExpression(GetFirstArgument()->nextArg->nextArg,&temp); if (temp.type != SYMBOL) { ExpectedTypeError1("get",1,"symbol"); SetEvaluationError(TRUE); return; } sp = FindInstanceSlot(ins,(SYMBOL_HN *) temp.value); if (sp == NULL) { SlotExistError(ValueToString(temp.value),"instance-set query"); return; } result->type = sp->type; result->value = sp->value; if (sp->type == MULTIFIELD) { result->begin = 0; result->end = GetInstanceSlotLength(sp) - 1; } }
/************************************************************* NAME : GetQueryInstance DESCRIPTION : Internal function for referring to instance array on instance-queries INPUTS : None RETURNS : The name of the specified instance-set member SIDE EFFECTS : None NOTES : H/L Syntax : ((query-instance) <index>) *************************************************************/ globle SYMBOL_HN *GetQueryInstance() { register QUERY_CORE *core; core = FindQueryCore(DOPToInteger(GetFirstArgument())); return(GetFullInstanceName(core->solns[DOPToInteger(GetFirstArgument()->nextArg)])); }
/*************************************************************************** NAME : GetQueryInstanceSlot DESCRIPTION : Internal function for referring to slots of instances in instance array on instance-queries INPUTS : The caller's result buffer RETURNS : Nothing useful SIDE EFFECTS : Caller's result buffer set appropriately NOTES : H/L Syntax : ((query-instance-slot) <index> <slot-name>) **************************************************************************/ globle void GetQueryInstanceSlot( void *theEnv, DATA_OBJECT *result) { INSTANCE_TYPE *ins; INSTANCE_SLOT *sp; DATA_OBJECT temp; QUERY_CORE *core; result->type = SYMBOL; result->value = EnvFalseSymbol(theEnv); core = FindQueryCore(theEnv,ValueToInteger(GetpValue(GetFirstArgument()))); ins = core->solns[ValueToInteger(GetpValue(GetFirstArgument()->nextArg))]; EvaluateExpression(theEnv,GetFirstArgument()->nextArg->nextArg,&temp); if (temp.type != SYMBOL) { ExpectedTypeError1(theEnv,"get",1,"symbol"); EnvSetEvaluationError(theEnv,TRUE); return; } sp = FindInstanceSlot(theEnv,ins,(SYMBOL_HN *) temp.value); if (sp == NULL) { SlotExistError(theEnv,ValueToString(temp.value),"instance-set query"); return; } result->type = (unsigned short) sp->type; result->value = sp->value; if (sp->type == MULTIFIELD) { result->begin = 0; SetpDOEnd(result,GetInstanceSlotLength(sp)); } }
/************************************************************* NAME : GetQueryInstance DESCRIPTION : Internal function for referring to instance array on instance-queries INPUTS : None RETURNS : The name of the specified instance-set member SIDE EFFECTS : None NOTES : H/L Syntax : ((query-instance) <index>) *************************************************************/ globle void *GetQueryInstance( void *theEnv) { register QUERY_CORE *core; core = FindQueryCore(theEnv,ValueToInteger(GetpValue(GetFirstArgument()))); return(GetFullInstanceName(theEnv,core->solns[ValueToInteger(GetpValue(GetFirstArgument()->nextArg))])); }
/************************************************************* NAME : GetQueryFact DESCRIPTION : Internal function for referring to fact array on fact-queries INPUTS : None RETURNS : The name of the specified fact-set member SIDE EFFECTS : None NOTES : H/L Syntax : ((query-fact) <index>) *************************************************************/ globle void GetQueryFact( void *theEnv, DATA_OBJECT *result) { register QUERY_CORE *core; core = FindQueryCore(theEnv,ValueToInteger(GetpValue(GetFirstArgument()))); result->type = FACT_ADDRESS; result->value = core->solns[ValueToInteger(GetpValue(GetFirstArgument()->nextArg))]; }
/************************************************************* NAME : GetQueryFact DESCRIPTION : Internal function for referring to fact array on fact-queries INPUTS : None RETURNS : The name of the specified fact-set member SIDE EFFECTS : None NOTES : H/L Syntax : ((query-fact) <index>) *************************************************************/ void GetQueryFact( Environment *theEnv, UDFContext *context, UDFValue *returnValue) { QUERY_CORE *core; core = FindQueryCore(theEnv,GetFirstArgument()->integerValue->contents); returnValue->factValue = core->solns[GetFirstArgument()->nextArg->integerValue->contents]; }
/************************************************************* NAME : GetQueryFact DESCRIPTION : Internal function for referring to fact array on fact-queries INPUTS : None RETURNS : The name of the specified fact-set member SIDE EFFECTS : None NOTES : H/L Syntax : ((query-fact) <index>) *************************************************************/ globle void GetQueryFact( void *theEnv, DATA_OBJECT *result) { register QUERY_CORE *core; core = FindQueryCore(theEnv,DOPToInteger(GetFirstArgument())); result->type = FACT_ADDRESS; result->value = core->solns[DOPToInteger(GetFirstArgument()->nextArg)]; /* return(GetFullInstanceName(theEnv,core->solns[DOPToInteger(GetFirstArgument()->nextArg)])); */ }
/*************************************************************************** NAME : GetQueryFactSlot DESCRIPTION : Internal function for referring to slots of fact in fact array on fact-queries INPUTS : The caller's result buffer RETURNS : Nothing useful SIDE EFFECTS : Caller's result buffer set appropriately NOTES : H/L Syntax : ((query-fact-slot) <index> <slot-name>) **************************************************************************/ globle void GetQueryFactSlot( void *theEnv, DATA_OBJECT *result) { struct fact *theFact; DATA_OBJECT temp; QUERY_CORE *core; short position; result->type = SYMBOL; result->value = EnvFalseSymbol(theEnv); core = FindQueryCore(theEnv,ValueToInteger(GetpValue(GetFirstArgument()))); theFact = core->solns[ValueToInteger(GetpValue(GetFirstArgument()->nextArg))]; EvaluateExpression(theEnv,GetFirstArgument()->nextArg->nextArg,&temp); if (temp.type != SYMBOL) { ExpectedTypeError1(theEnv,"get",1,"symbol"); SetEvaluationError(theEnv,TRUE); return; } /*==================================================*/ /* Make sure the slot exists (the symbol implied is */ /* used for the implied slot of an ordered fact). */ /*==================================================*/ if (theFact->whichDeftemplate->implied) { if (strcmp(ValueToString(temp.value),"implied") != 0) { SlotExistError(theEnv,ValueToString(temp.value),"fact-set query"); return; } position = 1; } else if (FindSlot((struct deftemplate *) theFact->whichDeftemplate, (struct symbolHashNode *) temp.value,&position) == NULL) { SlotExistError(theEnv,ValueToString(temp.value),"fact-set query"); return; } result->type = theFact->theProposition.theFields[position-1].type; result->value = theFact->theProposition.theFields[position-1].value; if (result->type == MULTIFIELD) { SetpDOBegin(result,1); SetpDOEnd(result,((struct multifield *) result->value)->multifieldLength); } }
/*************************************************************************** NAME : GetQueryFactSlot DESCRIPTION : Internal function for referring to slots of fact in fact array on fact-queries INPUTS : The caller's result buffer RETURNS : Nothing useful SIDE EFFECTS : Caller's result buffer set appropriately NOTES : H/L Syntax : ((query-fact-slot) <index> <slot-name>) **************************************************************************/ void GetQueryFactSlot( Environment *theEnv, UDFContext *context, UDFValue *returnValue) { Fact *theFact; UDFValue temp; QUERY_CORE *core; unsigned short position; const char *varSlot; returnValue->lexemeValue = FalseSymbol(theEnv); core = FindQueryCore(theEnv,GetFirstArgument()->integerValue->contents); theFact = core->solns[GetFirstArgument()->nextArg->integerValue->contents]; varSlot = GetFirstArgument()->nextArg->nextArg->nextArg->lexemeValue->contents; /*=========================================*/ /* Accessing the slot value of a retracted */ /* fact generates an error. */ /*=========================================*/ if (theFact->garbage) { FactVarSlotErrorMessage1(theEnv,theFact,varSlot); SetEvaluationError(theEnv,true); return; } /*=========================*/ /* Retrieve the slot name. */ /*=========================*/ EvaluateExpression(theEnv,GetFirstArgument()->nextArg->nextArg,&temp); if (temp.header->type != SYMBOL_TYPE) { InvalidVarSlotErrorMessage(theEnv,varSlot); SetEvaluationError(theEnv,true); return; } /*==================================================*/ /* Make sure the slot exists (the symbol implied is */ /* used for the implied slot of an ordered fact). */ /*==================================================*/ if (theFact->whichDeftemplate->implied) { if (strcmp(temp.lexemeValue->contents,"implied") != 0) { FactVarSlotErrorMessage2(theEnv,theFact,varSlot); SetEvaluationError(theEnv,true); return; } position = 0; } else if (FindSlot(theFact->whichDeftemplate, (CLIPSLexeme *) temp.value,&position) == NULL) { FactVarSlotErrorMessage2(theEnv,theFact,varSlot); SetEvaluationError(theEnv,true); return; } returnValue->value = theFact->theProposition.contents[position].value; if (returnValue->header->type == MULTIFIELD_TYPE) { returnValue->begin = 0; returnValue->range = returnValue->multifieldValue->length; } }