?? modulbin.c
字號:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.21 06/15/03 */ /* */ /* DEFMODULE BSAVE/BLOAD MODULE */ /*******************************************************//*************************************************************//* Purpose: Implements the binary save/load feature for the *//* defmodule construct. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian L. Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _MODULBIN_SOURCE_#include "setup.h"#if (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME)#include <stdio.h>#define _STDIO_INCLUDED_#include "memalloc.h"#include "constrct.h"#include "moduldef.h"#include "bload.h"#include "bsave.h"#include "envrnmnt.h"#include "modulbin.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if BLOAD_AND_BSAVE static void BsaveFind(void *); static void BsaveStorage(void *,FILE *); static void BsaveBinaryItem(void *,FILE *);#endif static void BloadStorage(void *); static void BloadBinaryItem(void *); static void UpdateDefmodule(void *,void *,long); static void UpdatePortItem(void *,void *,long); static void ClearBload(void *);/*********************************************//* DefmoduleBinarySetup: Installs the binary *//* save/load feature for defmodules. *//*********************************************/globle void DefmoduleBinarySetup( void *theEnv) { AddBeforeBloadFunction(theEnv,"defmodule",RemoveAllDefmodules,2000);#if BLOAD_AND_BSAVE AddBinaryItem(theEnv,"defmodule",0,BsaveFind,NULL, BsaveStorage,BsaveBinaryItem, BloadStorage,BloadBinaryItem, ClearBload);#endif AddAbortBloadFunction(theEnv,"defmodule",CreateMainModule,0);#if (BLOAD || BLOAD_ONLY) AddBinaryItem(theEnv,"defmodule",0,NULL,NULL,NULL,NULL, BloadStorage,BloadBinaryItem, ClearBload);#endif }/**************************************************************//* UpdateDefmoduleItemHeader: Updates the values in defmodule *//* item headers for the loaded binary image. *//**************************************************************/globle void UpdateDefmoduleItemHeader( void *theEnv, struct bsaveDefmoduleItemHeader *theBsaveHeader, struct defmoduleItemHeader *theHeader, int itemSize, void *itemArray) { long firstOffset,lastOffset; theHeader->theModule = ModulePointer(theBsaveHeader->theModule); if (theBsaveHeader->firstItem == -1L) { theHeader->firstItem = NULL; theHeader->lastItem = NULL; } else { firstOffset = itemSize * theBsaveHeader->firstItem; lastOffset = itemSize * theBsaveHeader->lastItem; theHeader->firstItem = (struct constructHeader *) &((char *) itemArray)[firstOffset]; theHeader->lastItem = (struct constructHeader *) &((char *) itemArray)[lastOffset]; } }#if BLOAD_AND_BSAVE/*********************************************************//* AssignBsaveDefmdlItemHdrVals: Assigns the appropriate *//* values to a bsave defmodule item header record. *//*********************************************************/globle void AssignBsaveDefmdlItemHdrVals( struct bsaveDefmoduleItemHeader *theBsaveHeader, struct defmoduleItemHeader *theHeader) { theBsaveHeader->theModule = theHeader->theModule->bsaveID; if (theHeader->firstItem == NULL) { theBsaveHeader->firstItem = -1L; theBsaveHeader->lastItem = -1L; } else { theBsaveHeader->firstItem = theHeader->firstItem->bsaveID; theBsaveHeader->lastItem = theHeader->lastItem->bsaveID; } }/**********************************************************//* BsaveFind: Counts the number of data structures which *//* must be saved in the binary image for the defmodules *//* in the current environment. *//**********************************************************/static void BsaveFind( void *theEnv) { struct defmodule *defmodulePtr; struct portItem *theList; /*=======================================================*/ /* If a binary image is already loaded, then temporarily */ /* save the count values since these will be overwritten */ /* in the process of saving the binary image. */ /*=======================================================*/ SaveBloadCount(theEnv,DefmoduleData(theEnv)->BNumberOfDefmodules); SaveBloadCount(theEnv,DefmoduleData(theEnv)->NumberOfPortItems); /*==========================================*/ /* Set the count of defmodule and defmodule */ /* port items data structures to zero. */ /*==========================================*/ DefmoduleData(theEnv)->BNumberOfDefmodules = 0; DefmoduleData(theEnv)->NumberOfPortItems = 0; /*===========================*/ /* Loop through each module. */ /*===========================*/ for (defmodulePtr = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL); defmodulePtr != NULL; defmodulePtr = (struct defmodule *) EnvGetNextDefmodule(theEnv,defmodulePtr)) { /*==============================================*/ /* Increment the number of modules encountered. */ /*==============================================*/ DefmoduleData(theEnv)->BNumberOfDefmodules++; /*===========================*/ /* Mark the defmodule's name */ /* as being a needed symbol. */ /*===========================*/ defmodulePtr->name->neededSymbol = TRUE; /*==============================================*/ /* Loop through each of the port items in the */ /* defmodule's import list incrementing the */ /* number of port items encountered and marking */ /* needed symbols. */ /*==============================================*/ for (theList = defmodulePtr->importList; theList != NULL; theList = theList->next) { DefmoduleData(theEnv)->NumberOfPortItems++; if (theList->moduleName != NULL) { theList->moduleName->neededSymbol = TRUE; } if (theList->constructType != NULL) { theList->constructType->neededSymbol = TRUE; } if (theList->constructName != NULL) { theList->constructName->neededSymbol = TRUE; } } /*==============================================*/ /* Loop through each of the port items in the */ /* defmodule's export list incrementing the */ /* number of port items encountered and marking */ /* needed symbols. */ /*==============================================*/ for (theList = defmodulePtr->exportList; theList != NULL; theList = theList->next) { DefmoduleData(theEnv)->NumberOfPortItems++; if (theList->moduleName != NULL) { theList->moduleName->neededSymbol = TRUE; } if (theList->constructType != NULL) { theList->constructType->neededSymbol = TRUE; } if (theList->constructName != NULL) { theList->constructName->neededSymbol = TRUE; } } } }/*********************************************************//* BsaveStorage: Writes out the storage requirements for *//* all defmodule structures to the binary file. *//*********************************************************/static void BsaveStorage( void *theEnv, FILE *fp) { size_t space; space = sizeof(long) * 2; GenWrite(&space,sizeof(size_t),fp); GenWrite(&DefmoduleData(theEnv)->BNumberOfDefmodules,sizeof(long int),fp); GenWrite(&DefmoduleData(theEnv)->NumberOfPortItems,sizeof(long int),fp); }/*********************************************//* BsaveBinaryItem: Writes out all defmodule *//* structures to the binary file. *//*********************************************/static void BsaveBinaryItem( void *theEnv, FILE *fp) { size_t space; struct defmodule *defmodulePtr; struct bsaveDefmodule newDefmodule; struct bsavePortItem newPortItem; struct portItem *theList; /*=========================================================*/ /* Write out the amount of space taken up by the defmodule */ /* and port item data structures in the binary image. */ /*=========================================================*/ space = DefmoduleData(theEnv)->BNumberOfDefmodules * sizeof(struct bsaveDefmodule); space += DefmoduleData(theEnv)->NumberOfPortItems * sizeof(struct bsavePortItem); GenWrite(&space,sizeof(size_t),fp); /*==========================================*/ /* Write out each defmodule data structure. */ /*==========================================*/ DefmoduleData(theEnv)->BNumberOfDefmodules = 0; DefmoduleData(theEnv)->NumberOfPortItems = 0; for (defmodulePtr = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL); defmodulePtr != NULL; defmodulePtr = (struct defmodule *) EnvGetNextDefmodule(theEnv,defmodulePtr)) { newDefmodule.name = defmodulePtr->name->bucket; DefmoduleData(theEnv)->BNumberOfDefmodules++; if (defmodulePtr->next != NULL) { newDefmodule.next = DefmoduleData(theEnv)->BNumberOfDefmodules; } else { newDefmodule.next = -1L; } if (defmodulePtr->importList == NULL) { newDefmodule.importList = -1L; } else { newDefmodule.importList = DefmoduleData(theEnv)->NumberOfPortItems; for (theList = defmodulePtr->importList; theList != NULL; theList = theList->next) { DefmoduleData(theEnv)->NumberOfPortItems++; } } if (defmodulePtr->exportList == NULL) { newDefmodule.exportList = -1L; } else { newDefmodule.exportList = DefmoduleData(theEnv)->NumberOfPortItems; for (theList = defmodulePtr->exportList; theList != NULL; theList = theList->next) { DefmoduleData(theEnv)->NumberOfPortItems++; } } newDefmodule.bsaveID = defmodulePtr->bsaveID;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -