📄 objrtbin.c
字号:
space = (sizeof(BSAVE_OBJECT_ALPHA_NODE) * AlphaNodeCount) + (sizeof(BSAVE_OBJECT_PATTERN_NODE) * PatternNodeCount); GenWrite(&space,(UNLN) sizeof(UNLN),fp); /* ========================================== Write out the alpha terminal pattern nodes ========================================== */ alphaPtr = ObjectNetworkTerminalPointer(); while (alphaPtr != NULL) { AssignBsavePatternHeaderValues(&dummyAlpha.header,&alphaPtr->header); dummyAlpha.classbmp = alphaPtr->classbmp->bucket; if (alphaPtr->slotbmp != NULL) dummyAlpha.slotbmp = alphaPtr->slotbmp->bucket; else dummyAlpha.slotbmp = -1L; dummyAlpha.patternNode = BsaveObjectPatternIndex(alphaPtr->patternNode); dummyAlpha.nxtInGroup = BsaveObjectAlphaIndex(alphaPtr->nxtInGroup); dummyAlpha.nxtTerminal = BsaveObjectAlphaIndex(alphaPtr->nxtTerminal); GenWrite(&dummyAlpha,(UNLN) sizeof(BSAVE_OBJECT_ALPHA_NODE),fp); alphaPtr = alphaPtr->nxtTerminal; } /* ======================================== Write out the intermediate pattern nodes ======================================== */ patternPtr = ObjectNetworkPointer(); while (patternPtr != NULL) { dummyPattern.multifieldNode = patternPtr->multifieldNode; dummyPattern.whichField = patternPtr->whichField; dummyPattern.leaveFields = patternPtr->leaveFields; dummyPattern.endSlot = patternPtr->endSlot; dummyPattern.slotNameID = patternPtr->slotNameID; dummyPattern.networkTest = HashedExpressionIndex(patternPtr->networkTest); dummyPattern.nextLevel = BsaveObjectPatternIndex(patternPtr->nextLevel); dummyPattern.lastLevel = BsaveObjectPatternIndex(patternPtr->lastLevel); dummyPattern.leftNode = BsaveObjectPatternIndex(patternPtr->leftNode); dummyPattern.rightNode = BsaveObjectPatternIndex(patternPtr->rightNode); dummyPattern.alphaNode = BsaveObjectAlphaIndex(patternPtr->alphaNode); GenWrite(&dummyPattern,(UNLN) sizeof(BSAVE_OBJECT_PATTERN_NODE),fp); if (patternPtr->nextLevel == NULL) { while (patternPtr->rightNode == NULL) { patternPtr = patternPtr->lastLevel; if (patternPtr == NULL) return; } patternPtr = patternPtr->rightNode; } else patternPtr = patternPtr->nextLevel; } if (Bloaded()) { RestoreBloadCount(&AlphaNodeCount); RestoreBloadCount(&PatternNodeCount); } }#endif/*************************************************** NAME : BloadStorageObjectPatterns DESCRIPTION : Reads in the storage requirements for the object patterns in this bload image INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Counts read and arrays allocated NOTES : None ***************************************************/static VOID BloadStorageObjectPatterns() { UNLN space; long counts[2]; GenRead((VOID *) &space,(UNLN) sizeof(UNLN)); GenRead((VOID *) counts,space); AlphaNodeCount = counts[0]; PatternNodeCount = counts[1]; if (AlphaNodeCount == 0L) AlphaArray = NULL; else { space = (UNLN) (AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE)); AlphaArray = (OBJECT_ALPHA_NODE HUGE_ADDR *) genlongalloc(space); } if (PatternNodeCount == 0L) PatternArray = NULL; else { space = (UNLN) (PatternNodeCount * sizeof(OBJECT_PATTERN_NODE)); PatternArray = (OBJECT_PATTERN_NODE HUGE_ADDR *) genlongalloc(space); } }/**************************************************** NAME : BloadObjectPatterns DESCRIPTION : Reads in all object pattern data structures from binary image and updates pointers INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Binary data structures updated NOTES : Assumes storage allocated previously ****************************************************/static VOID BloadObjectPatterns() { UNLN space; GenRead((VOID *) &space,(UNLN) sizeof(UNLN)); if (space == 0L) return; /* ================================================ Read in the alpha and intermediate pattern nodes ================================================ */ BloadandRefresh(AlphaNodeCount,(unsigned) sizeof(BSAVE_OBJECT_ALPHA_NODE),UpdateAlpha); BloadandRefresh(PatternNodeCount,(unsigned) sizeof(BSAVE_OBJECT_PATTERN_NODE),UpdatePattern); /* ======================= Set the global pointers ======================= */ SetObjectNetworkTerminalPointer((OBJECT_ALPHA_NODE *) &AlphaArray[0]); SetObjectNetworkPointer((OBJECT_PATTERN_NODE *) &PatternArray[0]); }/*************************************************** NAME : UpdateAlpha DESCRIPTION : Updates all the pointers for an alpha node based on the binary image indices INPUTS : 1) A pointer to the binary image alpha node buffer 2) The index of the actual alpha node in the array RETURNS : Nothing useful SIDE EFFECTS : Alpha node updated NOTES : None ***************************************************/static VOID UpdateAlpha(buf,obji) VOID *buf; long obji; { BSAVE_OBJECT_ALPHA_NODE *bap; OBJECT_ALPHA_NODE *ap; bap = (BSAVE_OBJECT_ALPHA_NODE *) buf; ap = (OBJECT_ALPHA_NODE *) &AlphaArray[obji]; UpdatePatternNodeHeader(&ap->header,&bap->header); ap->matchTimeTag = 0L; ap->classbmp = BitMapPointer(bap->classbmp); if (bap->slotbmp != -1L) { ap->slotbmp = BitMapPointer(bap->slotbmp); IncrementBitMapCount(ap->slotbmp); } else ap->slotbmp = NULL; IncrementBitMapCount(ap->classbmp); ap->patternNode = ObjectPatternPointer(bap->patternNode); ap->nxtInGroup = ObjectAlphaPointer(bap->nxtInGroup); ap->nxtTerminal = ObjectAlphaPointer(bap->nxtTerminal); ap->bsaveID = 0L; } /*************************************************** NAME : UpdatePattern DESCRIPTION : Updates all the pointers for a pattern node based on the binary image indices INPUTS : 1) A pointer to the binary image pattern node buffer 2) The index of the actual pattern node in the array RETURNS : Nothing useful SIDE EFFECTS : Pattern node updated NOTES : None ***************************************************/static VOID UpdatePattern(buf,obji) VOID *buf; long obji; { BSAVE_OBJECT_PATTERN_NODE *bop; OBJECT_PATTERN_NODE *op; bop = (BSAVE_OBJECT_PATTERN_NODE *) buf; op = (OBJECT_PATTERN_NODE *) &PatternArray[obji]; op->blocked = CLIPS_FALSE; op->multifieldNode = bop->multifieldNode; op->whichField = bop->whichField; op->leaveFields = bop->leaveFields; op->endSlot = bop->endSlot; op->matchTimeTag = 0L; op->slotNameID = bop->slotNameID; op->networkTest = HashedExpressionPointer(bop->networkTest); op->nextLevel = ObjectPatternPointer(bop->nextLevel); op->lastLevel = ObjectPatternPointer(bop->lastLevel); op->leftNode = ObjectPatternPointer(bop->leftNode); op->rightNode = ObjectPatternPointer(bop->rightNode); op->alphaNode = ObjectAlphaPointer(bop->alphaNode); op->bsaveID = 0L; } /*************************************************** NAME : ClearBloadObjectPatterns DESCRIPTION : Releases all emmory associated with binary image object patterns INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Memory released and global network pointers set to NULL NOTES : None ***************************************************/static VOID ClearBloadObjectPatterns() { UNLN space; register long i; /* ================================================ All instances have been deleted by this point so we don't need to worry about clearing partial matches ================================================ */ for (i = 0L ; i < AlphaNodeCount ; i++) { DecrementBitMapCount(AlphaArray[i].classbmp); if (AlphaArray[i].slotbmp != NULL) DecrementBitMapCount(AlphaArray[i].slotbmp); } if (AlphaNodeCount != 0L) { space = (UNLN) (AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE)); genlongfree((VOID *) AlphaArray,space); AlphaArray = NULL; space = (UNLN) (PatternNodeCount * sizeof(OBJECT_PATTERN_NODE)); genlongfree((VOID *) PatternArray,space); PatternArray = NULL; } SetObjectNetworkTerminalPointer(NULL); SetObjectNetworkPointer(NULL);#if BLOAD_ONLY ResetObjectMatchTimeTags();#endif }#endif/*************************************************** NAME : DESCRIPTION : INPUTS : RETURNS : SIDE EFFECTS : NOTES : ***************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -