📄 factbin.c
字号:
/*********************************************************/static void BsaveStorage( void *theEnv, FILE *fp) { size_t space; space = sizeof(long); GenWrite(&space,sizeof(size_t),fp); GenWrite(&FactBinaryData(theEnv)->NumberOfPatterns,sizeof(long int),fp); }/*****************************************************//* BsaveFactPatterns: Writes out all factPatternNode *//* data structures to the binary file. *//*****************************************************/static void BsaveFactPatterns( void *theEnv, FILE *fp) { size_t 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,sizeof(size_t),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(theEnv,&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) { size_t space; /*=========================================*/ /* Determine the number of factPatternNode */ /* data structures to be read. */ /*=========================================*/ GenReadBinary(theEnv,&space,sizeof(size_t)); GenReadBinary(theEnv,&FactBinaryData(theEnv)->NumberOfPatterns,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 *) genalloc(theEnv,space); }/************************************************************//* BloadBinaryItem: Loads and refreshes the factPatternNode *//* data structures used by this binary image. *//************************************************************/static void BloadBinaryItem( void *theEnv) { size_t space; long i; /*======================================================*/ /* 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,sizeof(size_t)); /*=============================================*/ /* Read in the factPatternNode data structures */ /* and refresh the pointers. */ /*=============================================*/ BloadandRefresh(theEnv,FactBinaryData(theEnv)->NumberOfPatterns,(unsigned) sizeof(struct bsaveFactPatternNode), UpdateFactPatterns); for (i = 0; i < FactBinaryData(theEnv)->NumberOfPatterns; i++) { if ((FactBinaryData(theEnv)->FactPatternArray[i].lastLevel != NULL) && (FactBinaryData(theEnv)->FactPatternArray[i].lastLevel->header.selector)) { AddHashedPatternNode(theEnv,FactBinaryData(theEnv)->FactPatternArray[i].lastLevel, &FactBinaryData(theEnv)->FactPatternArray[i], FactBinaryData(theEnv)->FactPatternArray[i].networkTest->type, FactBinaryData(theEnv)->FactPatternArray[i].networkTest->value); } } }/*************************************************//* 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) { size_t space; long i; for (i = 0; i < FactBinaryData(theEnv)->NumberOfPatterns; i++) { if ((FactBinaryData(theEnv)->FactPatternArray[i].lastLevel != NULL) && (FactBinaryData(theEnv)->FactPatternArray[i].lastLevel->header.selector)) { RemoveHashedPatternNode(theEnv,FactBinaryData(theEnv)->FactPatternArray[i].lastLevel, &FactBinaryData(theEnv)->FactPatternArray[i], FactBinaryData(theEnv)->FactPatternArray[i].networkTest->type, FactBinaryData(theEnv)->FactPatternArray[i].networkTest->value); } } space = FactBinaryData(theEnv)->NumberOfPatterns * sizeof(struct factPatternNode); if (space != 0) genfree(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 + -