📄 dffctbin.c
字号:
struct bsaveDeffacts newDeffacts;
struct defmodule *theModule;
struct bsaveDeffactsModule tempDeffactsModule;
struct deffactsModule *theModuleItem;
/*=========================================================*/
/* Write out the amount of space taken up by the deffacts */
/* and deffactsModule data structures in the binary image. */
/*=========================================================*/
space = DeffactsBinaryData(theEnv)->NumberOfDeffacts * sizeof(struct bsaveDeffacts) +
(DeffactsBinaryData(theEnv)->NumberOfDeffactsModules * sizeof(struct bsaveDeffactsModule));
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
/*================================================*/
/* Write out each deffacts module data structure. */
/*================================================*/
DeffactsBinaryData(theEnv)->NumberOfDeffacts = 0;
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
EnvSetCurrentModule(theEnv,(void *) theModule);
theModuleItem = (struct deffactsModule *) GetModuleItem(theEnv,NULL,DeffactsData(theEnv)->DeffactsModuleIndex);
AssignBsaveDefmdlItemHdrVals(&tempDeffactsModule.header,&theModuleItem->header);
GenWrite(&tempDeffactsModule,(unsigned long) sizeof(struct bsaveDeffactsModule),fp);
}
/*==========================*/
/* Write out each deffacts. */
/*==========================*/
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
EnvSetCurrentModule(theEnv,(void *) theModule);
for (theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,NULL);
theDeffacts != NULL;
theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,theDeffacts))
{
AssignBsaveConstructHeaderVals(&newDeffacts.header,&theDeffacts->header);
if (theDeffacts->assertList != NULL)
{
newDeffacts.assertList = ExpressionData(theEnv)->ExpressionCount;
ExpressionData(theEnv)->ExpressionCount += ExpressionSize(theDeffacts->assertList);
}
else
{ newDeffacts.assertList = -1L; }
GenWrite(&newDeffacts,(unsigned long) sizeof(struct bsaveDeffacts),fp);
}
}
/*=============================================================*/
/* If a binary image was already loaded when the bsave command */
/* was issued, then restore the counts indicating the number */
/* of deffacts and deffacts modules in the binary image (these */
/* were overwritten by the binary save). */
/*=============================================================*/
RestoreBloadCount(theEnv,&DeffactsBinaryData(theEnv)->NumberOfDeffactsModules);
RestoreBloadCount(theEnv,&DeffactsBinaryData(theEnv)->NumberOfDeffacts);
}
#endif /* BLOAD_AND_BSAVE */
/****************************************************/
/* BloadStorage: Allocates storage requirements for */
/* the deffacts used by this binary image. */
/****************************************************/
static void BloadStorage(
void *theEnv)
{
unsigned long int space;
/*=====================================================*/
/* Determine the number of deffacts and deffactsModule */
/* data structures to be read. */
/*=====================================================*/
GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
GenReadBinary(theEnv,&DeffactsBinaryData(theEnv)->NumberOfDeffacts,(unsigned long) sizeof(long int));
GenReadBinary(theEnv,&DeffactsBinaryData(theEnv)->NumberOfDeffactsModules,(unsigned long) sizeof(long int));
/*===================================*/
/* Allocate the space needed for the */
/* deffactsModule data structures. */
/*===================================*/
if (DeffactsBinaryData(theEnv)->NumberOfDeffactsModules == 0)
{
DeffactsBinaryData(theEnv)->DeffactsArray = NULL;
DeffactsBinaryData(theEnv)->ModuleArray = NULL;
return;
}
space = DeffactsBinaryData(theEnv)->NumberOfDeffactsModules * sizeof(struct deffactsModule);
DeffactsBinaryData(theEnv)->ModuleArray = (struct deffactsModule *) genlongalloc(theEnv,space);
/*===================================*/
/* Allocate the space needed for the */
/* deffacts data structures. */
/*===================================*/
if (DeffactsBinaryData(theEnv)->NumberOfDeffacts == 0)
{
DeffactsBinaryData(theEnv)->DeffactsArray = NULL;
return;
}
space = (unsigned long) (DeffactsBinaryData(theEnv)->NumberOfDeffacts * sizeof(struct deffacts));
DeffactsBinaryData(theEnv)->DeffactsArray = (struct deffacts *) genlongalloc(theEnv,space);
}
/*****************************************************/
/* BloadBinaryItem: Loads and refreshes the deffacts */
/* constructs used by this binary image. */
/*****************************************************/
static void BloadBinaryItem(
void *theEnv)
{
unsigned long int space;
/*======================================================*/
/* Read in the amount of space used by the binary image */
/* (this is used to skip the construct in the event it */
/* is not available in the version being run). */
/*======================================================*/
GenReadBinary(theEnv,&space,(unsigned long) sizeof(unsigned long int));
/*============================================*/
/* Read in the deffactsModule data structures */
/* and refresh the pointers. */
/*============================================*/
BloadandRefresh(theEnv,DeffactsBinaryData(theEnv)->NumberOfDeffactsModules,
(unsigned) sizeof(struct bsaveDeffactsModule),
UpdateDeffactsModule);
/*======================================*/
/* Read in the deffacts data structures */
/* and refresh the pointers. */
/*======================================*/
BloadandRefresh(theEnv,DeffactsBinaryData(theEnv)->NumberOfDeffacts,
(unsigned) sizeof(struct bsaveDeffacts),
UpdateDeffacts);
}
/***************************************************/
/* UpdateDeffactsModule: Bload refresh routine for */
/* deffacts module data structures. */
/***************************************************/
static void UpdateDeffactsModule(
void *theEnv,
void *buf,
long obji)
{
struct bsaveDeffactsModule *bdmPtr;
bdmPtr = (struct bsaveDeffactsModule *) buf;
UpdateDefmoduleItemHeader(theEnv,&bdmPtr->header,&DeffactsBinaryData(theEnv)->ModuleArray[obji].header,
(int) sizeof(struct deffacts),(void *) DeffactsBinaryData(theEnv)->DeffactsArray);
}
/*********************************************/
/* UpdateDeffacts: Bload refresh routine for */
/* deffacts data structures. */
/*********************************************/
static void UpdateDeffacts(
void *theEnv,
void *buf,
long obji)
{
struct bsaveDeffacts *bdp;
bdp = (struct bsaveDeffacts *) buf;
UpdateConstructHeader(theEnv,&bdp->header,&DeffactsBinaryData(theEnv)->DeffactsArray[obji].header,
(int) sizeof(struct deffactsModule),(void *) DeffactsBinaryData(theEnv)->ModuleArray,
(int) sizeof(struct deffacts),(void *) DeffactsBinaryData(theEnv)->DeffactsArray);
DeffactsBinaryData(theEnv)->DeffactsArray[obji].assertList = ExpressionPointer(bdp->assertList);
}
/**************************************/
/* ClearBload: Deffacts clear routine */
/* when a binary load is in effect. */
/**************************************/
static void ClearBload(
void *theEnv)
{
long i;
unsigned long space;
/*=============================================*/
/* Decrement in use counters for atomic values */
/* contained in the construct headers. */
/*=============================================*/
for (i = 0; i < DeffactsBinaryData(theEnv)->NumberOfDeffacts; i++)
{ UnmarkConstructHeader(theEnv,&DeffactsBinaryData(theEnv)->DeffactsArray[i].header); }
/*=============================================================*/
/* Deallocate the space used for the deffacts data structures. */
/*=============================================================*/
space = DeffactsBinaryData(theEnv)->NumberOfDeffacts * sizeof(struct deffacts);
if (space != 0) genlongfree(theEnv,(void *) DeffactsBinaryData(theEnv)->DeffactsArray,space);
DeffactsBinaryData(theEnv)->NumberOfDeffacts = 0;
/*====================================================================*/
/* Deallocate the space used for the deffacts module data structures. */
/*====================================================================*/
space = DeffactsBinaryData(theEnv)->NumberOfDeffactsModules * sizeof(struct deffactsModule);
if (space != 0) genlongfree(theEnv,(void *) DeffactsBinaryData(theEnv)->ModuleArray,space);
DeffactsBinaryData(theEnv)->NumberOfDeffactsModules = 0;
}
/******************************************************/
/* BloadDeffactsModuleReference: Returns the deffacts */
/* module pointer for use with the bload function. */
/******************************************************/
globle void *BloadDeffactsModuleReference(
void *theEnv,
int theIndex)
{
return ((void *) &DeffactsBinaryData(theEnv)->ModuleArray[theIndex]);
}
#endif /* DEFFACTS_CONSTRUCT && (BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE) && (! RUN_TIME) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -