📄 factrete.c
字号:
#pragma argsused
#endif
globle intBool FactPNConstant2(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(returnValue)
#endif
struct factConstantPN2Call *hack;
struct field *fieldPtr;
struct expr *theConstant;
struct multifield *segmentPtr;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factConstantPN2Call *) ValueToBitMap(theValue);
/*==========================================================*/
/* Extract the value from the specified slot. Note that the */
/* test to determine the slot's type (multifield) should be */
/* unnecessary since this routine should only be used for */
/* multifield slots. */
/*==========================================================*/
fieldPtr = &FactData(theEnv)->CurrentPatternFact->theProposition.theFields[hack->whichSlot];
if (fieldPtr->type == MULTIFIELD)
{
segmentPtr = (struct multifield *) fieldPtr->value;
if (hack->fromBeginning)
{ fieldPtr = &segmentPtr->theFields[hack->offset]; }
else
{
fieldPtr = &segmentPtr->theFields[segmentPtr->multifieldLength -
(hack->offset + 1)];
}
}
/*====================================*/
/* Compare the value to the constant. */
/*====================================*/
theConstant = GetFirstArgument();
if (theConstant->type != fieldPtr->type) return(1 - hack->testForEquality);
if (theConstant->value != fieldPtr->value) return(1 - hack->testForEquality);
return(hack->testForEquality);
}
/**************************************************************/
/* FactJNGetVar1: Fact join network function for extracting a */
/* variable's value. This is the most generalized routine. */
/**************************************************************/
globle intBool FactJNGetVar1(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
unsigned short theField, theSlot;
struct fact *factPtr;
struct field *fieldPtr;
struct multifieldMarker *marks;
struct multifield *segmentPtr;
int extent;
struct factGetVarJN1Call *hack;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarJN1Call *) ValueToBitMap(theValue);
/*=====================================================*/
/* Get the pointer to the fact from the partial match. */
/*=====================================================*/
if (EngineData(theEnv)->GlobalRHSBinds == NULL)
{
factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem;
marks = get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->markers;
}
else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
{
factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem;
marks = get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->markers;
}
else
{
factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem;
marks = get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->markers;
}
/*==========================================================*/
/* Determine if we want to retrieve the fact address of the */
/* fact, rather than retrieving a field from the fact. */
/*==========================================================*/
if (hack->factAddress)
{
returnValue->type = FACT_ADDRESS;
returnValue->value = (void *) factPtr;
return(TRUE);
}
/*=========================================================*/
/* Determine if we want to retrieve the entire slot value. */
/*=========================================================*/
if (hack->allFields)
{
theSlot = hack->whichSlot;
fieldPtr = &factPtr->theProposition.theFields[theSlot];
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
if (returnValue->type == MULTIFIELD)
{
SetpDOBegin(returnValue,1);
SetpDOEnd(returnValue,((struct multifield *) fieldPtr->value)->multifieldLength);
}
return(TRUE);
}
/*====================================================*/
/* If the slot being accessed is a single field slot, */
/* then just return the single value found in that */
/* slot. The multifieldMarker data structures do not */
/* have to be considered since access to a single */
/* field slot is not affected by variable bindings */
/* from multifield slots. */
/*====================================================*/
theField = hack->whichField;
theSlot = hack->whichSlot;
fieldPtr = &factPtr->theProposition.theFields[theSlot];
if (fieldPtr->type != MULTIFIELD)
{
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/*==========================================================*/
/* Retrieve a value from a multifield slot. First determine */
/* the range of fields for the variable being retrieved. */
/*==========================================================*/
extent = -1;
theField = AdjustFieldPosition(theEnv,marks,theField,theSlot,&extent);
/*=============================================================*/
/* If a range of values are being retrieved (i.e. a multifield */
/* variable), then return the values as a multifield. */
/*=============================================================*/
if (extent != -1)
{
returnValue->type = MULTIFIELD;
returnValue->value = (void *) fieldPtr->value;
returnValue->begin = theField;
returnValue->end = theField + extent - 1;
return(TRUE);
}
/*========================================================*/
/* Otherwise a single field value is being retrieved from */
/* a multifield slot. Just return the type and value. */
/*========================================================*/
segmentPtr = (struct multifield *) factPtr->theProposition.theFields[theSlot].value;
fieldPtr = &segmentPtr->theFields[theField];
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/*************************************************/
/* FactJNGetVar2: Fact join network function for */
/* extracting a variable's value. The value */
/* extracted is from a single field slot. */
/*************************************************/
globle intBool FactJNGetVar2(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
struct fact *factPtr;
struct factGetVarJN2Call *hack;
struct field *fieldPtr;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarJN2Call *) ValueToBitMap(theValue);
/*=====================================================*/
/* Get the pointer to the fact from the partial match. */
/*=====================================================*/
if (EngineData(theEnv)->GlobalRHSBinds == NULL)
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem; }
else
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
/*============================================*/
/* Extract the value from the specified slot. */
/*============================================*/
fieldPtr = &factPtr->theProposition.theFields[hack->whichSlot];
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/****************************************************************/
/* FactJNGetVar3: Fact join network function for extracting a */
/* variable's value. The value extracted is from a multifield */
/* slot that contains at most one multifield variable. */
/****************************************************************/
globle intBool FactJNGetVar3(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
struct fact *factPtr;
struct multifield *segmentPtr;
struct field *fieldPtr;
struct factGetVarJN3Call *hack;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarJN3Call *) ValueToBitMap(theValue);
/*=====================================================*/
/* Get the pointer to the fact from the partial match. */
/*=====================================================*/
if (EngineData(theEnv)->GlobalRHSBinds == NULL)
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
else if ((EngineData(theEnv)->GlobalJoin->depth - 1) == hack->whichPattern)
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,0)->matchingItem; }
else
{ factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }
/*============================================================*/
/* Get the multifield value from which the data is retrieved. */
/*============================================================*/
segmentPtr = (struct multifield *) factPtr->theProposition.theFields[hack->whichSlot].value;
/*=========================================*/
/* If the beginning and end flags are set, */
/* then retrieve a multifield value. */
/*=========================================*/
if (hack->fromBeginning && hack->fromEnd)
{
returnValue->type = MULTIFIELD;
returnValue->value = (void *) segmentPtr;
returnValue->begin = hack->beginOffset;
returnValue->end = (long) (segmentPtr->multifieldLength - (hack->endOffset + 1));
return(TRUE);
}
/*=====================================================*/
/* Return a single field value from a multifield slot. */
/*=====================================================*/
if (hack->fromBeginning)
{ fieldPtr = &segmentPtr->theFields[hack->beginOffset]; }
else
{ fieldPtr = &segmentPtr->theFields[segmentPtr->multifieldLength - (hack->endOffset + 1)]; }
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/****************************************************/
/* FactSlotLength: Determines if the length of a */
/* multifield slot falls within a specified range. */
/****************************************************/
globle intBool FactSlotLength(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
struct factCheckLengthPNCall *hack;
struct multifield *segmentPtr;
int extraOffset = 0;
struct multifieldMarker *tempMark;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -