classinf.c

来自「clips源代码」· C语言 代码 · 共 1,113 行 · 第 1/3 页

C
1,113
字号
   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)  {   long 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)  {   long 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 + =
减小字号Ctrl + -
显示快捷键?