📄 classinf.c
字号:
DeleteClassLinks(theEnv,ctop);
}
globle void EnvSlotTypes(
void *theEnv,
void *clsptr,
char *sname,
DATA_OBJECT *result)
{
register unsigned i,j;
register SLOT_DESC *sp;
char typemap[2];
unsigned msize;
if ((sp = SlotInfoSlot(theEnv,result,(DEFCLASS *) clsptr,sname,"slot-types")) == NULL)
return;
if ((sp->constraint != NULL) ? sp->constraint->anyAllowed : TRUE)
{
typemap[0] = typemap[1] = (char) 0xFF;
ClearBitMap(typemap,MULTIFIELD);
msize = 8;
}
else
{
typemap[0] = typemap[1] = (char) 0x00;
msize = 0;
if (sp->constraint->symbolsAllowed)
{
msize++;
SetBitMap(typemap,SYMBOL);
}
if (sp->constraint->stringsAllowed)
{
msize++;
SetBitMap(typemap,STRING);
}
if (sp->constraint->floatsAllowed)
{
msize++;
SetBitMap(typemap,FLOAT);
}
if (sp->constraint->integersAllowed)
{
msize++;
SetBitMap(typemap,INTEGER);
}
if (sp->constraint->instanceNamesAllowed)
{
msize++;
SetBitMap(typemap,INSTANCE_NAME);
}
if (sp->constraint->instanceAddressesAllowed)
{
msize++;
SetBitMap(typemap,INSTANCE_ADDRESS);
}
if (sp->constraint->externalAddressesAllowed)
{
msize++;
SetBitMap(typemap,EXTERNAL_ADDRESS);
}
if (sp->constraint->factAddressesAllowed)
{
msize++;
SetBitMap(typemap,FACT_ADDRESS);
}
}
SetpDOEnd(result,msize);
result->value = EnvCreateMultifield(theEnv,msize);
i = 1;
j = 0;
while (i <= msize)
{
if (TestBitMap(typemap,j))
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i,
(void *) GetDefclassNamePointer((void *)
DefclassData(theEnv)->PrimitiveClassMap[j]));
i++;
}
j++;
}
}
globle void EnvSlotAllowedValues(
void *theEnv,
void *clsptr,
char *sname,
DATA_OBJECT *result)
{
register int i;
register SLOT_DESC *sp;
register EXPRESSION *theExp;
if ((sp = SlotInfoSlot(theEnv,result,(DEFCLASS *) clsptr,sname,"slot-allowed-values")) == NULL)
return;
if ((sp->constraint != NULL) ? (sp->constraint->restrictionList == NULL) : TRUE)
{
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
return;
}
result->end = ExpressionSize(sp->constraint->restrictionList) - 1;
result->value = EnvCreateMultifield(theEnv,(unsigned long) (result->end + 1));
i = 1;
theExp = sp->constraint->restrictionList;
while (theExp != NULL)
{
SetMFType(result->value,i,theExp->type);
SetMFValue(result->value,i,theExp->value);
theExp = theExp->nextArg;
i++;
}
}
globle void EnvSlotAllowedClasses(
void *theEnv,
void *clsptr,
char *sname,
DATA_OBJECT *result)
{
register int i;
register SLOT_DESC *sp;
register EXPRESSION *theExp;
if ((sp = SlotInfoSlot(theEnv,result,(DEFCLASS *) clsptr,sname,"slot-allowed-classes")) == NULL)
return;
if ((sp->constraint != NULL) ? (sp->constraint->classList == NULL) : TRUE)
{
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
return;
}
result->end = ExpressionSize(sp->constraint->classList) - 1;
result->value = EnvCreateMultifield(theEnv,(unsigned long) (result->end + 1));
i = 1;
theExp = sp->constraint->classList;
while (theExp != NULL)
{
SetMFType(result->value,i,theExp->type);
SetMFValue(result->value,i,theExp->value);
theExp = theExp->nextArg;
i++;
}
}
globle void EnvSlotRange(
void *theEnv,
void *clsptr,
char *sname,
DATA_OBJECT *result)
{
register SLOT_DESC *sp;
if ((sp = SlotInfoSlot(theEnv,result,(DEFCLASS *) clsptr,sname,"slot-range")) == NULL)
return;
if ((sp->constraint == NULL) ? FALSE :
(sp->constraint->anyAllowed || sp->constraint->floatsAllowed ||
sp->constraint->integersAllowed))
{
result->end = 1;
result->value = EnvCreateMultifield(theEnv,2L);
SetMFType(result->value,1,sp->constraint->minValue->type);
SetMFValue(result->value,1,sp->constraint->minValue->value);
SetMFType(result->value,2,sp->constraint->maxValue->type);
SetMFValue(result->value,2,sp->constraint->maxValue->value);
}
else
{
result->type = SYMBOL;
result->value = EnvFalseSymbol(theEnv);
return;
}
}
globle void EnvSlotCardinality(
void *theEnv,
void *clsptr,
char *sname,
DATA_OBJECT *result)
{
register SLOT_DESC *sp;
if ((sp = SlotInfoSlot(theEnv,result,(DEFCLASS *) clsptr,sname,"slot-cardinality")) == NULL)
return;
if (sp->multiple == 0)
{
EnvSetMultifieldErrorValue(theEnv,result);
return;
}
result->end = 1;
result->value = EnvCreateMultifield(theEnv,2L);
if (sp->constraint != NULL)
{
SetMFType(result->value,1,sp->constraint->minFields->type);
SetMFValue(result->value,1,sp->constraint->minFields->value);
SetMFType(result->value,2,sp->constraint->maxFields->type);
SetMFValue(result->value,2,sp->constraint->maxFields->value);
}
else
{
SetMFType(result->value,1,INTEGER);
SetMFValue(result->value,1,SymbolData(theEnv)->Zero);
SetMFType(result->value,2,SYMBOL);
SetMFValue(result->value,2,SymbolData(theEnv)->PositiveInfinity);
}
}
/* =========================================
*****************************************
INTERNALLY VISIBLE FUNCTIONS
=========================================
***************************************** */
/*****************************************************
NAME : SlotInfoSupportFunction
DESCRIPTION : Support routine for slot-sources,
slot-facets, et. al.
INPUTS : 1) Data object buffer
2) Name of the H/L caller
3) Pointer to support function to call
RETURNS : Nothing useful
SIDE EFFECTS : Support function called and data
object buffer set
NOTES : None
*****************************************************/
static void SlotInfoSupportFunction(
void *theEnv,
DATA_OBJECT *result,
char *fnxname,
void (*fnx)(void *,void *,char *,DATA_OBJECT *))
{
SYMBOL_HN *ssym;
DEFCLASS *cls;
ssym = CheckClassAndSlot(theEnv,fnxname,&cls);
if (ssym == NULL)
{
EnvSetMultifieldErrorValue(theEnv,result);
return;
}
(*fnx)(theEnv,(void *) cls,ValueToString(ssym),result);
}
/*****************************************************************
NAME : CountSubclasses
DESCRIPTION : Counts the number of direct or indirect
subclasses for a class
INPUTS : 1) Address of class
2) Include (1) or exclude (0) indirect subclasses
3) Traversal id
RETURNS : The number of subclasses
SIDE EFFECTS : None
NOTES : None
*****************************************************************/
static unsigned CountSubclasses(
DEFCLASS *cls,
int inhp,
int tvid)
{
register unsigned i,cnt;
register DEFCLASS *subcls;
for (cnt = 0 , i = 0 ; i < cls->directSubclasses.classCount ; i++)
{
subcls = cls->directSubclasses.classArray[i];
if (TestTraversalID(subcls->traversalRecord,tvid) == 0)
{
cnt++;
SetTraversalID(subcls->traversalRecord,tvid);
if (inhp && (subcls->directSubclasses.classCount != 0))
cnt += CountSubclasses(subcls,inhp,tvid);
}
}
return(cnt);
}
/*********************************************************************
NAME : StoreSubclasses
DESCRIPTION : Stores the names of direct or indirect
subclasses for a class in a mutlifield
INPUTS : 1) Caller's multifield buffer
2) Starting index
3) Address of the class
4) Include (1) or exclude (0) indirect subclasses
5) Traversal id
RETURNS : The number of subclass names stored in the multifield
SIDE EFFECTS : Multifield set with subclass names
NOTES : Assumes multifield is big enough to hold subclasses
*********************************************************************/
static unsigned StoreSubclasses(
void *mfval,
unsigned si,
DEFCLASS *cls,
int inhp,
int tvid,
short storeName)
{
register unsigned i,classi;
register DEFCLASS *subcls;
for (i = si , classi = 0 ; classi < cls->directSubclasses.classCount ; classi++)
{
subcls = cls->directSubclasses.classArray[classi];
if (TestTraversalID(subcls->traversalRecord,tvid) == 0)
{
SetTraversalID(subcls->traversalRecord,tvid);
if (storeName)
{
SetMFType(mfval,i,SYMBOL);
SetMFValue(mfval,i++,(void *) GetDefclassNamePointer((void *) subcls));
}
else
{
SetMFType(mfval,i,DEFCLASS_PTR);
SetMFValue(mfval,i++,(void *) subcls);
}
if (inhp && (subcls->directSubclasses.classCount != 0))
i += StoreSubclasses(mfval,i,subcls,inhp,tvid,storeName);
}
}
return(i - si);
}
/*********************************************************
NAME : SlotInfoSlot
DESCRIPTION : Runtime support routine for slot-sources,
slot-facets, et. al. which looks up
a slot
INPUTS : 1) Data object buffer
2) Class pointer
3) Name-string of slot to find
4) The name of the calling function
RETURNS : Nothing useful
SIDE EFFECTS : Support function called and data object
buffer initialized
NOTES : None
*********************************************************/
static SLOT_DESC *SlotInfoSlot(
void *theEnv,
DATA_OBJECT *result,
DEFCLASS *cls,
char *sname,
char *fnxname)
{
SYMBOL_HN *ssym;
int i;
if ((ssym = FindSymbolHN(theEnv,sname)) == NULL)
{
SetEvaluationError(theEnv,TRUE);
EnvSetMultifieldErrorValue(theEnv,result);
return(NULL);
}
i = FindInstanceTemplateSlot(theEnv,cls,ssym);
if (i == -1)
{
SlotExistError(theEnv,sname,fnxname);
SetEvaluationError(theEnv,TRUE);
EnvSetMultifieldErrorValue(theEnv,result);
return(NULL);
}
result->type = MULTIFIELD;
result->begin = 0;
return(cls->instanceTemplate[i]);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -