📄 objrtbin.c
字号:
(sizeof(BSAVE_OBJECT_PATTERN_NODE) * ObjectReteBinaryData(theEnv)->PatternNodeCount);
GenWrite(&space,(UNLN) sizeof(UNLN),fp);
/* ==========================================
Write out the alpha terminal pattern nodes
========================================== */
alphaPtr = ObjectNetworkTerminalPointer(theEnv);
while (alphaPtr != NULL)
{
AssignBsavePatternHeaderValues(&dummyAlpha.header,&alphaPtr->header);
dummyAlpha.classbmp = (long) alphaPtr->classbmp->bucket;
if (alphaPtr->slotbmp != NULL)
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,(UNLN) 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.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,(UNLN) 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)
{
UNLN space;
long counts[2];
GenReadBinary(theEnv,(void *) &space,(UNLN) sizeof(UNLN));
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 = (UNLN) (ObjectReteBinaryData(theEnv)->AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE));
ObjectReteBinaryData(theEnv)->AlphaArray = (OBJECT_ALPHA_NODE *) genlongalloc(theEnv,space);
}
if (ObjectReteBinaryData(theEnv)->PatternNodeCount == 0L)
ObjectReteBinaryData(theEnv)->PatternArray = NULL;
else
{
space = (UNLN) (ObjectReteBinaryData(theEnv)->PatternNodeCount * sizeof(OBJECT_PATTERN_NODE));
ObjectReteBinaryData(theEnv)->PatternArray = (OBJECT_PATTERN_NODE *) genlongalloc(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)
{
UNLN space;
GenReadBinary(theEnv,(void *) &space,(UNLN) sizeof(UNLN));
if (space == 0L)
return;
/* ================================================
Read in the alpha and intermediate pattern nodes
================================================ */
BloadandRefresh(theEnv,ObjectReteBinaryData(theEnv)->AlphaNodeCount,(unsigned) sizeof(BSAVE_OBJECT_ALPHA_NODE),UpdateAlpha);
BloadandRefresh(theEnv,ObjectReteBinaryData(theEnv)->PatternNodeCount,(unsigned) sizeof(BSAVE_OBJECT_PATTERN_NODE),UpdatePattern);
/* =======================
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->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)
{
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 < 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 = (UNLN) (ObjectReteBinaryData(theEnv)->AlphaNodeCount * sizeof(OBJECT_ALPHA_NODE));
genlongfree(theEnv,(void *) ObjectReteBinaryData(theEnv)->AlphaArray,space);
ObjectReteBinaryData(theEnv)->AlphaArray = NULL;
ObjectReteBinaryData(theEnv)->AlphaNodeCount = 0;
space = (UNLN) (ObjectReteBinaryData(theEnv)->PatternNodeCount * sizeof(OBJECT_PATTERN_NODE));
genlongfree(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 + -