void UDFInvalidArgumentMessage( UDFContext *context, const char *typeString) { ExpectedTypeError1(UDFContextEnvironment(context), UDFContextFunctionName(context), context->lastPosition-1,typeString); }
Defmodule *GetModuleName( UDFContext *context, unsigned int whichArgument, bool *error) { UDFValue returnValue; Defmodule *theModule; Environment *theEnv = context->environment; const char *functionName = UDFContextFunctionName(context); *error = false; /*========================*/ /* Retrieve the argument. */ /*========================*/ if (! UDFNthArgument(context,1,SYMBOL_BIT,&returnValue)) { *error = true; return NULL; } /*=======================================*/ /* Check to see that the symbol actually */ /* corresponds to a defined module. */ /*=======================================*/ if ((theModule = FindDefmodule(theEnv,returnValue.lexemeValue->contents)) == NULL) { if (strcmp("*",returnValue.lexemeValue->contents) != 0) { ExpectedTypeError1(theEnv,functionName,whichArgument,"'defmodule name'"); *error = true; } return NULL; } /*=================================*/ /* Return a pointer to the module. */ /*=================================*/ return(theModule); }
bool UDFNextArgument( UDFContext *context, unsigned expectedType, CLIPSValue *returnValue) { struct expr *argPtr = context->lastArg; int argumentPosition = context->lastPosition; void *theEnv = context->environment; returnValue->environment = theEnv; if (argPtr == NULL) { EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); return false; } context->lastPosition++; context->lastArg = context->lastArg->nextArg; switch (argPtr->type) { case INTEGER: returnValue->type = argPtr->type; returnValue->bitType = INTEGER_TYPE; returnValue->value = argPtr->value; if (expectedType & INTEGER_TYPE) return(true); ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; break; case FLOAT: returnValue->type = argPtr->type; returnValue->bitType = FLOAT_TYPE; returnValue->value = argPtr->value; if (expectedType & FLOAT_TYPE) return(true); ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; break; case SYMBOL: returnValue->type = argPtr->type; returnValue->value = argPtr->value; returnValue->bitType = SYMBOL_TYPE; if (expectedType & SYMBOL_TYPE) return(true); ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; break; case STRING: returnValue->type = argPtr->type; returnValue->value = argPtr->value; returnValue->bitType = STRING_TYPE; if (expectedType & STRING_TYPE) return(true); ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; break; case INSTANCE_NAME: returnValue->type = argPtr->type; returnValue->value = argPtr->value; returnValue->bitType = INSTANCE_NAME_TYPE; if (expectedType & INSTANCE_NAME_TYPE) return(true); ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; break; } EvaluateExpression(theEnv,argPtr,returnValue); switch (returnValue->type) { case RVOID: returnValue->bitType = VOID_TYPE; if (expectedType & VOID_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case INTEGER: returnValue->bitType = INTEGER_TYPE; if (expectedType & INTEGER_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case FLOAT: returnValue->bitType = FLOAT_TYPE; if (expectedType & FLOAT_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case SYMBOL: returnValue->bitType = SYMBOL_TYPE; if (expectedType & SYMBOL_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case STRING: returnValue->bitType = STRING_TYPE; if (expectedType & STRING_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case INSTANCE_NAME: returnValue->bitType = INSTANCE_NAME_TYPE; if (expectedType & INSTANCE_NAME_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case EXTERNAL_ADDRESS: returnValue->bitType = EXTERNAL_ADDRESS_TYPE; if (expectedType & EXTERNAL_ADDRESS_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case FACT_ADDRESS: returnValue->bitType = FACT_ADDRESS_TYPE; if (expectedType & FACT_ADDRESS_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case INSTANCE_ADDRESS: returnValue->bitType = INSTANCE_ADDRESS_TYPE; if (expectedType & INSTANCE_ADDRESS_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; case MULTIFIELD: returnValue->bitType = MULTIFIELD_TYPE; if (expectedType & MULTIFIELD_TYPE) { if (EvaluationData(theEnv)->EvaluationError) { AssignErrorValue(context); return false; } else return true; } break; } ExpectedTypeError0(theEnv,UDFContextFunctionName(context),argumentPosition); PrintTypesString(theEnv,WERROR,expectedType,true); EnvSetHaltExecution(theEnv,true); EnvSetEvaluationError(theEnv,true); AssignErrorValue(context); return false; }
void *GetFactOrInstanceArgument( UDFContext *context, unsigned int thePosition, UDFValue *item) { Environment *theEnv = context->environment; #if DEFTEMPLATE_CONSTRUCT || OBJECT_SYSTEM void *ptr; #endif /*==============================*/ /* Retrieve the first argument. */ /*==============================*/ UDFNthArgument(context,thePosition,ANY_TYPE_BITS,item); /*==================================================*/ /* Fact and instance addresses are valid arguments. */ /*==================================================*/ if (CVIsType(item,FACT_ADDRESS_BIT)) { if (item->factValue->garbage) { FactRetractedErrorMessage(theEnv,item->factValue); return NULL; } return item->value; } else if (CVIsType(item,INSTANCE_ADDRESS_BIT)) { if (item->instanceValue->garbage) { CantFindItemErrorMessage(theEnv,"instance",item->instanceValue->name->contents,false); return NULL; } return item->value; } /*==================================================*/ /* An integer is a valid argument if it corresponds */ /* to the fact index of an existing fact. */ /*==================================================*/ #if DEFTEMPLATE_CONSTRUCT else if (item->header->type == INTEGER_TYPE) { if ((ptr = (void *) FindIndexedFact(theEnv,item->integerValue->contents)) == NULL) { char tempBuffer[20]; gensprintf(tempBuffer,"f-%lld",item->integerValue->contents); CantFindItemErrorMessage(theEnv,"fact",tempBuffer,false); } return ptr; } #endif /*================================================*/ /* Instance names and symbols are valid arguments */ /* if they correspond to an existing instance. */ /*================================================*/ #if OBJECT_SYSTEM else if (CVIsType(item,INSTANCE_NAME_BIT | SYMBOL_BIT)) { if ((ptr = (void *) FindInstanceBySymbol(theEnv,item->lexemeValue)) == NULL) { CantFindItemErrorMessage(theEnv,"instance",item->lexemeValue->contents,false); } return ptr; } #endif /*========================================*/ /* Any other type is an invalid argument. */ /*========================================*/ ExpectedTypeError2(theEnv,UDFContextFunctionName(context),thePosition); return NULL; }