📄 objbin.c
字号:
dummy_class.id = cls->id; dummy_class.slotCount = cls->slotCount; dummy_class.instanceSlotCount = cls->instanceSlotCount; dummy_class.localInstanceSlotCount = cls->localInstanceSlotCount; dummy_class.maxSlotNameID = cls->maxSlotNameID; dummy_class.handlerCount = cls->handlerCount; dummy_class.directSuperclasses.classCount = cls->directSuperclasses.classCount; dummy_class.directSubclasses.classCount = cls->directSubclasses.classCount; dummy_class.allSuperclasses.classCount = cls->allSuperclasses.classCount; if (cls->directSuperclasses.classCount != 0) { dummy_class.directSuperclasses.classArray = LinkCount; LinkCount += cls->directSuperclasses.classCount; } else dummy_class.directSuperclasses.classArray = -1L; if (cls->directSubclasses.classCount != 0) { dummy_class.directSubclasses.classArray = LinkCount; LinkCount += cls->directSubclasses.classCount; } else dummy_class.directSubclasses.classArray = -1L; if (cls->allSuperclasses.classCount != 0) { dummy_class.allSuperclasses.classArray = LinkCount; LinkCount += cls->allSuperclasses.classCount; } else dummy_class.allSuperclasses.classArray = -1L; if (cls->slots != NULL) { dummy_class.slots = SlotCount; SlotCount += cls->slotCount; } else dummy_class.slots = -1L; if (cls->instanceTemplate != NULL) { dummy_class.instanceTemplate = TemplateSlotCount; TemplateSlotCount += cls->instanceSlotCount; dummy_class.slotNameMap = SlotNameMapCount; SlotNameMapCount += cls->maxSlotNameID + 1; } else { dummy_class.instanceTemplate = -1L; dummy_class.slotNameMap = -1L; } if (cls->handlers != NULL) { dummy_class.handlers = HandlerCount; HandlerCount += cls->handlerCount; } else dummy_class.handlers = -1L;#if DEFMODULE_CONSTRUCT dummy_class.scopeMap = (long) cls->scopeMap->bucket;#else dummy_class.scopeMap = -1L;#endif GenWrite((VOID *) &dummy_class,(UNLN) sizeof(BSAVE_DEFCLASS),(FILE *) buf); }/*************************************************** NAME : BsaveClassLinks DESCRIPTION : Writes class links binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass links binary data written NOTES : None ***************************************************/static VOID BsaveClassLinks(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; long dummy_class_index; for (i = 0 ; i < cls->directSuperclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->directSuperclasses.classArray[i]); GenWrite((VOID *) &dummy_class_index,(UNLN) sizeof(long),(FILE *) buf); } LinkCount += cls->directSuperclasses.classCount; for (i = 0 ; i < cls->directSubclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->directSubclasses.classArray[i]); GenWrite((VOID *) &dummy_class_index,(UNLN) sizeof(long),(FILE *) buf); } LinkCount += cls->directSubclasses.classCount; for (i = 0 ; i < cls->allSuperclasses.classCount ; i++) { dummy_class_index = DefclassIndex(cls->allSuperclasses.classArray[i]); GenWrite((VOID *) &dummy_class_index,(UNLN) sizeof(long),(FILE *) buf); } LinkCount += cls->allSuperclasses.classCount; }/*************************************************** NAME : BsaveSlots DESCRIPTION : Writes class slots binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass slots binary data written NOTES : None ***************************************************/static VOID BsaveSlots(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; BSAVE_SLOT_DESC dummy_slot; SLOT_DESC *sp; EXPRESSION *tmpexp; for (i = 0 ; i < cls->slotCount ; i++) { sp = &cls->slots[i]; dummy_slot.dynamicDefault = sp->dynamicDefault; dummy_slot.noDefault = sp->noDefault; dummy_slot.shared = sp->shared; dummy_slot.multiple = sp->multiple; dummy_slot.composite = sp->composite; dummy_slot.noInherit = sp->noInherit; dummy_slot.noWrite = sp->noWrite; dummy_slot.initializeOnly = sp->initializeOnly; dummy_slot.reactive = sp->reactive; dummy_slot.publicVisibility = sp->publicVisibility; dummy_slot.createReadAccessor = sp->createReadAccessor; dummy_slot.createWriteAccessor = sp->createWriteAccessor; dummy_slot.cls = DefclassIndex(sp->cls); dummy_slot.slotName = SlotNameIndex(sp->slotName); dummy_slot.overrideMessage = (long) sp->overrideMessage->bucket; if (sp->defaultValue != NULL) { dummy_slot.defaultValue = ExpressionCount; if (sp->dynamicDefault) ExpressionCount += ExpressionSize((EXPRESSION *) sp->defaultValue); else { tmpexp = ConvertValueToExpression((DATA_OBJECT *) sp->defaultValue); ExpressionCount += ExpressionSize(tmpexp); ReturnExpression(tmpexp); } } else dummy_slot.defaultValue = -1L; dummy_slot.constraint = ConstraintIndex(sp->constraint); GenWrite((VOID *) &dummy_slot,(UNLN) sizeof(BSAVE_SLOT_DESC),(FILE *) buf); } }/************************************************************** NAME : BsaveTemplateSlots DESCRIPTION : Writes class instance template binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass instance template binary data written NOTES : None **************************************************************/static VOID BsaveTemplateSlots(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; long tsp; for (i = 0 ; i < cls->instanceSlotCount ; i++) { tsp = SlotIndex(cls->instanceTemplate[i]); GenWrite((VOID *) &tsp,(UNLN) sizeof(long),(FILE *) buf); } } /*************************************************************** NAME : BsaveSlotMap DESCRIPTION : Writes class canonical slot map binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass canonical slot map binary data written NOTES : None ***************************************************************/static VOID BsaveSlotMap(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; if (cls->instanceSlotCount != 0) GenWrite((VOID *) cls->slotNameMap, (UNLN) (sizeof(unsigned) * (cls->maxSlotNameID + 1)),(FILE *) buf); } /************************************************************ NAME : BsaveHandlers DESCRIPTION : Writes class message-handlers binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass message-handler binary data written NOTES : None ************************************************************/static VOID BsaveHandlers(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; register unsigned i; BSAVE_HANDLER dummy_handler; HANDLER *hnd; for (i = 0 ; i < cls->handlerCount ; i++) { hnd = &cls->handlers[i]; dummy_handler.system = hnd->system; dummy_handler.type = hnd->type; dummy_handler.minParams = hnd->minParams; dummy_handler.maxParams = hnd->maxParams; dummy_handler.localVarCount = hnd->localVarCount; dummy_handler.cls = DefclassIndex(hnd->cls); dummy_handler.name = (long) hnd->name->bucket; if (hnd->actions != NULL) { dummy_handler.actions = ExpressionCount; ExpressionCount += ExpressionSize(hnd->actions); } else dummy_handler.actions = -1L; GenWrite((VOID *) &dummy_handler,(UNLN) sizeof(BSAVE_HANDLER),(FILE *) buf); } } /**************************************************************** NAME : BsaveHandlerMap DESCRIPTION : Writes class message-handler map binary data INPUTS : 1) The defclass 2) The binary file pointer RETURNS : Nothing useful SIDE EFFECTS : Defclass message-handler map binary data written NOTES : None ****************************************************************/static VOID BsaveHandlerMap(theDefclass,buf) struct constructHeader *theDefclass; VOID *buf; { DEFCLASS *cls = (DEFCLASS *) theDefclass; GenWrite((VOID *) cls->handlerOrderMap, (UNLN) (sizeof(unsigned) * cls->handlerCount),(FILE *) buf); } #endif/*********************************************************************** NAME : BloadStorageObjects DESCRIPTION : This routine reads class and handler information from a binary file in five chunks: Class count Handler count Class array Handler array INPUTS : Notthing RETURNS : Nothing useful SIDE EFFECTS : Arrays allocated and set NOTES : This routine makes no attempt to reset any pointers within the structures Bload fails if there are still classes in the system!! ***********************************************************************/static VOID BloadStorageObjects() { UNLN space; long counts[9]; if ((ClassIDMap != NULL) || (MaxClassID != 0)) { CLIPSSystemError("OBJBIN",1); ExitCLIPS(2); } GenRead((VOID *) &space,(UNLN) sizeof(UNLN)); if (space == 0L) { ClassCount = HandlerCount = 0L; return; } GenRead((VOID *) counts,space); ModuleCount = counts[0]; ClassCount = counts[1]; LinkCount = counts[2]; SlotNameCount = counts[3]; SlotCount = counts[4]; TemplateSlotCount = counts[5]; SlotNameMapCount = counts[6]; HandlerCount = counts[7]; MaxClassID = (unsigned short) counts[8]; if (ModuleCount != 0L) { space = (UNLN) (sizeof(DEFCLASS_MODULE) * ModuleCount); ModuleArray = (DEFCLASS_MODULE HUGE_ADDR *) genlongalloc(space); } if (ClassCount != 0L) { space = (UNLN) (sizeof(DEFCLASS) * ClassCount); defclassArray = (DEFCLASS HUGE_ADDR *) genlongalloc(space); ClassIDMap = (DEFCLASS **) gm2((int) (sizeof(DEFCLASS *) * MaxClassID)); } if (LinkCount != 0L) { space = (UNLN) (sizeof(DEFCLASS *) * LinkCount); linkArray = (DEFCLASS * HUGE_ADDR *) genlongalloc(space); } if (SlotCount != 0L) { space = (UNLN) (sizeof(SLOT_DESC) * SlotCount); slotArray = (SLOT_DESC HUGE_ADDR *) genlongalloc(space); } if (SlotNameCount != 0L) { space = (UNLN) (sizeof(SLOT_NAME) * SlotNameCount); slotNameArray = (SLOT_NAME HUGE_ADDR *) genlongalloc(space); } if (TemplateSlotCount != 0L) { space = (UNLN) (sizeof(SLOT_DESC *) * TemplateSlotCount); tmpslotArray = (SLOT_DESC * HUGE_ADDR *) genlongalloc(space); } if (SlotNameMapCount != 0L) { space = (UNLN) (sizeof(unsigned) * SlotNameMapCount); mapslotArray = (unsigned HUGE_ADDR *) genlongalloc(space); } if (HandlerCount != 0L) { space = (UNLN) (sizeof(HANDLER) * HandlerCount); handlerArray = (HANDLER HUGE_ADDR *) genlongalloc(space); space = (UNLN) (sizeof(unsigned) * HandlerCount); maphandlerArray = (unsigned HUGE_ADDR *) genlongalloc(space); } }/*************************************************************** NAME : BloadObjects DESCRIPTION : This routine moves through the class and handler binary arrays updating pointers INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Pointers reset from array indices NOTES : Assumes all loading is finished **************************************************************/static VOID BloadObjects() { UNLN space; GenRead((VOID *) &space,(UNLN) sizeof(UNLN)); if (space == 0L) return; if (ModuleCount != 0L) BloadandRefresh(ModuleCount,(unsigned) sizeof(BSAVE_DEFCLASS_MODULE),UpdateDefclassModule);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -