📄 rulebin.c
字号:
static void BsaveStorage(
void *theEnv,
FILE *fp)
{
unsigned long space;
space = sizeof(long) * 3;
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
GenWrite(&DefruleBinaryData(theEnv)->NumberOfDefruleModules,(unsigned long) sizeof(long int),fp);
GenWrite(&DefruleBinaryData(theEnv)->NumberOfDefrules,(unsigned long) sizeof(long int),fp);
GenWrite(&DefruleBinaryData(theEnv)->NumberOfJoins,(unsigned long) sizeof(long int),fp);
}
/*******************************************/
/* BsaveBinaryItem: Writes out all defrule */
/* structures to the binary file. */
/*******************************************/
static void BsaveBinaryItem(
void *theEnv,
FILE *fp)
{
unsigned long int space;
struct defrule *theDefrule;
struct defmodule *theModule;
struct defruleModule *theModuleItem;
struct bsaveDefruleModule tempDefruleModule;
/*===============================================*/
/* Write out the space required by the defrules. */
/*===============================================*/
space = (DefruleBinaryData(theEnv)->NumberOfDefrules * sizeof(struct bsaveDefrule)) +
(DefruleBinaryData(theEnv)->NumberOfJoins * sizeof(struct bsaveJoinNode)) +
(DefruleBinaryData(theEnv)->NumberOfDefruleModules * sizeof(struct bsaveDefruleModule));
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
/*===============================================*/
/* Write out each defrule module data structure. */
/*===============================================*/
DefruleBinaryData(theEnv)->NumberOfDefrules = 0;
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
EnvSetCurrentModule(theEnv,(void *) theModule);
theModuleItem = (struct defruleModule *)
GetModuleItem(theEnv,NULL,FindModuleItem(theEnv,"defrule")->moduleIndex);
AssignBsaveDefmdlItemHdrVals(&tempDefruleModule.header,
&theModuleItem->header);
GenWrite(&tempDefruleModule,(unsigned long) sizeof(struct bsaveDefruleModule),fp);
}
/*========================================*/
/* Write out each defrule data structure. */
/*========================================*/
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
EnvSetCurrentModule(theEnv,(void *) theModule);
for (theDefrule = (struct defrule *) EnvGetNextDefrule(theEnv,NULL);
theDefrule != NULL;
theDefrule = (struct defrule *) EnvGetNextDefrule(theEnv,theDefrule))
{ BsaveDisjuncts(theEnv,fp,theDefrule); }
}
/*=============================*/
/* Write out the Rete Network. */
/*=============================*/
MarkRuleNetwork(theEnv,1);
BsaveJoins(theEnv,fp);
/*=============================================================*/
/* If a binary image was already loaded when the bsave command */
/* was issued, then restore the counts indicating the number */
/* of defrules, defrule modules, and joins in the binary image */
/* (these were overwritten by the binary save). */
/*=============================================================*/
RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefruleModules);
RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfDefrules);
RestoreBloadCount(theEnv,&DefruleBinaryData(theEnv)->NumberOfJoins);
}
/************************************************************/
/* BsaveDisjuncts: Writes out all the disjunct defrule data */
/* structures for a specific rule to the binary file. */
/************************************************************/
static void BsaveDisjuncts(
void *theEnv,
FILE *fp,
struct defrule *theDefrule)
{
struct defrule *theDisjunct;
struct bsaveDefrule tempDefrule;
long int disjunctExpressionCount = 0L;
int first;
/*=========================================*/
/* Loop through each disjunct of the rule. */
/*=========================================*/
for (theDisjunct = theDefrule, first = TRUE;
theDisjunct != NULL;
theDisjunct = theDisjunct->disjunct, first = FALSE)
{
DefruleBinaryData(theEnv)->NumberOfDefrules++;
/*======================================*/
/* Set header and miscellaneous values. */
/*======================================*/
AssignBsaveConstructHeaderVals(&tempDefrule.header,
&theDisjunct->header);
tempDefrule.salience = theDisjunct->salience;
tempDefrule.localVarCnt = theDisjunct->localVarCnt;
tempDefrule.complexity = theDisjunct->complexity;
tempDefrule.autoFocus = theDisjunct->autoFocus;
/*=======================================*/
/* Set dynamic salience data structures. */
/*=======================================*/
if (theDisjunct->dynamicSalience != NULL)
{
if (first)
{
tempDefrule.dynamicSalience = ExpressionData(theEnv)->ExpressionCount;
disjunctExpressionCount = ExpressionData(theEnv)->ExpressionCount;
ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDisjunct->dynamicSalience);
}
else
{ tempDefrule.dynamicSalience = disjunctExpressionCount; }
}
else
{ tempDefrule.dynamicSalience = -1L; }
/*==============================================*/
/* Set the index to the disjunct's RHS actions. */
/*==============================================*/
if (theDisjunct->actions != NULL)
{
tempDefrule.actions = ExpressionData(theEnv)->ExpressionCount;
ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDisjunct->actions);
}
else
{ tempDefrule.actions = -1L; }
/*=================================*/
/* Set the index to the disjunct's */
/* logical join and last join. */
/*=================================*/
tempDefrule.logicalJoin = BsaveJoinIndex(theDisjunct->logicalJoin);
tempDefrule.lastJoin = BsaveJoinIndex(theDisjunct->lastJoin);
/*=====================================*/
/* Set the index to the next disjunct. */
/*=====================================*/
if (theDisjunct->disjunct != NULL)
{ tempDefrule.disjunct = DefruleBinaryData(theEnv)->NumberOfDefrules; }
else
{ tempDefrule.disjunct = -1L; }
/*=================================*/
/* Write the disjunct to the file. */
/*=================================*/
GenWrite(&tempDefrule,(unsigned long) sizeof(struct bsaveDefrule),fp);
}
}
/********************************************/
/* BsaveJoins: Writes out all the join node */
/* data structures to the binary file. */
/********************************************/
static void BsaveJoins(
void *theEnv,
FILE *fp)
{
struct defrule *rulePtr;
struct joinNode *joinPtr;
struct defmodule *theModule;
/*===========================*/
/* Loop through each module. */
/*===========================*/
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
EnvSetCurrentModule(theEnv,(void *) theModule);
/*===========================================*/
/* Loop through each rule and its disjuncts. */
/*===========================================*/
rulePtr = (struct defrule *) EnvGetNextDefrule(theEnv,NULL);
while (rulePtr != NULL)
{
/*=========================================*/
/* Loop through each join of the disjunct. */
/*=========================================*/
for (joinPtr = rulePtr->lastJoin;
joinPtr != NULL;
joinPtr = GetPreviousJoin(joinPtr))
{ if (joinPtr->marked) BsaveJoin(theEnv,fp,joinPtr); }
/*=======================================*/
/* Move on to the next rule or disjunct. */
/*=======================================*/
if (rulePtr->disjunct != NULL) rulePtr = rulePtr->disjunct;
else rulePtr = (struct defrule *) EnvGetNextDefrule(theEnv,rulePtr);
}
}
}
/********************************************/
/* BsaveJoin: Writes out a single join node */
/* data structure to the binary file. */
/********************************************/
static void BsaveJoin(
void *theEnv,
FILE *fp,
struct joinNode *joinPtr)
{
struct bsaveJoinNode tempJoin;
joinPtr->marked = 0;
tempJoin.depth = joinPtr->depth;
tempJoin.rhsType = joinPtr->rhsType;
tempJoin.firstJoin = joinPtr->firstJoin;
tempJoin.logicalJoin = joinPtr->logicalJoin;
tempJoin.joinFromTheRight = joinPtr->joinFromTheRight;
tempJoin.patternIsNegated = joinPtr->patternIsNegated;
if (joinPtr->joinFromTheRight)
{ tempJoin.rightSideEntryStructure = BsaveJoinIndex(joinPtr->rightSideEntryStructure); }
else
{ tempJoin.rightSideEntryStructure = -1L; }
tempJoin.lastLevel = BsaveJoinIndex(joinPtr->lastLevel);
tempJoin.nextLevel = BsaveJoinIndex(joinPtr->nextLevel);
tempJoin.rightMatchNode = BsaveJoinIndex(joinPtr->rightMatchNode);
tempJoin.rightDriveNode = BsaveJoinIndex(joinPtr->rightDriveNode);
tempJoin.networkTest = HashedExpressionIndex(theEnv,joinPtr->networkTest);
if (joinPtr->ruleToActivate != NULL)
{
tempJoin.ruleToActivate =
GetDisjunctIndex(joinPtr->ruleToActivate);
}
else
{ tempJoin.ruleToActivate = -1L; }
GenWrite(&tempJoin,(unsigned long) sizeof(struct bsaveJoinNode),fp);
}
/***********************************************************/
/* AssignBsavePatternHeaderValues: Assigns the appropriate */
/* values to a bsave pattern header record. */
/***********************************************************/
globle void AssignBsavePatternHeaderValues(
struct bsavePatternNodeHeader *theBsaveHeader,
struct patternNodeHeader *theHeader)
{
theBsaveHeader->multifieldNode = theHeader->multifieldNode;
theBsaveHeader->entryJoin = BsaveJoinIndex(theHeader->entryJoin);
theBsaveHeader->singlefieldNode = theHeader->singlefieldNode;
theBsaveHeader->stopNode = theHeader->stopNode;
theBsaveHeader->beginSlot = theHeader->beginSlot;
theBsaveHeader->endSlot = theHeader->endSlot;
}
#endif /* BLOAD_AND_BSAVE */
/************************************************/
/* BloadStorage: Loads storage requirements for */
/* the defrules used by this binary image. */
/************************************************/
static void BloadStorage(
void *theEnv)
{
unsigned long space;
/*=================================================*/
/* Determine the number of defrule, defruleModule, */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -