📄 factrete.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 05/17/06 */
/* */
/* FACT RETE ACCESS FUNCTIONS MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Rete access functions for fact pattern matching. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* 6.23: Correction for FalseSymbol/TrueSymbol. DR0859 */
/* */
/* 6.24: Removed INCREMENTAL_RESET compilation flag. */
/* */
/* Renamed BOOLEAN macro type to intBool. */
/* */
/*************************************************************/
#define _FACTRETE_SOURCE_
#include <stdio.h>
#define _STDIO_INCLUDED_
#include "setup.h"
#if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT
#include "memalloc.h"
#include "extnfunc.h"
#include "router.h"
#include "incrrset.h"
#include "reteutil.h"
#include "drive.h"
#include "engine.h"
#include "factgen.h"
#include "factmch.h"
#include "envrnmnt.h"
#include "factrete.h"
/***************************************************************/
/* FactPNGetVar1: Fact pattern network function for extracting */
/* a variable's value. This is the most generalized routine. */
/***************************************************************/
globle intBool FactPNGetVar1(
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 factGetVarPN1Call *hack;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarPN1Call *) ValueToBitMap(theValue);
/*=====================================================*/
/* Get the pointer to the fact from the partial match. */
/*=====================================================*/
factPtr = FactData(theEnv)->CurrentPatternFact;
marks = FactData(theEnv)->CurrentPatternMarks;
/*==========================================================*/
/* 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];
/*==========================================================*/
/* 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 *) fieldPtr->value;
fieldPtr = &segmentPtr->theFields[theField];
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/**************************************************/
/* FactPNGetVar2: Fact pattern network function */
/* for extracting a variable's value. The value */
/* extracted is from a single field slot. */
/**************************************************/
globle intBool FactPNGetVar2(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
struct fact *factPtr;
struct factGetVarPN2Call *hack;
struct field *fieldPtr;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarPN2Call *) ValueToBitMap(theValue);
/*==============================*/
/* Get the pointer to the fact. */
/*==============================*/
factPtr = FactData(theEnv)->CurrentPatternFact;
/*============================================*/
/* Extract the value from the specified slot. */
/*============================================*/
fieldPtr = &factPtr->theProposition.theFields[hack->whichSlot];
returnValue->type = fieldPtr->type;
returnValue->value = fieldPtr->value;
return(TRUE);
}
/*****************************************************************/
/* FactPNGetVar3: Fact pattern 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 FactPNGetVar3(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
struct fact *factPtr;
struct multifield *segmentPtr;
struct field *fieldPtr;
struct factGetVarPN3Call *hack;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factGetVarPN3Call *) ValueToBitMap(theValue);
/*==============================*/
/* Get the pointer to the fact. */
/*==============================*/
factPtr = FactData(theEnv)->CurrentPatternFact;
/*============================================================*/
/* 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 = (long) 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);
}
/******************************************************/
/* FactPNConstant1: Fact pattern network function for */
/* comparing a value stored in a single field slot */
/* to a constant for either equality or inequality. */
/******************************************************/
#if IBM_TBC
#pragma argsused
#endif
globle intBool FactPNConstant1(
void *theEnv,
void *theValue,
DATA_OBJECT_PTR returnValue)
{
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(returnValue)
#endif
struct factConstantPN1Call *hack;
struct field *fieldPtr;
struct expr *theConstant;
/*==========================================*/
/* Retrieve the arguments for the function. */
/*==========================================*/
hack = (struct factConstantPN1Call *) ValueToBitMap(theValue);
/*============================================*/
/* Extract the value from the specified slot. */
/*============================================*/
fieldPtr = &FactData(theEnv)->CurrentPatternFact->theProposition.theFields[hack->whichSlot];
/*====================================*/
/* 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);
}
/****************************************************************/
/* FactPNConstant2: Fact pattern network function for comparing */
/* a value stored in a slot to a constant for either equality */
/* or inequality. The value being retrieved from the slot has */
/* no multifields to its right (thus it can be retrieved */
/* relative to the beginning). */
/****************************************************************/
#if IBM_TBC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -