/*************************************************** NAME : BsaveDefaultSlotExpressions DESCRIPTION : Writes expressions for default slot values to binary file INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Slot value expressions written NOTES : None ***************************************************/ static void BsaveDefaultSlotExpressions( struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; EXPRESSION *tmpexp; for (i = 0 ; i < cls->slotCount ; i++) { if (cls->slots[i].defaultValue != NULL) { if (cls->slots[i].dynamicDefault) BsaveExpression((EXPRESSION *) cls->slots[i].defaultValue,(FILE *) buf); else { /* ================================================= Static default values are stotred as data objects and must be converted into expressions ================================================= */ tmpexp = ConvertValueToExpression((DATA_OBJECT *) cls->slots[i].defaultValue); BsaveExpression(tmpexp,(FILE *) buf); ReturnExpression(tmpexp); } } } }
static void BsaveExpressions( FILE *fp) { struct defrule *theDefrule, *theDisjunct; struct defmodule *theModule; /*===========================*/ /* Loop through each module. */ /*===========================*/ for (theModule = (struct defmodule *) GetNextDefmodule(NULL); theModule != NULL; theModule = (struct defmodule *) GetNextDefmodule(theModule)) { /*======================================================*/ /* Set the current module to the module being examined. */ /*======================================================*/ SetCurrentModule((void *) theModule); /*==================================================*/ /* Loop through each defrule in the current module. */ /*==================================================*/ for (theDefrule = (struct defrule *) GetNextDefrule(NULL); theDefrule != NULL; theDefrule = (struct defrule *) GetNextDefrule(theDefrule)) { /*===========================================*/ /* Save the dynamic salience of the defrule. */ /*===========================================*/ #if DYNAMIC_SALIENCE BsaveExpression(theDefrule->dynamicSalience,fp); #endif #if CERTAINTY_FACTORS BsaveExpression(theDefrule->dynamicCF,fp); #endif /*===================================*/ /* Loop through each disjunct of the */ /* defrule and save its RHS actions. */ /*===================================*/ for (theDisjunct = theDefrule; theDisjunct != NULL; theDisjunct = theDisjunct->disjunct) { BsaveExpression(theDisjunct->actions,fp); } } } /*==============================*/ /* Set the marked flag for each */ /* join in the join network. */ /*==============================*/ MarkRuleNetwork(1); }
static void BsaveExpressions( void *theEnv, FILE *fp) { struct defrule *theDefrule, *theDisjunct; struct defmodule *theModule; /*===========================*/ /* Loop through each module. */ /*===========================*/ for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL); theModule != NULL; theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule)) { /*======================================================*/ /* Set the current module to the module being examined. */ /*======================================================*/ EnvSetCurrentModule(theEnv,(void *) theModule); /*==================================================*/ /* Loop through each defrule in the current module. */ /*==================================================*/ for (theDefrule = (struct defrule *) EnvGetNextDefrule(theEnv,NULL); theDefrule != NULL; theDefrule = (struct defrule *) EnvGetNextDefrule(theEnv,theDefrule)) { /*===========================================*/ /* Save the dynamic salience of the defrule. */ /*===========================================*/ BsaveExpression(theEnv,theDefrule->dynamicSalience,fp); /*===================================*/ /* Loop through each disjunct of the */ /* defrule and save its RHS actions. */ /*===================================*/ for (theDisjunct = theDefrule; theDisjunct != NULL; theDisjunct = theDisjunct->disjunct) { BsaveExpression(theEnv,theDisjunct->actions,fp); } } } /*==============================*/ /* Set the marked flag for each */ /* join in the join network. */ /*==============================*/ MarkRuleNetwork(theEnv,1); }
/*************************************************** NAME : BsaveDeffunctionExpression DESCRIPTION : Saves the needed expressions for a deffunction bsave INPUTS : 1) The deffunction 2) Output data file pointer RETURNS : Nothing useful SIDE EFFECTS : Expressions saved NOTES : None ***************************************************/ static void BsaveDeffunctionExpression( void *theEnv, struct constructHeader *theDeffunction, void *userBuffer) { BsaveExpression(theEnv,((DEFFUNCTION *) theDeffunction)->code,(FILE *) userBuffer); }
/*************************************************** NAME : BsaveDefinstancesExpression DESCRIPTION : Saves the needed expressions for a definstances bsave INPUTS : 1) The definstances 2) Output data file pointer RETURNS : Nothing useful SIDE EFFECTS : Expressions saved NOTES : None ***************************************************/ static void BsaveDefinstancesExpression( void *theEnv, struct constructHeader *theDefinstances, void *userBuffer) { BsaveExpression(theEnv,((DEFINSTANCES *) theDefinstances)->mkinstance,(FILE *) userBuffer); }
static void BsaveExpressions( void *theEnv, FILE *fp) { struct deffacts *theDeffacts; struct defmodule *theModule; /*===========================*/ /* Loop through each module. */ /*===========================*/ for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL); theModule != NULL; theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule)) { /*======================================================*/ /* Set the current module to the module being examined. */ /*======================================================*/ EnvSetCurrentModule(theEnv,(void *) theModule); /*==================================================*/ /* Loop through each deffacts in the current module */ /* and save the assertion list expression. */ /*==================================================*/ for (theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,NULL); theDeffacts != NULL; theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,theDeffacts)) { BsaveExpression(theEnv,theDeffacts->assertList,fp); } } }
/*************************************************** NAME : BsaveMethodExpressions DESCRIPTION : Saves the needed expressions for a defgeneric methods bsave INPUTS : 1) The defgeneric 2) Output data file pointer RETURNS : Nothing useful SIDE EFFECTS : Method action expressions saved NOTES : None ***************************************************/ static void BsaveMethodExpressions( struct constructHeader *theDefgeneric, void *userBuffer) { DEFGENERIC *gfunc = (DEFGENERIC *) theDefgeneric; register unsigned i; for (i = 0 ; i < gfunc->mcnt ; i++) BsaveExpression(gfunc->methods[i].actions,(FILE *) userBuffer); }
/*************************************************** NAME : BsaveHandlerActionExpressions DESCRIPTION : Writes expressions for handler actions to binary file INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Handler actions expressions written NOTES : None ***************************************************/ static void BsaveHandlerActionExpressions( struct constructHeader *theDefclass, void *buf) { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; for (i = 0 ; i < cls->handlerCount ; i++) BsaveExpression(cls->handlers[i].actions,(FILE *) buf); }
/*************************************************** NAME : BsaveHashedExpressions DESCRIPTION : Writes out hashed expressions INPUTS : Bsave file stream pointer RETURNS : Nothing useful SIDE EFFECTS : Expressions written NOTES : None ***************************************************/ void BsaveHashedExpressions( Environment *theEnv, FILE *fp) { unsigned i; EXPRESSION_HN *exphash; for (i = 0 ; i < EXPRESSION_HASH_SIZE ; i++) for (exphash = ExpressionData(theEnv)->ExpressionHashTable[i] ; exphash != NULL ; exphash = exphash->next) BsaveExpression(theEnv,exphash->exp,fp); }
/*************************************************** NAME : BsaveMethodExpressions DESCRIPTION : Saves the needed expressions for a defgeneric methods bsave INPUTS : 1) The defgeneric 2) Output data file pointer RETURNS : Nothing useful SIDE EFFECTS : Method action expressions saved NOTES : None ***************************************************/ static void BsaveMethodExpressions( void *theEnv, struct constructHeader *theDefgeneric, void *userBuffer) { DEFGENERIC *gfunc = (DEFGENERIC *) theDefgeneric; long i; for (i = 0 ; i < gfunc->mcnt ; i++) BsaveExpression(theEnv,gfunc->methods[i].actions,(FILE *) userBuffer); }
/*************************************************** NAME : BsaveRestrictionExpressions DESCRIPTION : Saves the needed expressions for a defgeneric method restriction queries bsave INPUTS : 1) The defgeneric 2) Output data file pointer RETURNS : Nothing useful SIDE EFFECTS : Method restriction query expressions saved NOTES : None ***************************************************/ static void BsaveRestrictionExpressions( struct constructHeader *theDefgeneric, void *userBuffer) { DEFGENERIC *gfunc = (DEFGENERIC *) theDefgeneric; register unsigned i,j; DEFMETHOD *meth; for (i = 0 ; i < gfunc->mcnt ; i++) { meth = &gfunc->methods[i]; for (j = 0 ; j < meth->restrictionCount ; j++) BsaveExpression(meth->restrictions[j].query,(FILE *) userBuffer); } }
void BsaveExpression( Environment *theEnv, struct expr *testPtr, FILE *fp) { BSAVE_EXPRESSION newTest; unsigned long newIndex; while (testPtr != NULL) { ExpressionData(theEnv)->ExpressionCount++; /*================*/ /* Copy the type. */ /*================*/ newTest.type = testPtr->type; /*=======================================*/ /* Convert the argList slot to an index. */ /*=======================================*/ if (testPtr->argList == NULL) { newTest.argList = ULONG_MAX; } else { newTest.argList = ExpressionData(theEnv)->ExpressionCount; } /*========================================*/ /* Convert the nextArg slot to an index. */ /*========================================*/ if (testPtr->nextArg == NULL) { newTest.nextArg = ULONG_MAX; } else { newIndex = ExpressionData(theEnv)->ExpressionCount + ExpressionSize(testPtr->argList); newTest.nextArg = newIndex; } /*=========================*/ /* Convert the value slot. */ /*=========================*/ switch(testPtr->type) { case FLOAT_TYPE: newTest.value = testPtr->floatValue->bucket; break; case INTEGER_TYPE: newTest.value = testPtr->integerValue->bucket; break; case FCALL: newTest.value = testPtr->functionValue->bsaveIndex; break; case GCALL: #if DEFGENERIC_CONSTRUCT if (testPtr->value != NULL) newTest.value = testPtr->constructValue->bsaveID; else #endif newTest.value = ULONG_MAX; break; case PCALL: #if DEFFUNCTION_CONSTRUCT if (testPtr->value != NULL) newTest.value = testPtr->constructValue->bsaveID; else #endif newTest.value = ULONG_MAX; break; case DEFTEMPLATE_PTR: #if DEFTEMPLATE_CONSTRUCT if (testPtr->value != NULL) newTest.value = testPtr->constructValue->bsaveID; else #endif newTest.value = ULONG_MAX; break; case DEFCLASS_PTR: #if OBJECT_SYSTEM if (testPtr->value != NULL) newTest.value = testPtr->constructValue->bsaveID; else #endif newTest.value = ULONG_MAX; break; case DEFGLOBAL_PTR: #if DEFGLOBAL_CONSTRUCT if (testPtr->value != NULL) newTest.value = testPtr->constructValue->bsaveID; else #endif newTest.value = ULONG_MAX; break; #if OBJECT_SYSTEM case INSTANCE_NAME_TYPE: #endif case SYMBOL_TYPE: case GBL_VARIABLE: case STRING_TYPE: newTest.value = testPtr->lexemeValue->bucket; break; case FACT_ADDRESS_TYPE: case INSTANCE_ADDRESS_TYPE: case EXTERNAL_ADDRESS_TYPE: newTest.value = ULONG_MAX; break; case VOID_TYPE: break; default: if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type] == NULL) break; if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type]->bitMap) { newTest.value = ((CLIPSBitMap *) testPtr->value)->bucket; } break; } /*===========================*/ /* Write out the expression. */ /*===========================*/ GenWrite(&newTest,sizeof(BSAVE_EXPRESSION),fp); /*==========================*/ /* Write out argument list. */ /*==========================*/ if (testPtr->argList != NULL) { BsaveExpression(theEnv,testPtr->argList,fp); } testPtr = testPtr->nextArg; } }