📄 exprnbin.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.23 01/31/05 */ /* */ /* EXPRESSION BSAVE/BLOAD MODULE */ /*******************************************************//*************************************************************//* Purpose: Implements the binary save/load feature for the *//* expression data structure. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian L. Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _EXPRNBIN_SOURCE_#include "setup.h"#if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE)#include <stdio.h>#define _STDIO_INCLUDED_#include "memalloc.h"#include "dffctdef.h"#include "moduldef.h"#include "constrct.h"#include "extnfunc.h"#include "bload.h"#include "bsave.h"#include "envrnmnt.h"#if DEFRULE_CONSTRUCT#include "network.h"#endif#if DEFGENERIC_CONSTRUCT#include "genrcbin.h"#endif#if DEFFUNCTION_CONSTRUCT#include "dffnxbin.h"#endif#if DEFTEMPLATE_CONSTRUCT#include "tmpltbin.h"#endif#if DEFGLOBAL_CONSTRUCT#include "globlbin.h"#endif#if OBJECT_SYSTEM#include "objbin.h"#include "insfun.h"#include "inscom.h"#endif#include "exprnbin.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/ static void UpdateExpression(void *,void *,long);/***********************************************************//* AllocateExpressions: Determines the amount of space *//* required for loading the binary image of expressions *//* and allocates that amount of space. *//***********************************************************/globle void AllocateExpressions( void *theEnv) { size_t space; GenReadBinary(theEnv,(void *) &ExpressionData(theEnv)->NumberOfExpressions,sizeof(long)); if (ExpressionData(theEnv)->NumberOfExpressions == 0L) ExpressionData(theEnv)->ExpressionArray = NULL; else { space = ExpressionData(theEnv)->NumberOfExpressions * sizeof(struct expr); ExpressionData(theEnv)->ExpressionArray = (struct expr *) genalloc(theEnv,space); } }/**********************************************//* RefreshExpressions: Refreshes the pointers *//* used by the expression binary image. *//**********************************************/globle void RefreshExpressions( void *theEnv) { if (ExpressionData(theEnv)->ExpressionArray == NULL) return; BloadandRefresh(theEnv,ExpressionData(theEnv)->NumberOfExpressions, (unsigned) sizeof(BSAVE_EXPRESSION),UpdateExpression); }/********************************************************* NAME : UpdateExpression DESCRIPTION : Given a bloaded expression buffer, this routine refreshes the pointers in the expression array INPUTS : 1) a bloaded expression buffer 2) the index of the expression to refresh RETURNS : Nothing useful SIDE EFFECTS : Expression updated NOTES : None *********************************************************/static void UpdateExpression( void *theEnv, void *buf, long obji) { BSAVE_EXPRESSION *bexp; long theIndex; bexp = (BSAVE_EXPRESSION *) buf; ExpressionData(theEnv)->ExpressionArray[obji].type = bexp->type; switch(bexp->type) { case FCALL: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) BloadData(theEnv)->FunctionArray[bexp->value]; break; case GCALL:#if DEFGENERIC_CONSTRUCT ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) GenericPointer(bexp->value);#else ExpressionData(theEnv)->ExpressionArray[obji].value = NULL;#endif break; case PCALL:#if DEFFUNCTION_CONSTRUCT ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) DeffunctionPointer(bexp->value);#else ExpressionData(theEnv)->ExpressionArray[obji].value = NULL;#endif break; case DEFTEMPLATE_PTR:#if DEFTEMPLATE_CONSTRUCT ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) DeftemplatePointer(bexp->value);#else ExpressionData(theEnv)->ExpressionArray[obji].value = NULL;#endif break; case DEFCLASS_PTR:#if OBJECT_SYSTEM ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) DefclassPointer(bexp->value);#else ExpressionData(theEnv)->ExpressionArray[obji].value = NULL;#endif break; case DEFGLOBAL_PTR:#if DEFGLOBAL_CONSTRUCT ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) DefglobalPointer(bexp->value);#else ExpressionData(theEnv)->ExpressionArray[obji].value = NULL;#endif break; case INTEGER: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) SymbolData(theEnv)->IntegerArray[bexp->value]; IncrementIntegerCount((INTEGER_HN *) ExpressionData(theEnv)->ExpressionArray[obji].value); break; case FLOAT: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) SymbolData(theEnv)->FloatArray[bexp->value]; IncrementFloatCount((FLOAT_HN *) ExpressionData(theEnv)->ExpressionArray[obji].value); break; case INSTANCE_NAME:#if ! OBJECT_SYSTEM ExpressionData(theEnv)->ExpressionArray[obji].type = SYMBOL;#endif case GBL_VARIABLE: case SYMBOL: case STRING: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) SymbolData(theEnv)->SymbolArray[bexp->value]; IncrementSymbolCount((SYMBOL_HN *) ExpressionData(theEnv)->ExpressionArray[obji].value); break;#if DEFTEMPLATE_CONSTRUCT case FACT_ADDRESS: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) &FactData(theEnv)->DummyFact; EnvIncrementFactCount(theEnv,ExpressionData(theEnv)->ExpressionArray[obji].value); break;#endif#if OBJECT_SYSTEM case INSTANCE_ADDRESS: ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) &InstanceData(theEnv)->DummyInstance; EnvIncrementInstanceCount(theEnv,ExpressionData(theEnv)->ExpressionArray[obji].value); break;#endif case EXTERNAL_ADDRESS: ExpressionData(theEnv)->ExpressionArray[obji].value = NULL; break; case RVOID: break; default: if (EvaluationData(theEnv)->PrimitivesArray[bexp->type] == NULL) break; if (EvaluationData(theEnv)->PrimitivesArray[bexp->type]->bitMap) { ExpressionData(theEnv)->ExpressionArray[obji].value = (void *) SymbolData(theEnv)->BitMapArray[bexp->value]; IncrementBitMapCount((BITMAP_HN *) ExpressionData(theEnv)->ExpressionArray[obji].value); } break; } theIndex = (long int) bexp->nextArg; if (theIndex == -1L) { ExpressionData(theEnv)->ExpressionArray[obji].nextArg = NULL; } else { ExpressionData(theEnv)->ExpressionArray[obji].nextArg = (struct expr *) &ExpressionData(theEnv)->ExpressionArray[theIndex]; } theIndex = (long int) bexp->argList; if (theIndex == -1L) { ExpressionData(theEnv)->ExpressionArray[obji].argList = NULL; } else { ExpressionData(theEnv)->ExpressionArray[obji].argList = (struct expr *) &ExpressionData(theEnv)->ExpressionArray[theIndex]; } }/*********************************************//* ClearBloadedExpressions: Clears the space *//* utilized by an expression binary image. *//*********************************************/globle void ClearBloadedExpressions( void *theEnv) { unsigned long int i; size_t space; /*===============================================*/ /* Update the busy counts of atomic data values. */ /*===============================================*/ for (i = 0; i < (unsigned long) ExpressionData(theEnv)->NumberOfExpressions; i++) { switch (ExpressionData(theEnv)->ExpressionArray[i].type) { case SYMBOL : case STRING : case INSTANCE_NAME : case GBL_VARIABLE : DecrementSymbolCount(theEnv,(SYMBOL_HN *) ExpressionData(theEnv)->ExpressionArray[i].value);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -