⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 factrete.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 (hack->lhs)     {      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 (hack->rhs)     {      factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem;      marks = get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->markers;     }   else 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 (hack->lhs)     { factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }   else if (hack->rhs)     { factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem; }   else 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 (hack->lhs)     { factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalLHSBinds,hack->whichPattern)->matchingItem; }   else if (hack->rhs)     { factPtr = (struct fact *) get_nth_pm_match(EngineData(theEnv)->GlobalRHSBinds,hack->whichPattern)->matchingItem; }   else 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -