1 /*******************************************************/ 2 /* "C" Language Integrated Production System */ 3 /* */ 4 /* CLIPS Version 6.30 02/04/15 */ 5 /* */ 6 /* EVALUATION HEADER FILE */ 7 /*******************************************************/ 8 9 /*************************************************************/ 10 /* Purpose: Provides routines for evaluating expressions. */ 11 /* */ 12 /* Principal Programmer(s): */ 13 /* Gary D. Riley */ 14 /* */ 15 /* Contributing Programmer(s): */ 16 /* */ 17 /* Revision History: */ 18 /* */ 19 /* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */ 20 /* */ 21 /* 6.24: Renamed BOOLEAN macro type to intBool. */ 22 /* */ 23 /* Added EvaluateAndStoreInDataObject function. */ 24 /* */ 25 /* 6.30: Added support for passing context information */ 26 /* to user defined functions. */ 27 /* */ 28 /* Added support for external address hash table */ 29 /* and subtyping. */ 30 /* */ 31 /* Changed integer type/precision. */ 32 /* */ 33 /* Support for long long integers. */ 34 /* */ 35 /* Changed garbage collection algorithm. */ 36 /* */ 37 /* Support for DATA_OBJECT_ARRAY primitive. */ 38 /* */ 39 /* Added const qualifiers to remove C++ */ 40 /* deprecation warnings. */ 41 /* */ 42 /* Converted API macros to function calls. */ 43 /* */ 44 /*************************************************************/ 45 46 #ifndef _H_evaluatn 47 48 #define _H_evaluatn 49 50 struct entityRecord; 51 struct dataObject; 52 53 #ifndef _H_constant 54 #include "constant.h" 55 #endif 56 #ifndef _H_symbol 57 #include "symbol.h" 58 #endif 59 #ifndef _H_expressn 60 #include "expressn.h" 61 #endif 62 63 struct dataObject 64 { 65 void *supplementalInfo; 66 unsigned short type; 67 void *value; 68 long begin; 69 long end; 70 struct dataObject *next; 71 }; 72 73 typedef struct dataObject DATA_OBJECT; 74 typedef struct dataObject * DATA_OBJECT_PTR; 75 76 typedef struct expr FUNCTION_REFERENCE; 77 78 #define DATA_OBJECT_PTR_ARG DATA_OBJECT_PTR 79 80 #define C_POINTER_EXTERNAL_ADDRESS 0 81 82 #include "userdata.h" 83 84 struct entityRecord 85 { 86 const char *name; 87 unsigned int type : 13; 88 unsigned int copyToEvaluate : 1; 89 unsigned int bitMap : 1; 90 unsigned int addsToRuleComplexity : 1; 91 void (*shortPrintFunction)(void *,const char *,void *); 92 void (*longPrintFunction)(void *,const char *,void *); 93 intBool (*deleteFunction)(void *,void *); 94 intBool (*evaluateFunction)(void *,void *,DATA_OBJECT *); 95 void *(*getNextFunction)(void *,void *); 96 void (*decrementBusyCount)(void *,void *); 97 void (*incrementBusyCount)(void *,void *); 98 void (*propagateDepth)(void *,void *); 99 void (*markNeeded)(void *,void *); 100 void (*install)(void *,void *); 101 void (*deinstall)(void *,void *); 102 struct userData *usrData; 103 }; 104 105 struct externalAddressType 106 { 107 const char *name; 108 void (*shortPrintFunction)(void *,const char *,void *); 109 void (*longPrintFunction)(void *,const char *,void *); 110 intBool (*discardFunction)(void *,void *); 111 void (*newFunction)(void *,DATA_OBJECT *); 112 intBool (*callFunction)(void *,DATA_OBJECT *,DATA_OBJECT *); 113 }; 114 115 typedef struct entityRecord ENTITY_RECORD; 116 typedef struct entityRecord * ENTITY_RECORD_PTR; 117 118 #define GetDOLength(target) (((target).end - (target).begin) + 1) 119 #define GetpDOLength(target) (((target)->end - (target)->begin) + 1) 120 #define GetDOBegin(target) ((target).begin + 1) 121 #define GetDOEnd(target) ((target).end + 1) 122 #define GetpDOBegin(target) ((target)->begin + 1) 123 #define GetpDOEnd(target) ((target)->end + 1) 124 #define SetDOBegin(target,val) ((target).begin = (long) ((val) - 1)) 125 #define SetDOEnd(target,val) ((target).end = (long) ((val) - 1)) 126 #define SetpDOBegin(target,val) ((target)->begin = (long) ((val) - 1)) 127 #define SetpDOEnd(target,val) ((target)->end = (long) ((val) - 1)) 128 129 #define EnvGetDOLength(theEnv,target) (((target).end - (target).begin) + 1) 130 #define EnvGetpDOLength(theEnv,target) (((target)->end - (target)->begin) + 1) 131 #define EnvGetDOBegin(theEnv,target) ((target).begin + 1) 132 #define EnvGetDOEnd(theEnv,target) ((target).end + 1) 133 #define EnvGetpDOBegin(theEnv,target) ((target)->begin + 1) 134 #define EnvGetpDOEnd(theEnv,target) ((target)->end + 1) 135 #define EnvSetDOBegin(theEnv,target,val) ((target).begin = (long) ((val) - 1)) 136 #define EnvSetDOEnd(theEnv,target,val) ((target).end = (long) ((val) - 1)) 137 #define EnvSetpDOBegin(theEnv,target,val) ((target)->begin = (long) ((val) - 1)) 138 #define EnvSetpDOEnd(theEnv,target,val) ((target)->end = (long) ((val) - 1)) 139 140 #define DOPToString(target) (((struct symbolHashNode *) ((target)->value))->contents) 141 #define DOPToDouble(target) (((struct floatHashNode *) ((target)->value))->contents) 142 #define DOPToFloat(target) ((float) (((struct floatHashNode *) ((target)->value))->contents)) 143 #define DOPToLong(target) (((struct integerHashNode *) ((target)->value))->contents) 144 #define DOPToInteger(target) ((int) (((struct integerHashNode *) ((target)->value))->contents)) 145 #define DOPToPointer(target) ((target)->value) 146 #define DOPToExternalAddress(target) (((struct externalAddressHashNode *) ((target)->value))->externalAddress) 147 148 #define EnvDOPToString(theEnv,target) (((struct symbolHashNode *) ((target)->value))->contents) 149 #define EnvDOPToDouble(theEnv,target) (((struct floatHashNode *) ((target)->value))->contents) 150 #define EnvDOPToFloat(theEnv,target) ((float) (((struct floatHashNode *) ((target)->value))->contents)) 151 #define EnvDOPToLong(theEnv,target) (((struct integerHashNode *) ((target)->value))->contents) 152 #define EnvDOPToInteger(theEnv,target) ((int) (((struct integerHashNode *) ((target)->value))->contents)) 153 #define EnvDOPToPointer(theEnv,target) ((target)->value) 154 #define EnvDOPToExternalAddress(target) (((struct externalAddressHashNode *) ((target)->value))->externalAddress) 155 156 #define DOToString(target) (((struct symbolHashNode *) ((target).value))->contents) 157 #define DOToDouble(target) (((struct floatHashNode *) ((target).value))->contents) 158 #define DOToFloat(target) ((float) (((struct floatHashNode *) ((target).value))->contents)) 159 #define DOToLong(target) (((struct integerHashNode *) ((target).value))->contents) 160 #define DOToInteger(target) ((int) (((struct integerHashNode *) ((target).value))->contents)) 161 #define DOToPointer(target) ((target).value) 162 #define DOToExternalAddress(target) (((struct externalAddressHashNode *) ((target).value))->externalAddress) 163 164 #define EnvDOToString(theEnv,target) (((struct symbolHashNode *) ((target).value))->contents) 165 #define EnvDOToDouble(theEnv,target) (((struct floatHashNode *) ((target).value))->contents) 166 #define EnvDOToFloat(theEnv,target) ((float) (((struct floatHashNode *) ((target).value))->contents)) 167 #define EnvDOToLong(theEnv,target) (((struct integerHashNode *) ((target).value))->contents) 168 #define EnvDOToInteger(theEnv,target) ((int) (((struct integerHashNode *) ((target).value))->contents)) 169 #define EnvDOToPointer(theEnv,target) ((target).value) 170 #define EnvDOToExternalAddress(target) (((struct externalAddressHashNode *) ((target).value))->externalAddress) 171 172 #define CoerceToLongInteger(t,v) ((t == INTEGER) ? ValueToLong(v) : (long int) ValueToDouble(v)) 173 #define CoerceToInteger(t,v) ((t == INTEGER) ? (int) ValueToLong(v) : (int) ValueToDouble(v)) 174 #define CoerceToDouble(t,v) ((t == INTEGER) ? (double) ValueToLong(v) : ValueToDouble(v)) 175 176 #define GetFirstArgument() (EvaluationData(theEnv)->CurrentExpression->argList) 177 #define GetNextArgument(ep) (ep->nextArg) 178 179 #define MAXIMUM_PRIMITIVES 150 180 #define MAXIMUM_EXTERNAL_ADDRESS_TYPES 10 181 182 #define BITS_PER_BYTE 8 183 184 #define BitwiseTest(n,b) ((n) & (char) (1 << (b))) 185 #define BitwiseSet(n,b) (n |= (char) (1 << (b))) 186 #define BitwiseClear(n,b) (n &= (char) ~(1 << (b))) 187 188 #define TestBitMap(map,id) BitwiseTest(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE) 189 #define SetBitMap(map,id) BitwiseSet(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE) 190 #define ClearBitMap(map,id) BitwiseClear(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE) 191 192 #define EVALUATION_DATA 44 193 194 struct evaluationData 195 { 196 struct expr *CurrentExpression; 197 int EvaluationError; 198 int HaltExecution; 199 int CurrentEvaluationDepth; 200 int numberOfAddressTypes; 201 struct entityRecord *PrimitivesArray[MAXIMUM_PRIMITIVES]; 202 struct externalAddressType *ExternalAddressTypes[MAXIMUM_EXTERNAL_ADDRESS_TYPES]; 203 }; 204 205 #define EvaluationData(theEnv) ((struct evaluationData *) GetEnvironmentData(theEnv,EVALUATION_DATA)) 206 207 #ifdef LOCALE 208 #undef LOCALE 209 #endif 210 211 #ifdef _EVALUATN_SOURCE_ 212 #define LOCALE 213 #else 214 #define LOCALE extern 215 #endif 216 217 LOCALE void InitializeEvaluationData(void *); 218 LOCALE int EvaluateExpression(void *,struct expr *,struct dataObject *); 219 LOCALE void SetEvaluationError(void *,intBool); 220 LOCALE int GetEvaluationError(void *); 221 LOCALE void SetHaltExecution(void *,int); 222 LOCALE int GetHaltExecution(void *); 223 LOCALE void ReturnValues(void *,struct dataObject *,intBool); 224 LOCALE void PrintDataObject(void *,const char *,struct dataObject *); 225 LOCALE void EnvSetMultifieldErrorValue(void *,struct dataObject *); 226 LOCALE void ValueInstall(void *,struct dataObject *); 227 LOCALE void ValueDeinstall(void *,struct dataObject *); 228 #if DEFFUNCTION_CONSTRUCT || DEFGENERIC_CONSTRUCT 229 LOCALE int EnvFunctionCall(void *,const char *,const char *,DATA_OBJECT *); 230 LOCALE int FunctionCall2(void *,FUNCTION_REFERENCE *,const char *,DATA_OBJECT *); 231 #endif 232 LOCALE void CopyDataObject(void *,DATA_OBJECT *,DATA_OBJECT *,int); 233 LOCALE void AtomInstall(void *,int,void *); 234 LOCALE void AtomDeinstall(void *,int,void *); 235 LOCALE struct expr *ConvertValueToExpression(void *,DATA_OBJECT *); 236 LOCALE unsigned long GetAtomicHashValue(unsigned short,void *,int); 237 LOCALE void InstallPrimitive(void *,struct entityRecord *,int); 238 LOCALE int InstallExternalAddressType(void *,struct externalAddressType *); 239 LOCALE void TransferDataObjectValues(DATA_OBJECT *,DATA_OBJECT *); 240 LOCALE struct expr *FunctionReferenceExpression(void *,const char *); 241 LOCALE intBool GetFunctionReference(void *,const char *,FUNCTION_REFERENCE *); 242 LOCALE intBool DOsEqual(DATA_OBJECT_PTR,DATA_OBJECT_PTR); 243 LOCALE int EvaluateAndStoreInDataObject(void *,int,EXPRESSION *,DATA_OBJECT *,int); 244 245 #if ALLOW_ENVIRONMENT_GLOBALS 246 247 LOCALE void SetMultifieldErrorValue(DATA_OBJECT_PTR); 248 LOCALE int FunctionCall(const char *,const char *,DATA_OBJECT *); 249 250 #endif /* ALLOW_ENVIRONMENT_GLOBALS */ 251 252 #endif /* _H_evaluatn */ 253