⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objbin.c

📁 NASA 开发使用的一个专家系统
💻 C
📖 第 1 页 / 共 4 页
字号:
       {        if ((snp->id != ISA_ID) && (snp->id != NAME_ID))          {           snp->bsaveIndex = SlotNameCount++;           snp->name->neededSymbol = CLIPS_TRUE;           snp->putHandlerName->neededSymbol = CLIPS_TRUE;          }       }  }/***************************************************  NAME         : MarkDefclassItems  DESCRIPTION  : Marks needed items for a defclass  INPUTS       : 1) The defclass                 2) User buffer (ignored)  RETURNS      : Nothing useful  SIDE EFFECTS : Bsave indices set and needed                 ephemerals marked  NOTES        : None  ***************************************************/#if IBM_TBC#pragma argsused#endifstatic VOID MarkDefclassItems(theDefclass,buf)  struct constructHeader *theDefclass;  VOID *buf;  {#if MAC_MPW || MAC_MCW#pragma unused(buf)#endif   DEFCLASS *cls = (DEFCLASS *) theDefclass;   register unsigned i;   EXPRESSION *tmpexp;   MarkConstructHeaderNeededItems(&cls->header,ClassCount++);   LinkCount += cls->directSuperclasses.classCount +                cls->directSubclasses.classCount +                cls->allSuperclasses.classCount;#if DEFMODULE_CONSTRUCT   cls->scopeMap->neededBitMap = CLIPS_TRUE;#endif      /* ===================================================      Mark items needed by slot default value expressions      =================================================== */   for (i = 0 ; i < cls->slotCount ; i++)     {      cls->slots[i].bsaveIndex = SlotCount++;      cls->slots[i].overrideMessage->neededSymbol = CLIPS_TRUE;      if (cls->slots[i].defaultValue != NULL)        {         if (cls->slots[i].dynamicDefault)           {            ExpressionCount +=              ExpressionSize((EXPRESSION *) cls->slots[i].defaultValue);            MarkNeededItems((EXPRESSION *) cls->slots[i].defaultValue);           }         else           {            /* =================================================               Static default values are stotred as data objects               and must be converted into expressions               ================================================= */            tmpexp =              ConvertValueToExpression((DATA_OBJECT *) cls->slots[i].defaultValue);            ExpressionCount += ExpressionSize(tmpexp);            MarkNeededItems(tmpexp);            ReturnExpression(tmpexp);           }        }     }              /* ========================================      Count canonical slots needed by defclass      ======================================== */   TemplateSlotCount += cls->instanceSlotCount;   if (cls->instanceSlotCount != 0)     SlotNameMapCount += cls->maxSlotNameID + 1;              /* ===============================================      Mark items needed by defmessage-handler actions      =============================================== */   for (i = 0 ; i < cls->handlerCount ; i++)     {      cls->handlers[i].name->neededSymbol = CLIPS_TRUE;      ExpressionCount += ExpressionSize(cls->handlers[i].actions);      MarkNeededItems(cls->handlers[i].actions);     }   HandlerCount += cls->handlerCount;  }/***************************************************  NAME         : BsaveObjectsExpressions  DESCRIPTION  : Writes out all expressions needed                   by classes and handlers  INPUTS       : The file pointer of the binary file  RETURNS      : Nothing useful  SIDE EFFECTS : File updated  NOTES        : None ***************************************************/static VOID BsaveObjectsExpressions(fp)  FILE *fp;  {   if ((ClassCount == 0L) && (HandlerCount == 0L))     return;   /* ================================================      Save the defclass slot default value expressions      ================================================ */   DoForAllConstructs(BsaveDefaultSlotExpressions,DefclassModuleIndex,                      CLIPS_FALSE,(VOID *) fp);      /* ==============================================      Save the defmessage-handler action expressions      ============================================== */   DoForAllConstructs(BsaveHandlerActionExpressions,DefclassModuleIndex,                      CLIPS_FALSE,(VOID *) fp);  }/***************************************************  NAME         : BsaveDefaultSlotExpressions  DESCRIPTION  : Writes expressions for default                  slot values to binary file  INPUTS       : 1) The defclass                 2) The binary file pointer  RETURNS      : Nothing useful  SIDE EFFECTS : Slot value expressions written  NOTES        : None ***************************************************/static VOID BsaveDefaultSlotExpressions(theDefclass,buf)  struct constructHeader *theDefclass;  VOID *buf;  {   DEFCLASS *cls = (DEFCLASS *) theDefclass;   register unsigned i;   EXPRESSION *tmpexp;      for (i = 0 ; i < cls->slotCount ; i++)     {      if (cls->slots[i].defaultValue != NULL)        {         if (cls->slots[i].dynamicDefault)           BsaveExpression((EXPRESSION *) cls->slots[i].defaultValue,(FILE *) buf);         else           {            /* =================================================               Static default values are stotred as data objects               and must be converted into expressions               ================================================= */            tmpexp =              ConvertValueToExpression((DATA_OBJECT *) cls->slots[i].defaultValue);            BsaveExpression(tmpexp,(FILE *) buf);            ReturnExpression(tmpexp);           }        }     }  }/***************************************************  NAME         : BsaveHandlerActionExpressions  DESCRIPTION  : Writes expressions for handler                  actions to binary file  INPUTS       : 1) The defclass                 2) The binary file pointer  RETURNS      : Nothing useful  SIDE EFFECTS : Handler actions expressions written  NOTES        : None ***************************************************/static VOID BsaveHandlerActionExpressions(theDefclass,buf)  struct constructHeader *theDefclass;  VOID *buf;  {   DEFCLASS *cls = (DEFCLASS *) theDefclass;   register unsigned i;   for (i = 0 ; i < cls->handlerCount ; i++)     BsaveExpression(cls->handlers[i].actions,(FILE *) buf);  }  /*************************************************************************************  NAME         : BsaveStorageObjects  DESCRIPTION  : Writes out number of each type of structure required for COOL                 Space required for counts (unsigned long)                 Number of class modules (long)                 Number of classes (long)                 Number of links to classes (long)                 Number of slots (long)                 Number of instance template slots (long)                 Number of handlers (long)                 Number of definstances (long)  INPUTS       : File pointer of binary file  RETURNS      : Nothing useful  SIDE EFFECTS : Binary file adjusted  NOTES        : None *************************************************************************************/static VOID BsaveStorageObjects(fp)  FILE *fp;  {   UNLN space;      if ((ClassCount == 0L) && (HandlerCount == 0L))     {      space = 0L;      GenWrite((VOID *) &space,(UNLN) sizeof(long),fp);      return;     }   space = sizeof(long) * 9;   GenWrite((VOID *) &space,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &ModuleCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &ClassCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &LinkCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &SlotNameCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &SlotCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &TemplateSlotCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &SlotNameMapCount,(UNLN) sizeof(long),fp);   GenWrite((VOID *) &HandlerCount,(UNLN) sizeof(long),fp);   space = (UNLN) MaxClassID;   GenWrite((VOID *) &space,(UNLN) sizeof(long),fp);  }  /*************************************************************************************  NAME         : BsaveObjects  DESCRIPTION  : Writes out classes and message-handlers in binary format                 Space required (unsigned long)                 Followed by the data structures in order  INPUTS       : File pointer of binary file  RETURNS      : Nothing useful  SIDE EFFECTS : Binary file adjusted  NOTES        : None *************************************************************************************/static VOID BsaveObjects(fp)  FILE *fp;  {   UNLN space;   struct defmodule *theModule;   DEFCLASS_MODULE *theModuleItem;   BSAVE_DEFCLASS_MODULE dummy_mitem;   BSAVE_SLOT_NAME dummy_slot_name;   SLOT_NAME *snp;   register unsigned i;      if ((ClassCount == 0L) && (HandlerCount == 0L))     {      space = 0L;      GenWrite((VOID *) &space,(UNLN) sizeof(UNLN),fp);      return;     }   space = (ModuleCount * (UNLN) sizeof(BSAVE_DEFCLASS_MODULE)) +           (ClassCount * (UNLN) sizeof(BSAVE_DEFCLASS)) +           (LinkCount * (UNLN) sizeof(long)) +           (SlotCount * (UNLN) sizeof(BSAVE_SLOT_DESC)) +           (SlotNameCount * (UNLN) sizeof(BSAVE_SLOT_NAME)) +           (TemplateSlotCount * (UNLN) sizeof(long)) +           (SlotNameMapCount * (UNLN) sizeof(unsigned)) +           (HandlerCount * (UNLN) sizeof(BSAVE_HANDLER)) +           (HandlerCount * (UNLN) sizeof(unsigned));   GenWrite((VOID *) &space,(UNLN) sizeof(UNLN),fp);      ClassCount = 0L;   LinkCount = 0L;   SlotCount = 0L;   SlotNameCount = 0L;   TemplateSlotCount = 0L;   SlotNameMapCount = 0L;   HandlerCount = 0L;      /* =================================      Write out each defclass module      ================================= */   theModule = (struct defmodule *) GetNextDefmodule(NULL);   while (theModule != NULL)     {      theModuleItem = (DEFCLASS_MODULE *)                       GetModuleItem(theModule,FindModuleItem("defclass")->moduleIndex);      AssignBsaveDefmdlItemHdrVals(&dummy_mitem.header,&theModuleItem->header);      GenWrite((VOID *) &dummy_mitem,(unsigned long) sizeof(BSAVE_DEFCLASS_MODULE),fp);      theModule = (struct defmodule *) GetNextDefmodule((VOID *) theModule);     }        /* =====================      Write out the classes       ===================== */   DoForAllConstructs(BsaveDefclass,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);   /* =========================      Write out the class links      ========================= */   LinkCount = 0L;   DoForAllConstructs(BsaveClassLinks,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);     /* ===============================       Write out the slot name entries      =============================== */   for (i = 0 ; i < SLOT_NAME_TABLE_HASH_SIZE ; i++)     for (snp = SlotNameTable[i] ; snp != NULL ; snp = snp->nxt)     {      if ((snp->id != ISA_ID) && (snp->id != NAME_ID))        {         dummy_slot_name.id = snp->id;         dummy_slot_name.hashTableIndex = snp->hashTableIndex;         dummy_slot_name.name = (long) snp->name->bucket;         dummy_slot_name.putHandlerName = (long) snp->putHandlerName->bucket;         GenWrite((VOID *) &dummy_slot_name,(UNLN) sizeof(BSAVE_SLOT_NAME),fp);        }     }        /* ===================      Write out the slots      =================== */   DoForAllConstructs(BsaveSlots,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);     /* =====================================      Write out the template instance slots      ===================================== */   DoForAllConstructs(BsaveTemplateSlots,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);   /* =============================================      Write out the ordered instance slot name maps      ============================================= */   DoForAllConstructs(BsaveSlotMap,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);   /* ==============================      Write out the message-handlers      ============================== */   DoForAllConstructs(BsaveHandlers,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);      /* ==========================================      Write out the ordered message-handler maps      ========================================== */   DoForAllConstructs(BsaveHandlerMap,DefclassModuleIndex,CLIPS_FALSE,(VOID *) fp);   if (Bloaded())     {      RestoreBloadCount(&ModuleCount);      RestoreBloadCount(&ClassCount);      RestoreBloadCount(&LinkCount);      RestoreBloadCount(&SlotCount);      RestoreBloadCount(&SlotNameCount);      RestoreBloadCount(&TemplateSlotCount);      RestoreBloadCount(&SlotNameMapCount);      RestoreBloadCount(&HandlerCount);     }  }/***************************************************  NAME         : BsaveDefclass  DESCRIPTION  : Writes defclass binary data  INPUTS       : 1) The defclass                 2) The binary file pointer  RETURNS      : Nothing useful  SIDE EFFECTS : Defclass binary data written  NOTES        : None ***************************************************/static VOID BsaveDefclass(theDefclass,buf)  struct constructHeader *theDefclass;  VOID *buf;  {   DEFCLASS *cls = (DEFCLASS *) theDefclass;   BSAVE_DEFCLASS dummy_class;   AssignBsaveConstructHeaderVals(&dummy_class.header,&cls->header);   dummy_class.abstract = cls->abstract;   dummy_class.reactive = cls->reactive;   dummy_class.system = cls->system;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -