📄 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)
{
unsigned long space;
space = sizeof(long) * 2;
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
GenWrite(&DefmoduleData(theEnv)->BNumberOfDefmodules,(unsigned long) sizeof(long int),fp);
GenWrite(&DefmoduleData(theEnv)->NumberOfPortItems,(unsigned long) sizeof(long int),fp);
}
/*********************************************/
/* BsaveBinaryItem: Writes out all defmodule */
/* structures to the binary file. */
/*********************************************/
static void BsaveBinaryItem(
void *theEnv,
FILE *fp)
{
unsigned long int 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,(unsigned long) sizeof(unsigned long int),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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -