📄 tmpltfun.c
字号:
/* EnvDeftemplateSlotTypes: C access routine */
/* for the deftemplate-slot-types function. */
/**********************************************/
globle void EnvDeftemplateSlotTypes(
void *theEnv,
void *vTheDeftemplate,
char *slotName,
DATA_OBJECT *result)
{
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
short position;
struct templateSlot *theSlot = NULL;
int numTypes, i, allTypes = FALSE;
/*===============================================*/
/* If we're dealing with an implied deftemplate, */
/* then the only slot name is "implied." */
/*===============================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") != 0)
{
EnvSetMultifieldErrorValue(theEnv,result);
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return;
}
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position)) == NULL)
{
EnvSetMultifieldErrorValue(theEnv,result);
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return;
}
/*==============================================*/
/* If the slot has no constraint information or */
/* there is no type restriction, then all types */
/* are allowed for the slot. */
/*==============================================*/
if ((theDeftemplate->implied) ||
((theSlot->constraints != NULL) ? theSlot->constraints->anyAllowed : TRUE))
{
#if OBJECT_SYSTEM
numTypes = 8;
#else
numTypes = 6;
#endif
allTypes = TRUE;
}
/*==============================================*/
/* Otherwise count the number of types allowed. */
/*==============================================*/
else
{
numTypes = theSlot->constraints->symbolsAllowed +
theSlot->constraints->stringsAllowed +
theSlot->constraints->floatsAllowed +
theSlot->constraints->integersAllowed +
theSlot->constraints->instanceNamesAllowed +
theSlot->constraints->instanceAddressesAllowed +
theSlot->constraints->externalAddressesAllowed +
theSlot->constraints->factAddressesAllowed;
}
/*========================================*/
/* Return the allowed types for the slot. */
/*========================================*/
result->type = MULTIFIELD;
result->begin = 0;
result->end = numTypes - 1;
result->value = EnvCreateMultifield(theEnv,(long) numTypes);
i = 1;
if (allTypes || theSlot->constraints->floatsAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"FLOAT"));
}
if (allTypes || theSlot->constraints->integersAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"INTEGER"));
}
if (allTypes || theSlot->constraints->symbolsAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"SYMBOL"));
}
if (allTypes || theSlot->constraints->stringsAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"STRING"));
}
if (allTypes || theSlot->constraints->externalAddressesAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"EXTERNAL-ADDRESS"));
}
if (allTypes || theSlot->constraints->factAddressesAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"FACT-ADDRESS"));
}
#if OBJECT_SYSTEM
if (allTypes || theSlot->constraints->instanceAddressesAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"INSTANCE-ADDRESS"));
}
if (allTypes || theSlot->constraints->instanceNamesAllowed)
{
SetMFType(result->value,i,SYMBOL);
SetMFValue(result->value,i++,EnvAddSymbol(theEnv,"INSTANCE-NAME"));
}
#endif
}
/*****************************************************/
/* DeftemplateSlotMultiPFunction: H/L access routine */
/* for the deftemplate-slot-multip function. */
/*****************************************************/
globle int DeftemplateSlotMultiPFunction(
void *theEnv)
{
struct deftemplate *theDeftemplate;
SYMBOL_HN *slotName;
/*===================================================*/
/* Retrieve the deftemplate and slot name arguments. */
/*===================================================*/
slotName = CheckDeftemplateAndSlotArguments(theEnv,"deftemplate-slot-multip",&theDeftemplate);
if (slotName == NULL)
{ return(FALSE); }
/*================================*/
/* Is the slot a multifield slot? */
/*================================*/
return EnvDeftemplateSlotMultiP(theEnv,theDeftemplate,ValueToString(slotName));
}
/***********************************************/
/* EnvDeftemplateSlotMultiP: C access routine */
/* for the deftemplate-slot-multip function. */
/***********************************************/
globle int EnvDeftemplateSlotMultiP(
void *theEnv,
void *vTheDeftemplate,
char *slotName)
{
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
short position;
struct templateSlot *theSlot;
/*===============================================*/
/* If we're dealing with an implied deftemplate, */
/* then the only slot names is "implied." */
/*===============================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") == 0)
{ return(TRUE); }
else
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position)) == NULL)
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
/*================================*/
/* Is the slot a multifield slot? */
/*================================*/
return(theSlot->multislot);
}
/******************************************************/
/* DeftemplateSlotSinglePFunction: H/L access routine */
/* for the deftemplate-slot-singlep function. */
/******************************************************/
globle int DeftemplateSlotSinglePFunction(
void *theEnv)
{
struct deftemplate *theDeftemplate;
SYMBOL_HN *slotName;
/*===================================================*/
/* Retrieve the deftemplate and slot name arguments. */
/*===================================================*/
slotName = CheckDeftemplateAndSlotArguments(theEnv,"deftemplate-slot-singlep",&theDeftemplate);
if (slotName == NULL)
{ return(FALSE); }
/*==================================*/
/* Is the slot a single field slot? */
/*==================================*/
return EnvDeftemplateSlotSingleP(theEnv,theDeftemplate,ValueToString(slotName));
}
/************************************************/
/* EnvDeftemplateSlotSingleP: C access routine */
/* for the deftemplate-slot-singlep function. */
/************************************************/
globle int EnvDeftemplateSlotSingleP(
void *theEnv,
void *vTheDeftemplate,
char *slotName)
{
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
short position;
struct templateSlot *theSlot;
/*===============================================*/
/* If we're dealing with an implied deftemplate, */
/* then the only slot names is "implied." */
/*===============================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") == 0)
{ return(FALSE); }
else
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position)) == NULL)
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
/*==================================*/
/* Is the slot a single field slot? */
/*==================================*/
return(! theSlot->multislot);
}
/*****************************************************/
/* DeftemplateSlotExistPFunction: H/L access routine */
/* for the deftemplate-slot-existp function. */
/*****************************************************/
globle int DeftemplateSlotExistPFunction(
void *theEnv)
{
struct deftemplate *theDeftemplate;
SYMBOL_HN *slotName;
/*===================================================*/
/* Retrieve the deftemplate and slot name arguments. */
/*===================================================*/
slotName = CheckDeftemplateAndSlotArguments(theEnv,"deftemplate-slot-existp",&theDeftemplate);
if (slotName == NULL)
{ return(FALSE); }
/*======================*/
/* Does the slot exist? */
/*======================*/
return EnvDeftemplateSlotExistP(theEnv,theDeftemplate,ValueToString(slotName));
}
/************************************************/
/* EnvDeftemplateSlotExistP: C access routine */
/* for the deftemplate-slot-existp function. */
/************************************************/
globle int EnvDeftemplateSlotExistP(
void *theEnv,
void *vTheDeftemplate,
char *slotName)
{
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
short position;
/*===============================================*/
/* If we're dealing with an implied deftemplate, */
/* then the only slot names is "implied." */
/*===============================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") == 0)
{ return(TRUE); }
else
{ return(FALSE); }
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if (FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position) == NULL)
{ return(FALSE); }
/*==================*/
/* The slot exists. */
/*==================*/
return(TRUE);
}
/************************************************************/
/* CheckDeftemplateAndSlotArguments: Checks the deftemplate */
/* and slot arguments for various functions. */
/************************************************************/
globle SYMBOL_HN *CheckDeftemplateAndSlotArguments(
void *theEnv,
char *functionName,
struct deftemplate **theDeftemplate)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -