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

📄 factfun.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
     {      SetpType(returnValue,MULTIFIELD);      SetpDOBegin(returnValue,1);      SetpDOEnd(returnValue,1);      theList = (struct multifield *) EnvCreateMultifield(theEnv,(int) 1);      SetMFType(theList,1,SYMBOL);      SetMFValue(theList,1,EnvAddSymbol(theEnv,"implied"));      SetpValue(returnValue,(void *) theList);      return;     }   /*=================================*/   /* Count the number of slot names. */   /*=================================*/   for (count = 0, theSlot = theFact->whichDeftemplate->slotList;        theSlot != NULL;        count++, theSlot = theSlot->next)     { /* Do Nothing */ }   /*=============================================================*/   /* Create a multifield value in which to store the slot names. */   /*=============================================================*/   SetpType(returnValue,MULTIFIELD);   SetpDOBegin(returnValue,1);   SetpDOEnd(returnValue,(long) count);   theList = (struct multifield *) EnvCreateMultifield(theEnv,count);   SetpValue(returnValue,(void *) theList);   /*===============================================*/   /* Store the slot names in the multifield value. */   /*===============================================*/   for (count = 1, theSlot = theFact->whichDeftemplate->slotList;        theSlot != NULL;        count++, theSlot = theSlot->next)     {      SetMFType(theList,count,SYMBOL);      SetMFValue(theList,count,theSlot->slotName);     }  }/*********************************************//* GetFactListFunction: H/L access routine   *//*   for the get-fact-list function.         *//*********************************************/globle void GetFactListFunction(  void *theEnv,  DATA_OBJECT_PTR returnValue)  {   struct defmodule *theModule;   DATA_OBJECT result;   int numArgs;   /*===========================================*/   /* Determine if a module name was specified. */   /*===========================================*/   if ((numArgs = EnvArgCountCheck(theEnv,"get-fact-list",NO_MORE_THAN,1)) == -1)     {      EnvSetMultifieldErrorValue(theEnv,returnValue);      return;     }   if (numArgs == 1)     {      EnvRtnUnknown(theEnv,1,&result);      if (GetType(result) != SYMBOL)        {         EnvSetMultifieldErrorValue(theEnv,returnValue);         ExpectedTypeError1(theEnv,"get-fact-list",1,"defmodule name");         return;        }      if ((theModule = (struct defmodule *) EnvFindDefmodule(theEnv,DOToString(result))) == NULL)        {         if (strcmp("*",DOToString(result)) != 0)           {            EnvSetMultifieldErrorValue(theEnv,returnValue);            ExpectedTypeError1(theEnv,"get-fact-list",1,"defmodule name");            return;           }         theModule = NULL;        }     }   else     { theModule = ((struct defmodule *) EnvGetCurrentModule(theEnv)); }   /*=====================*/   /* Get the constructs. */   /*=====================*/   EnvGetFactList(theEnv,returnValue,theModule);  }/*************************************//* EnvGetFactList: C access routine  *//*   for the get-fact-list function. *//*************************************/globle void EnvGetFactList(  void *theEnv,  DATA_OBJECT_PTR returnValue,  void *vTheModule)  {   struct fact *theFact;   unsigned long count;   struct multifield *theList;   struct defmodule *theModule = (struct defmodule *) vTheModule;   /*==========================*/   /* Save the current module. */   /*==========================*/   SaveCurrentModule(theEnv);   /*============================================*/   /* Count the number of facts to be retrieved. */   /*============================================*/   if (theModule == NULL)     {      for (theFact = (struct fact *) EnvGetNextFact(theEnv,NULL), count = 0;           theFact != NULL;           theFact = (struct fact *) EnvGetNextFact(theEnv,theFact), count++)        { /* Do Nothing */ }     }   else     {      EnvSetCurrentModule(theEnv,(void *) theModule);      UpdateDeftemplateScope(theEnv);      for (theFact = (struct fact *) GetNextFactInScope(theEnv,NULL), count = 0;           theFact != NULL;           theFact = (struct fact *) GetNextFactInScope(theEnv,theFact), count++)        { /* Do Nothing */ }     }   /*===========================================================*/   /* Create the multifield value to store the construct names. */   /*===========================================================*/   SetpType(returnValue,MULTIFIELD);   SetpDOBegin(returnValue,1);   SetpDOEnd(returnValue,(long) count);   theList = (struct multifield *) EnvCreateMultifield(theEnv,count);   SetpValue(returnValue,(void *) theList);   /*==================================================*/   /* Store the fact pointers in the multifield value. */   /*==================================================*/   if (theModule == NULL)     {      for (theFact = (struct fact *) EnvGetNextFact(theEnv,NULL), count = 1;           theFact != NULL;           theFact = (struct fact *) EnvGetNextFact(theEnv,theFact), count++)        {         SetMFType(theList,count,FACT_ADDRESS);         SetMFValue(theList,count,(void *) theFact);        }     }   else     {      for (theFact = (struct fact *) GetNextFactInScope(theEnv,NULL), count = 1;           theFact != NULL;           theFact = (struct fact *) GetNextFactInScope(theEnv,theFact), count++)        {         SetMFType(theList,count,FACT_ADDRESS);         SetMFValue(theList,count,(void *) theFact);        }     }   /*=============================*/   /* Restore the current module. */   /*=============================*/   RestoreCurrentModule(theEnv);   UpdateDeftemplateScope(theEnv);  }  /**************************************//* PPFactFunction: H/L access routine *//*   for the ppfact function.         *//**************************************/globle void PPFactFunction(  void *theEnv)  {   struct fact *theFact;   int numberOfArguments;#if IBM_TBC   char *logicalName;             /* Avoids warning */#else   char *logicalName = NULL;      /* Avoids warning */#endif   int ignoreDefaults = FALSE;   DATA_OBJECT theArg;   if ((numberOfArguments = EnvArgRangeCheck(theEnv,"ppfact",1,3)) == -1) return;   theFact = GetFactAddressOrIndexArgument(theEnv,"ppfact",1,TRUE);   if (theFact == NULL) return;   /*===============================================================*/   /* Determine the logical name to which the fact will be printed. */   /*===============================================================*/   if (numberOfArguments == 1)     { logicalName = "stdout"; }   else     {      logicalName = GetLogicalName(theEnv,2,"stdout");      if (logicalName == NULL)        {         IllegalLogicalNameMessage(theEnv,"ppfact");         SetHaltExecution(theEnv,TRUE);         SetEvaluationError(theEnv,TRUE);         return;        }     }        /*=========================================*/   /* Should slot values be printed if they   */   /* are the same as the default slot value. */   /*=========================================*/      if (numberOfArguments == 3)     {      EnvRtnUnknown(theEnv,3,&theArg);      if ((theArg.value == EnvFalseSymbol(theEnv)) && (theArg.type == SYMBOL))        { ignoreDefaults = FALSE; }      else        { ignoreDefaults = TRUE; }     }      /*============================================================*/   /* Determine if any router recognizes the output destination. */   /*============================================================*/   if (strcmp(logicalName,"nil") == 0)     { return; }   else if (QueryRouters(theEnv,logicalName) == FALSE)     {      UnrecognizedRouterMessage(theEnv,logicalName);      return;     }   EnvPPFact(theEnv,theFact,logicalName,ignoreDefaults);  }/*******************************//* EnvPPFact: C access routine *//*   for the ppfact function.  *//*******************************/#if IBM_TBC#pragma argsused#endifgloble void EnvPPFact(  void *theEnv,  void *vTheFact,  char *logicalName,  int ignoreDefaults)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif   struct fact *theFact = (struct fact *) vTheFact;   if (theFact == NULL) return;   if (theFact->garbage) return;   PrintFact(theEnv,logicalName,theFact,TRUE,ignoreDefaults);      EnvPrintRouter(theEnv,logicalName,"\n");  }  /**************************************************************//* GetFactAddressOrIndexArgument: Retrieves an argument for a *//*   function which should be a reference to a valid fact.    *//**************************************************************/globle struct fact *GetFactAddressOrIndexArgument(  void *theEnv,  char *theFunction,  int position,  int noFactError)  {   DATA_OBJECT item;   long long factIndex;   struct fact *theFact;   char tempBuffer[20];   EnvRtnUnknown(theEnv,position,&item);   if (GetType(item) == FACT_ADDRESS)     {      if (((struct fact *) GetValue(item))->garbage) return(NULL);      else return (((struct fact *) GetValue(item)));     }   else if (GetType(item) == INTEGER)     {      factIndex = ValueToLong(item.value);      if (factIndex < 0)        {         ExpectedTypeError1(theEnv,theFunction,position,"fact-address or fact-index");         return(NULL);        }      theFact = FindIndexedFact(theEnv,factIndex);      if ((theFact == NULL) && noFactError)        {         gensprintf(tempBuffer,"f-%lld",factIndex);         CantFindItemErrorMessage(theEnv,"fact",tempBuffer);         return(NULL);        }      return(theFact);     }   ExpectedTypeError1(theEnv,theFunction,position,"fact-address or fact-index");   return(NULL);  }#endif /* DEFTEMPLATE_CONSTRUCT */

⌨️ 快捷键说明

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