?? objrtbin.c
字號:
dummyAlpha.slotbmp = (long) alphaPtr->slotbmp->bucket; else dummyAlpha.slotbmp = -1L; dummyAlpha.patternNode = BsaveObjectPatternIndex(alphaPtr->patternNode); dummyAlpha.nxtInGroup = BsaveObjectAlphaIndex(alphaPtr->nxtInGroup); dummyAlpha.nxtTerminal = BsaveObjectAlphaIndex(alphaPtr->nxtTerminal); GenWrite(&dummyAlpha,sizeof(BSAVE_OBJECT_ALPHA_NODE),fp); alphaPtr = alphaPtr->nxtTerminal; } /* ======================================== Write out the intermediate pattern nodes ======================================== */ patternPtr = ObjectNetworkPointer(theEnv); while (patternPtr != NULL) { dummyPattern.multifieldNode = patternPtr->multifieldNode; dummyPattern.whichField = patternPtr->whichField; dummyPattern.leaveFields = patternPtr->leaveFields; dummyPattern.endSlot = patternPtr->endSlot; dummyPattern.selector = patternPtr->selector; dummyPattern.slotNameID = patternPtr->slotNameID; dummyPattern.networkTest = HashedExpressionIndex(theEnv,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,sizeof(BSAVE_OBJECT_PATTERN_NODE),fp); if (patternPtr->nextLevel == NULL) { while (patternPtr->rightNode == NULL) { patternPtr = patternPtr->lastLevel; if (patternPtr == NULL) { RestoreBloadCount(theEnv,&ObjectReteBinaryData(theEnv)->AlphaNodeCount); RestoreBloadCount(theEnv,&ObjectReteBinaryData(theEnv)->PatternNodeCount); return; } } patternPtr = patternPtr->rightNode; } else patternPtr = patternPtr->nextLevel; } RestoreBloadCount(theEnv,&ObjectReteBinaryData(theEnv)->AlphaNodeCount); RestoreBloadCount(theEnv,&ObjectReteBinaryData(theEnv)->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( void *theEnv) { size_t space; long counts[2]; GenReadBinary(theEnv,(void *) &space,sizeof(size_t)); GenReadBinary(theEnv,(void *) counts,space); ObjectReteBinaryData(theEnv)->AlphaNodeCount = counts[0]; ObjectReteBinaryData(theEnv)->PatternNodeCount = counts[1]; if (ObjectReteBinaryData(theEnv)->AlphaNodeCount == 0L) ObjectReteBinaryData(theEnv)->AlphaArray = NULL; else { space = (ObjectReteBinaryData(theEnv)->AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE)); ObjectReteBinaryData(theEnv)->AlphaArray = (OBJECT_ALPHA_NODE *) genalloc(theEnv,space); } if (ObjectReteBinaryData(theEnv)->PatternNodeCount == 0L) ObjectReteBinaryData(theEnv)->PatternArray = NULL; else { space = (ObjectReteBinaryData(theEnv)->PatternNodeCount * sizeof(OBJECT_PATTERN_NODE)); ObjectReteBinaryData(theEnv)->PatternArray = (OBJECT_PATTERN_NODE *) genalloc(theEnv,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( void *theEnv) { size_t space; long i; GenReadBinary(theEnv,(void *) &space,sizeof(size_t)); if (space == 0L) return; /* ================================================ Read in the alpha and intermediate pattern nodes ================================================ */ BloadandRefresh(theEnv,ObjectReteBinaryData(theEnv)->AlphaNodeCount,sizeof(BSAVE_OBJECT_ALPHA_NODE),UpdateAlpha); BloadandRefresh(theEnv,ObjectReteBinaryData(theEnv)->PatternNodeCount,sizeof(BSAVE_OBJECT_PATTERN_NODE),UpdatePattern); for (i = 0; i < ObjectReteBinaryData(theEnv)->PatternNodeCount; i++) { if ((ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel != NULL) && (ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel->selector)) { AddHashedPatternNode(theEnv,ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel, &ObjectReteBinaryData(theEnv)->PatternArray[i], ObjectReteBinaryData(theEnv)->PatternArray[i].networkTest->type, ObjectReteBinaryData(theEnv)->PatternArray[i].networkTest->value); } } /* ======================= Set the global pointers ======================= */ SetObjectNetworkTerminalPointer(theEnv,(OBJECT_ALPHA_NODE *) &ObjectReteBinaryData(theEnv)->AlphaArray[0]); SetObjectNetworkPointer(theEnv,(OBJECT_PATTERN_NODE *) &ObjectReteBinaryData(theEnv)->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( void *theEnv, void *buf, long obji) { BSAVE_OBJECT_ALPHA_NODE *bap; OBJECT_ALPHA_NODE *ap; bap = (BSAVE_OBJECT_ALPHA_NODE *) buf; ap = (OBJECT_ALPHA_NODE *) &ObjectReteBinaryData(theEnv)->AlphaArray[obji]; UpdatePatternNodeHeader(theEnv,&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( void *theEnv, void *buf, long obji) { BSAVE_OBJECT_PATTERN_NODE *bop; OBJECT_PATTERN_NODE *op; bop = (BSAVE_OBJECT_PATTERN_NODE *) buf; op = (OBJECT_PATTERN_NODE *) &ObjectReteBinaryData(theEnv)->PatternArray[obji]; op->blocked = FALSE; op->multifieldNode = bop->multifieldNode; op->whichField = bop->whichField; op->leaveFields = bop->leaveFields; op->endSlot = bop->endSlot; op->selector = bop->selector; 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( void *theEnv) { size_t space; register long i; for (i = 0; i < ObjectReteBinaryData(theEnv)->PatternNodeCount; i++) { if ((ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel != NULL) && (ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel->selector)) { RemoveHashedPatternNode(theEnv,ObjectReteBinaryData(theEnv)->PatternArray[i].lastLevel, &ObjectReteBinaryData(theEnv)->PatternArray[i], ObjectReteBinaryData(theEnv)->PatternArray[i].networkTest->type, ObjectReteBinaryData(theEnv)->PatternArray[i].networkTest->value); } } /* ================================================ All instances have been deleted by this point so we don't need to worry about clearing partial matches ================================================ */ for (i = 0L ; i < ObjectReteBinaryData(theEnv)->AlphaNodeCount ; i++) { DecrementBitMapCount(theEnv,ObjectReteBinaryData(theEnv)->AlphaArray[i].classbmp); if (ObjectReteBinaryData(theEnv)->AlphaArray[i].slotbmp != NULL) DecrementBitMapCount(theEnv,ObjectReteBinaryData(theEnv)->AlphaArray[i].slotbmp); } if (ObjectReteBinaryData(theEnv)->AlphaNodeCount != 0L) { space = (ObjectReteBinaryData(theEnv)->AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE)); genfree(theEnv,(void *) ObjectReteBinaryData(theEnv)->AlphaArray,space); ObjectReteBinaryData(theEnv)->AlphaArray = NULL; ObjectReteBinaryData(theEnv)->AlphaNodeCount = 0; space = (ObjectReteBinaryData(theEnv)->PatternNodeCount * sizeof(OBJECT_PATTERN_NODE)); genfree(theEnv,(void *) ObjectReteBinaryData(theEnv)->PatternArray,space); ObjectReteBinaryData(theEnv)->PatternArray = NULL; ObjectReteBinaryData(theEnv)->PatternNodeCount = 0; } SetObjectNetworkTerminalPointer(theEnv,NULL); SetObjectNetworkPointer(theEnv,NULL);#if BLOAD_ONLY ResetObjectMatchTimeTags(theEnv);#endif }#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -