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