📄 default.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* DEFAULT ATTRIBUTE MODULE */ /*******************************************************//*************************************************************//* Purpose: Provides functions for parsing the default *//* attribute and determining default values based on *//* slot constraints. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _DEFAULT_SOURCE_#include "setup.h"#include <stdio.h>#define _CLIPS_STDIO_#if ANSI_COMPILER#include <stdlib.h>#endif#include <string.h>#include "constant.h"#include "constrnt.h"#include "cstrnchk.h"#include "multifld.h"#include "inscom.h"#include "exprnpsr.h"#include "scanner.h"#include "router.h"#include "factmngr.h"#include "cstrnutl.h"#include "default.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if ANSI_COMPILER static VOID *FindDefaultValue(int,CONSTRAINT_RECORD *,VOID *);#else static VOID *FindDefaultValue();#endif/********************************************************//* DeriveDefaultFromConstraints: Returns an appropriate *//* default value for the supplied constraints. *//********************************************************/globle VOID DeriveDefaultFromConstraints(constraints,theDefault,multifield) CONSTRAINT_RECORD *constraints; DATA_OBJECT *theDefault; int multifield; { short theType; long minFields; /* 6.04 Bug Fix */ VOID *theValue; /*=============================================================*/ /* If no constraints are specified, then use the symbol nil as */ /* a default for single field slots and a multifield of length */ /* 0 as a default for multifield slots. */ /*=============================================================*/ if (constraints == NULL) { if (multifield) { SetpType(theDefault,MULTIFIELD); SetpDOBegin(theDefault,1); SetpDOEnd(theDefault,0); SetpValue(theDefault,(VOID *) CreateMultifield(0L)); } else { theDefault->type = SYMBOL; theDefault->value = AddSymbol("nil"); } return; } /*=========================================*/ /* Determine the default's type and value. */ /*=========================================*/ if (constraints->anyAllowed || constraints->symbolsAllowed) { theType = SYMBOL; theValue = FindDefaultValue(SYMBOL,constraints,AddSymbol("nil")); } else if (constraints->stringsAllowed) { theType = STRING; theValue = FindDefaultValue(STRING,constraints,AddSymbol("")); } else if (constraints->integersAllowed) { theType = INTEGER; theValue = FindDefaultValue(INTEGER,constraints,AddLong(0L)); } else if (constraints->floatsAllowed) { theType = FLOAT; theValue = FindDefaultValue(FLOAT,constraints,AddDouble(0.0)); } #if OBJECT_SYSTEM else if (constraints->instanceNamesAllowed) { theType = INSTANCE_NAME; theValue = FindDefaultValue(INSTANCE_NAME,constraints,AddSymbol("nil")); } else if (constraints->instanceAddressesAllowed) { theType = INSTANCE_ADDRESS; theValue = (VOID *) &DummyInstance; }#endif #if DEFTEMPLATE_CONSTRUCT else if (constraints->factAddressesAllowed) { theType = FACT_ADDRESS; theValue = (VOID *) &DummyFact; }#endif else if (constraints->externalAddressesAllowed) { theType = EXTERNAL_ADDRESS; theValue = NULL; } else { theType = SYMBOL; theValue = AddSymbol("nil"); } /*=========================================================*/ /* If the default is for a multifield slot, then create a */ /* multifield default value that satisfies the cardinality */ /* constraints for the slot. The default value for a */ /* multifield slot is a multifield of length 0. */ /*=========================================================*/ if (multifield) { if (constraints->minFields == NULL) minFields = 0; else if (constraints->minFields->value == NegativeInfinity) minFields = 0; else minFields = ValueToLong(constraints->minFields->value); SetpType(theDefault,MULTIFIELD); SetpDOBegin(theDefault,1); SetpDOEnd(theDefault,minFields); SetpValue(theDefault,(VOID *) CreateMultifield(minFields)); for (; minFields > 0; minFields--) { SetMFType(GetpValue(theDefault),minFields,theType); SetMFValue(GetpValue(theDefault),minFields,theValue); } } else { theDefault->type = theType; theDefault->value = theValue; } }/***********************************************************************//* FindDefaultValue: Searches the list of restriction values for a *//* constraint to find a default value of the specified type. For *//* example, if the attribute (allowed-symbols on off) was specified, *//* then the symbol "on" would be used as a default value rather than *//* the symbol "nil". For integers and floats, the range attribute is *//* also used to select a suitable default value. If a minimum value *//* was specified, then this value is used first followed by the *//* maximum value. *//************************************************************************/static VOID *FindDefaultValue(theType,theConstraints,standardDefault) int theType; CONSTRAINT_RECORD *theConstraints; VOID *standardDefault; { struct expr *theList; /*=====================================================*/ /* Look on the the allowed values list to see if there */ /* is a value of the requested type. Return the first */ /* value found of the requested type. */ /*=====================================================*/ theList = theConstraints->restrictionList; while (theList != NULL) { if (theList->type == theType) return(theList->value); theList = theList->nextArg; } /*=============================================================*/ /* If no specific values were available for the default value, */ /* and the type requested is a float or integer, then use the */ /* range attribute to select a default value. */ /*=============================================================*/ if (theType == INTEGER) { if (theConstraints->minValue->type == INTEGER) { return(theConstraints->minValue->value); } else if (theConstraints->minValue->type == FLOAT) { return(AddLong((long) ValueToDouble(theConstraints->minValue->value))); } else if (theConstraints->maxValue->type == INTEGER) { return(theConstraints->maxValue->value); } else if (theConstraints->maxValue->type == FLOAT) { return(AddLong((long) ValueToDouble(theConstraints->maxValue->value))); } } else if (theType == FLOAT) { if (theConstraints->minValue->type == FLOAT) { return(theConstraints->minValue->value); } else if (theConstraints->minValue->type == INTEGER)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -