📄 bsave.c
字号:
biPtr != NULL;
biPtr = biPtr->next)
{ if (biPtr->findFunction != NULL) (*biPtr->findFunction)(theEnv); }
}
/****************************************************/
/* WriteNeededFunctions: Writes the names of needed */
/* functions to the binary save file. */
/****************************************************/
static void WriteNeededFunctions(
void *theEnv,
FILE *fp)
{
unsigned long int space, count = 0, length;
struct FunctionDefinition *functionList;
/*================================================*/
/* Assign each function an index if it is needed. */
/*================================================*/
for (functionList = GetFunctionList(theEnv);
functionList != NULL;
functionList = functionList->next)
{
if (functionList->bsaveIndex)
{ functionList->bsaveIndex = (short int) count++; }
else
{ functionList->bsaveIndex = -1; }
}
/*===================================================*/
/* Write the number of function names to be written. */
/*===================================================*/
GenWrite(&count,(unsigned long) sizeof(unsigned long int),fp);
if (count == 0)
{
GenWrite(&count,(unsigned long) sizeof(unsigned long int),fp);
return;
}
/*================================*/
/* Determine the amount of space */
/* needed for the function names. */
/*================================*/
space = FunctionBinarySize(theEnv);
GenWrite(&space,(unsigned long) sizeof(unsigned long int),fp);
/*===============================*/
/* Write out the function names. */
/*===============================*/
for (functionList = GetFunctionList(theEnv);
functionList != NULL;
functionList = functionList->next)
{
if (functionList->bsaveIndex >= 0)
{
length = strlen(ValueToString(functionList->callFunctionName)) + 1;
GenWrite(ValueToString(functionList->callFunctionName),(unsigned long) length,fp);
}
}
}
/*********************************************/
/* FunctionBinarySize: Determines the number */
/* of bytes needed to save all of the */
/* function names in the binary save file. */
/*********************************************/
static unsigned long int FunctionBinarySize(
void *theEnv)
{
unsigned long int size = 0;
struct FunctionDefinition *functionList;
for (functionList = GetFunctionList(theEnv);
functionList != NULL;
functionList = functionList->next)
{
if (functionList->bsaveIndex >= 0)
{ size += strlen(ValueToString(functionList->callFunctionName)) + 1; }
}
return(size);
}
/***************************************************/
/* SaveBloadCount: Used to save the data structure */
/* count values when a binary save command is */
/* issued when a binary image is loaded. */
/***************************************************/
globle void SaveBloadCount(
void *theEnv,
long cnt)
{
BLOADCNTSV *tmp, *prv;
tmp = get_struct(theEnv,bloadcntsv);
tmp->val = cnt;
tmp->nxt = NULL;
if (BsaveData(theEnv)->BloadCountSaveTop == NULL)
{ BsaveData(theEnv)->BloadCountSaveTop = tmp; }
else
{
prv = BsaveData(theEnv)->BloadCountSaveTop;
while (prv->nxt != NULL)
{ prv = prv->nxt; }
prv->nxt = tmp;
}
}
/**************************************************/
/* RestoreBloadCount: Restores the data structure */
/* count values after a binary save command is */
/* completed when a binary image is loaded. */
/**************************************************/
globle void RestoreBloadCount(
void *theEnv,
long *cnt)
{
BLOADCNTSV *tmp;
*cnt = BsaveData(theEnv)->BloadCountSaveTop->val;
tmp = BsaveData(theEnv)->BloadCountSaveTop;
BsaveData(theEnv)->BloadCountSaveTop = BsaveData(theEnv)->BloadCountSaveTop->nxt;
rtn_struct(theEnv,bloadcntsv,tmp);
}
/**********************************************/
/* MarkNeededItems: Examines an expression to */
/* determine which items are needed to save */
/* an expression as part of a binary image. */
/**********************************************/
globle void MarkNeededItems(
void *theEnv,
struct expr *testPtr)
{
while (testPtr != NULL)
{
switch (testPtr->type)
{
case SYMBOL:
case STRING:
case GBL_VARIABLE:
case INSTANCE_NAME:
((SYMBOL_HN *) testPtr->value)->neededSymbol = TRUE;
break;
case FLOAT:
((FLOAT_HN *) testPtr->value)->neededFloat = TRUE;
break;
case INTEGER:
((INTEGER_HN *) testPtr->value)->neededInteger = TRUE;
break;
case FCALL:
((struct FunctionDefinition *) testPtr->value)->bsaveIndex = TRUE;
break;
case RVOID:
break;
default:
if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type] == NULL) break;
if (EvaluationData(theEnv)->PrimitivesArray[testPtr->type]->bitMap)
{ ((BITMAP_HN *) testPtr->value)->neededBitMap = TRUE; }
break;
}
if (testPtr->argList != NULL)
{ MarkNeededItems(theEnv,testPtr->argList); }
testPtr = testPtr->nextArg;
}
}
/******************************************************/
/* WriteBinaryHeader: Writes a binary header used for */
/* verification when a binary image is loaded. */
/******************************************************/
static void WriteBinaryHeader(
void *theEnv,
FILE *fp)
{
GenWrite(BloadData(theEnv)->BinaryPrefixID,(unsigned long) strlen(BloadData(theEnv)->BinaryPrefixID) + 1,fp);
GenWrite(BloadData(theEnv)->BinaryVersionID,(unsigned long) strlen(BloadData(theEnv)->BinaryVersionID) + 1,fp);
}
/******************************************************/
/* WriteBinaryFooter: Writes a binary footer used for */
/* verification when a binary image is loaded. */
/******************************************************/
static void WriteBinaryFooter(
void *theEnv,
FILE *fp)
{
char footerBuffer[CONSTRUCT_HEADER_SIZE];
strncpy(footerBuffer,BloadData(theEnv)->BinaryPrefixID,CONSTRUCT_HEADER_SIZE);
GenWrite(footerBuffer,(unsigned long) CONSTRUCT_HEADER_SIZE,fp);
}
#endif /* BLOAD_AND_BSAVE */
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE
/**********************************************************/
/* AddBinaryItem: Informs the bload/bsave commands of the */
/* appropriate access functions needed to save/load the */
/* data structures of a construct or other "item" to a */
/* binary file. */
/**********************************************************/
globle intBool AddBinaryItem(
void *theEnv,
char *name,
int priority,
void (*findFunction)(void *),
void (*expressionFunction)(void *,FILE *),
void (*bsaveStorageFunction)(void *,FILE *),
void (*bsaveFunction)(void *,FILE *),
void (*bloadStorageFunction)(void *),
void (*bloadFunction)(void *),
void (*clearFunction)(void *))
{
struct BinaryItem *newPtr, *currentPtr, *lastPtr = NULL;
/*========================================*/
/* Create the binary item data structure. */
/*========================================*/
newPtr = get_struct(theEnv,BinaryItem);
newPtr->name = name;
newPtr->findFunction = findFunction;
newPtr->expressionFunction = expressionFunction;
newPtr->bsaveStorageFunction = bsaveStorageFunction;
newPtr->bsaveFunction = bsaveFunction;
newPtr->bloadStorageFunction = bloadStorageFunction;
newPtr->bloadFunction = bloadFunction;
newPtr->clearFunction = clearFunction;
newPtr->priority = priority;
/*=================================*/
/* If no binary items are defined, */
/* just put the item on the list. */
/*=================================*/
if (BsaveData(theEnv)->ListOfBinaryItems == NULL)
{
newPtr->next = NULL;
BsaveData(theEnv)->ListOfBinaryItems = newPtr;
return(TRUE);
}
/*=========================================*/
/* Otherwise, place the binary item at the */
/* appropriate place in the list of binary */
/* items based on its priority. */
/*=========================================*/
currentPtr = BsaveData(theEnv)->ListOfBinaryItems;
while ((currentPtr != NULL) ? (priority < currentPtr->priority) : FALSE)
{
lastPtr = currentPtr;
currentPtr = currentPtr->next;
}
if (lastPtr == NULL)
{
newPtr->next = BsaveData(theEnv)->ListOfBinaryItems;
BsaveData(theEnv)->ListOfBinaryItems = newPtr;
}
else
{
newPtr->next = currentPtr;
lastPtr->next = newPtr;
}
/*==================================*/
/* Return TRUE to indicate the item */
/* was successfully added. */
/*==================================*/
return(TRUE);
}
#endif /* BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -