00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _H_evaluatn
00026
00027 #define _H_evaluatn
00028
00029 struct entityRecord;
00030 struct dataObject;
00031
00032 #ifndef _H_constant
00033 #include "constant.h"
00034 #endif
00035 #ifndef _H_symbol
00036 #include "symbol.h"
00037 #endif
00038 #ifndef _H_expressn
00039 #include "expressn.h"
00040 #endif
00041
00042 struct dataObject
00043 {
00044 void *supplementalInfo;
00045 unsigned short type;
00046 void *value;
00047 long begin;
00048 long end;
00049 struct dataObject *next;
00050 };
00051
00052 typedef struct dataObject DATA_OBJECT;
00053 typedef struct dataObject * DATA_OBJECT_PTR;
00054
00055 typedef struct expr FUNCTION_REFERENCE;
00056
00057 #define DATA_OBJECT_PTR_ARG DATA_OBJECT_PTR
00058
00059 #include "userdata.h"
00060
00061 struct entityRecord
00062 {
00063 char *name;
00064 unsigned int type : 13;
00065 unsigned int copyToEvaluate : 1;
00066 unsigned int bitMap : 1;
00067 unsigned int addsToRuleComplexity : 1;
00068 void (*shortPrintFunction)(void *,char *,void *);
00069 void (*longPrintFunction)(void *,char *,void *);
00070 intBool (*deleteFunction)(void *,void *);
00071 intBool (*evaluateFunction)(void *,void *,DATA_OBJECT *);
00072 void *(*getNextFunction)(void *,void *);
00073 void (*decrementBusyCount)(void *,void *);
00074 void (*incrementBusyCount)(void *,void *);
00075 void (*propagateDepth)(void *,void *);
00076 void (*markNeeded)(void *,void *);
00077 void (*install)(void *,void *);
00078 void (*deinstall)(void *,void *);
00079 struct userData *usrData;
00080 };
00081
00082 struct externalAddressType
00083 {
00084 char *name;
00085 void (*shortPrintFunction)(void *,char *,void *);
00086 void (*longPrintFunction)(void *,char *,void *);
00087 intBool (*discardFunction)(void *,void *);
00088 void (*newFunction)(void *,DATA_OBJECT *);
00089 intBool (*callFunction)(void *,DATA_OBJECT *,DATA_OBJECT *);
00090 };
00091
00092 typedef struct entityRecord ENTITY_RECORD;
00093 typedef struct entityRecord * ENTITY_RECORD_PTR;
00094
00095 #define GetDOLength(target) (((target).end - (target).begin) + 1)
00096 #define GetpDOLength(target) (((target)->end - (target)->begin) + 1)
00097 #define GetDOBegin(target) ((target).begin + 1)
00098 #define GetDOEnd(target) ((target).end + 1)
00099 #define GetpDOBegin(target) ((target)->begin + 1)
00100 #define GetpDOEnd(target) ((target)->end + 1)
00101 #define SetDOBegin(target,val) ((target).begin = (long) ((val) - 1))
00102 #define SetDOEnd(target,val) ((target).end = (long) ((val) - 1))
00103 #define SetpDOBegin(target,val) ((target)->begin = (long) ((val) - 1))
00104 #define SetpDOEnd(target,val) ((target)->end = (long) ((val) - 1))
00105
00106 #define EnvGetDOLength(theEnv,target) (((target).end - (target).begin) + 1)
00107 #define EnvGetpDOLength(theEnv,target) (((target)->end - (target)->begin) + 1)
00108 #define EnvGetDOBegin(theEnv,target) ((target).begin + 1)
00109 #define EnvGetDOEnd(theEnv,target) ((target).end + 1)
00110 #define EnvGetpDOBegin(theEnv,target) ((target)->begin + 1)
00111 #define EnvGetpDOEnd(theEnv,target) ((target)->end + 1)
00112 #define EnvSetDOBegin(theEnv,target,val) ((target).begin = (long) ((val) - 1))
00113 #define EnvSetDOEnd(theEnv,target,val) ((target).end = (long) ((val) - 1))
00114 #define EnvSetpDOBegin(theEnv,target,val) ((target)->begin = (long) ((val) - 1))
00115 #define EnvSetpDOEnd(theEnv,target,val) ((target)->end = (long) ((val) - 1))
00116
00117 #define DOPToString(target) (((struct symbolHashNode *) ((target)->value))->contents)
00118 #define DOPToDouble(target) (((struct floatHashNode *) ((target)->value))->contents)
00119 #define DOPToFloat(target) ((float) (((struct floatHashNode *) ((target)->value))->contents))
00120 #define DOPToLong(target) (((struct integerHashNode *) ((target)->value))->contents)
00121 #define DOPToInteger(target) ((int) (((struct integerHashNode *) ((target)->value))->contents))
00122 #define DOPToPointer(target) ((target)->value)
00123 #define DOPToExternalAddress(target) (((struct externalAddressHashNode *) ((target)->value))->externalAddress)
00124
00125 #define EnvDOPToString(theEnv,target) (((struct symbolHashNode *) ((target)->value))->contents)
00126 #define EnvDOPToDouble(theEnv,target) (((struct floatHashNode *) ((target)->value))->contents)
00127 #define EnvDOPToFloat(theEnv,target) ((float) (((struct floatHashNode *) ((target)->value))->contents))
00128 #define EnvDOPToLong(theEnv,target) (((struct integerHashNode *) ((target)->value))->contents)
00129 #define EnvDOPToInteger(theEnv,target) ((int) (((struct integerHashNode *) ((target)->value))->contents))
00130 #define EnvDOPToPointer(theEnv,target) ((target)->value)
00131 #define EnvDOPToExternalAddress(target) (((struct externalAddressHashNode *) ((target)->value))->externalAddress)
00132
00133 #define DOToString(target) (((struct symbolHashNode *) ((target).value))->contents)
00134 #define DOToDouble(target) (((struct floatHashNode *) ((target).value))->contents)
00135 #define DOToFloat(target) ((float) (((struct floatHashNode *) ((target).value))->contents))
00136 #define DOToLong(target) (((struct integerHashNode *) ((target).value))->contents)
00137 #define DOToInteger(target) ((int) (((struct integerHashNode *) ((target).value))->contents))
00138 #define DOToPointer(target) ((target).value)
00139 #define DOToExternalAddress(target) (((struct externalAddressHashNode *) ((target).value))->externalAddress))
00140
00141 #define EnvDOToString(theEnv,target) (((struct symbolHashNode *) ((target).value))->contents)
00142 #define EnvDOToDouble(theEnv,target) (((struct floatHashNode *) ((target).value))->contents)
00143 #define EnvDOToFloat(theEnv,target) ((float) (((struct floatHashNode *) ((target).value))->contents))
00144 #define EnvDOToLong(theEnv,target) (((struct integerHashNode *) ((target).value))->contents)
00145 #define EnvDOToInteger(theEnv,target) ((int) (((struct integerHashNode *) ((target).value))->contents))
00146 #define EnvDOToPointer(theEnv,target) ((target).value)
00147 #define EnvDOToExternalAddress(target) (((struct externalAddressHashNode *) ((target).value))->externalAddress))
00148
00149 #define CoerceToLongInteger(t,v) ((t == INTEGER) ? ValueToLong(v) : (long int) ValueToDouble(v))
00150 #define CoerceToInteger(t,v) ((t == INTEGER) ? (int) ValueToLong(v) : (int) ValueToDouble(v))
00151 #define CoerceToDouble(t,v) ((t == INTEGER) ? (double) ValueToLong(v) : ValueToDouble(v))
00152
00153 #define GetFirstArgument() (EvaluationData(theEnv)->CurrentExpression->argList)
00154 #define GetNextArgument(ep) (ep->nextArg)
00155
00156 #define MAXIMUM_PRIMITIVES 150
00157 #define MAXIMUM_EXTERNAL_ADDRESS_TYPES 10
00158
00159 #define BITS_PER_BYTE 8
00160
00161 #define BitwiseTest(n,b) ((n) & (char) (1 << (b)))
00162 #define BitwiseSet(n,b) (n |= (char) (1 << (b)))
00163 #define BitwiseClear(n,b) (n &= (char) ~(1 << (b)))
00164
00165 #define TestBitMap(map,id) BitwiseTest(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE)
00166 #define SetBitMap(map,id) BitwiseSet(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE)
00167 #define ClearBitMap(map,id) BitwiseClear(map[(id) / BITS_PER_BYTE],(id) % BITS_PER_BYTE)
00168
00169 #define EVALUATION_DATA 44
00170
00171 struct evaluationData
00172 {
00173 struct expr *CurrentExpression;
00174 int EvaluationError;
00175 int HaltExecution;
00176 int CurrentEvaluationDepth;
00177 int numberOfAddressTypes;
00178 struct entityRecord *PrimitivesArray[MAXIMUM_PRIMITIVES];
00179 struct externalAddressType *ExternalAddressTypes[MAXIMUM_EXTERNAL_ADDRESS_TYPES];
00180 };
00181
00182 #define EvaluationData(theEnv) ((struct evaluationData *) GetEnvironmentData(theEnv,EVALUATION_DATA))
00183
00184 #ifdef LOCALE
00185 #undef LOCALE
00186 #endif
00187
00188 #ifdef _EVALUATN_SOURCE_
00189 #define LOCALE
00190 #else
00191 #define LOCALE extern
00192 #endif
00193
00194 #define SetMultifieldErrorValue(a) EnvSetMultifieldErrorValue(GetCurrentEnvironment(),a)
00195 #define FunctionCall(a,b,c) EnvFunctionCall(GetCurrentEnvironment(),a,b,c)
00196
00197 LOCALE void InitializeEvaluationData(void *);
00198 LOCALE int EvaluateExpression(void *,struct expr *,struct dataObject *);
00199 LOCALE void SetEvaluationError(void *,intBool);
00200 LOCALE int GetEvaluationError(void *);
00201 LOCALE void SetHaltExecution(void *,int);
00202 LOCALE int GetHaltExecution(void *);
00203 LOCALE void ReturnValues(void *,struct dataObject *,intBool);
00204 LOCALE void PrintDataObject(void *,char *,struct dataObject *);
00205 LOCALE void EnvSetMultifieldErrorValue(void *,struct dataObject *);
00206 LOCALE void ValueInstall(void *,struct dataObject *);
00207 LOCALE void ValueDeinstall(void *,struct dataObject *);
00208 LOCALE void PropagateReturnValue(void *,struct dataObject *);
00209 #if DEFFUNCTION_CONSTRUCT || DEFGENERIC_CONSTRUCT
00210 LOCALE int EnvFunctionCall(void *,char *,char *,DATA_OBJECT *);
00211 LOCALE int FunctionCall2(void *,FUNCTION_REFERENCE *,char *,DATA_OBJECT *);
00212 #endif
00213 LOCALE void CopyDataObject(void *,DATA_OBJECT *,DATA_OBJECT *,int);
00214 LOCALE void AtomInstall(void *,int,void *);
00215 LOCALE void AtomDeinstall(void *,int,void *);
00216 LOCALE struct expr *ConvertValueToExpression(void *,DATA_OBJECT *);
00217 LOCALE unsigned long GetAtomicHashValue(unsigned short,void *,int);
00218 LOCALE void InstallPrimitive(void *,struct entityRecord *,int);
00219 LOCALE int InstallExternalAddressType(void *,struct externalAddressType *);
00220 LOCALE void TransferDataObjectValues(DATA_OBJECT *,DATA_OBJECT *);
00221 LOCALE struct expr *FunctionReferenceExpression(void *,char *);
00222 LOCALE intBool GetFunctionReference(void *,char *,FUNCTION_REFERENCE *);
00223 LOCALE intBool DOsEqual(DATA_OBJECT_PTR,DATA_OBJECT_PTR);
00224 LOCALE int EvaluateAndStoreInDataObject(void *,int,EXPRESSION *,DATA_OBJECT *,int);
00225
00226 #endif
00227
00228
00229
00230
00231
00232