📄 factfun.c
字号:
{ 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 + -