📄 factbin.c
字号:
thePattern = thePattern->lastLevel;
if (thePattern == NULL) return;
}
thePattern = thePattern->rightNode;
}
else
{ thePattern = thePattern->nextLevel; }
}
}
/*********************************************************/
/* BsaveStorage: Writes out storage requirements for all */
/* factPatternNode data structures to the binary file */
/*********************************************************/
static void BsaveStorage(
void *theEnv,
FILE *fp)
{
unsigned long space;
space = sizeof(long);
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
GenWrite(&FactBinaryData(theEnv)->NumberOfPatterns,(unsigned long) sizeof(long int),fp);
}
/*****************************************************/
/* BsaveFactPatterns: Writes out all factPatternNode */
/* data structures to the binary file. */
/*****************************************************/
static void BsaveFactPatterns(
void *theEnv,
FILE *fp)
{
unsigned long int space;
struct deftemplate *theDeftemplate;
struct defmodule *theModule;
/*========================================*/
/* Write out the amount of space taken up */
/* by the factPatternNode data structures */
/* in the binary image. */
/*========================================*/
space = FactBinaryData(theEnv)->NumberOfPatterns * sizeof(struct bsaveFactPatternNode);
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
/*===========================*/
/* Loop through each module. */
/*===========================*/
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
/*=====================================================*/
/* Loop through each deftemplate in the current module */
/* and save its fact pattern network to the file. */
/*=====================================================*/
EnvSetCurrentModule(theEnv,(void *) theModule);
for (theDeftemplate = (struct deftemplate *) EnvGetNextDeftemplate(theEnv,NULL);
theDeftemplate != NULL;
theDeftemplate = (struct deftemplate *) EnvGetNextDeftemplate(theEnv,theDeftemplate))
{ BsaveDriver(theEnv,BSAVE_PATTERNS,fp,theDeftemplate->patternNetwork); }
}
/*=============================================================*/
/* If a binary image was already loaded when the bsave command */
/* was issued, then restore the counts indicating the number */
/* of factPatternNode data structures in the binary image */
/* (these were overwritten by the binary save). */
/*=============================================================*/
RestoreBloadCount(theEnv,&FactBinaryData(theEnv)->NumberOfPatterns);
}
/******************************************************/
/* BsavePatternNode: Writes out a single fact pattern */
/* node to the binary image save file. */
/******************************************************/
static void BsavePatternNode(
void *theEnv,
struct factPatternNode *thePattern,
FILE *fp)
{
struct bsaveFactPatternNode tempNode;
AssignBsavePatternHeaderValues(&tempNode.header,&thePattern->header);
tempNode.whichField = thePattern->whichField;
tempNode.leaveFields = thePattern->leaveFields;
tempNode.whichSlot = thePattern->whichSlot;
tempNode.networkTest = HashedExpressionIndex(theEnv,thePattern->networkTest);
tempNode.nextLevel = BsaveFactPatternIndex(thePattern->nextLevel);
tempNode.lastLevel = BsaveFactPatternIndex(thePattern->lastLevel);
tempNode.leftNode = BsaveFactPatternIndex(thePattern->leftNode);
tempNode.rightNode = BsaveFactPatternIndex(thePattern->rightNode);
GenWrite(&tempNode,(unsigned long) sizeof(struct bsaveFactPatternNode),fp);
}
#endif /* BLOAD_AND_BSAVE */
/*****************************************************/
/* BloadStorage: Allocates storage requirements for */
/* the factPatternNodes used by this binary image. */
/*****************************************************/
static void BloadStorage(
void *theEnv)
{
unsigned long space;
/*=========================================*/
/* Determine the number of factPatternNode */
/* data structures to be read. */
/*=========================================*/
GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
GenReadBinary(theEnv,&FactBinaryData(theEnv)->NumberOfPatterns,(unsigned long) sizeof(long int));
/*===================================*/
/* Allocate the space needed for the */
/* factPatternNode data structures. */
/*===================================*/
if (FactBinaryData(theEnv)->NumberOfPatterns == 0)
{
FactBinaryData(theEnv)->FactPatternArray = NULL;
return;
}
space = FactBinaryData(theEnv)->NumberOfPatterns * sizeof(struct factPatternNode);
FactBinaryData(theEnv)->FactPatternArray = (struct factPatternNode *) genlongalloc(theEnv,space);
}
/************************************************************/
/* BloadBinaryItem: Loads and refreshes the factPatternNode */
/* data structures used by this binary image. */
/************************************************************/
static void BloadBinaryItem(
void *theEnv)
{
unsigned long space;
/*======================================================*/
/* Read in the amount of space used by the binary image */
/* (this is used to skip the construct in the event it */
/* is not available in the version being run). */
/*======================================================*/
GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
/*=============================================*/
/* Read in the factPatternNode data structures */
/* and refresh the pointers. */
/*=============================================*/
BloadandRefresh(theEnv,FactBinaryData(theEnv)->NumberOfPatterns,(unsigned) sizeof(struct bsaveFactPatternNode),
UpdateFactPatterns);
}
/*************************************************/
/* UpdateFactPatterns: Bload refresh routine for */
/* the factPatternNode structure. */
/*************************************************/
static void UpdateFactPatterns(
void *theEnv,
void *buf,
long obji)
{
struct bsaveFactPatternNode *bp;
bp = (struct bsaveFactPatternNode *) buf;
UpdatePatternNodeHeader(theEnv,&FactBinaryData(theEnv)->FactPatternArray[obji].header,&bp->header);
FactBinaryData(theEnv)->FactPatternArray[obji].bsaveID = 0L;
FactBinaryData(theEnv)->FactPatternArray[obji].whichField = bp->whichField;
FactBinaryData(theEnv)->FactPatternArray[obji].leaveFields = bp->leaveFields;
FactBinaryData(theEnv)->FactPatternArray[obji].whichSlot = bp->whichSlot;
FactBinaryData(theEnv)->FactPatternArray[obji].networkTest = HashedExpressionPointer(bp->networkTest);
FactBinaryData(theEnv)->FactPatternArray[obji].rightNode = BloadFactPatternPointer(bp->rightNode);
FactBinaryData(theEnv)->FactPatternArray[obji].nextLevel = BloadFactPatternPointer(bp->nextLevel);
FactBinaryData(theEnv)->FactPatternArray[obji].lastLevel = BloadFactPatternPointer(bp->lastLevel);
FactBinaryData(theEnv)->FactPatternArray[obji].leftNode = BloadFactPatternPointer(bp->leftNode);
}
/***************************************************/
/* ClearBload: Fact pattern network clear routine */
/* when a binary load is in effect. */
/***************************************************/
static void ClearBload(
void *theEnv)
{
unsigned long int space;
space = FactBinaryData(theEnv)->NumberOfPatterns * sizeof(struct factPatternNode);
if (space != 0) genlongfree(theEnv,(void *) FactBinaryData(theEnv)->FactPatternArray,space);
FactBinaryData(theEnv)->NumberOfPatterns = 0;
}
#endif /* DEFTEMPLATE_CONSTRUCT && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -