📄 symblbin.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.20 01/31/02 */
/* */
/* SYMBOL BSAVE MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Implements the binary save/load feature for */
/* atomic data values. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* Brian L. Donnell */
/* */
/* Contributing Programmer(s): */
/* */
/* Revision History: */
/* */
/*************************************************************/
#define _BSAVE_SOURCE_
#include "setup.h"
#if BLOAD || BLOAD_ONLY || BLOAD_AND_BSAVE || BLOAD_INSTANCES || BSAVE_INSTANCES
#include "argacces.h"
#include "bload.h"
#include "bsave.h"
#include "cstrnbin.h"
#include "envrnmnt.h"
#include "exprnpsr.h"
#include "memalloc.h"
#include "moduldef.h"
#include "router.h"
#include "symblbin.h"
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
static void ReadNeededBitMaps(void *);
#if BLOAD_AND_BSAVE || BSAVE_INSTANCES
static void WriteNeededBitMaps(void *,FILE *);
#endif
#if BLOAD_AND_BSAVE || BSAVE_INSTANCES
/**********************************************/
/* WriteNeededAtomicValues: Save all symbols, */
/* floats, integers, and bitmaps needed by */
/* this binary image to the binary file. */
/**********************************************/
globle void WriteNeededAtomicValues(
void *theEnv,
FILE *fp)
{
WriteNeededSymbols(theEnv,fp);
WriteNeededFloats(theEnv,fp);
WriteNeededIntegers(theEnv,fp);
WriteNeededBitMaps(theEnv,fp);
}
/********************************************************/
/* InitAtomicValueNeededFlags: Initializes all symbols, */
/* floats, integers, and bitmaps as being unneeded by */
/* the binary image being saved. */
/********************************************************/
globle void InitAtomicValueNeededFlags(
void *theEnv)
{
unsigned long i;
SYMBOL_HN *symbolPtr, **symbolArray;
FLOAT_HN *floatPtr, **floatArray;
INTEGER_HN *integerPtr, **integerArray;
BITMAP_HN *bitMapPtr, **bitMapArray;
/*===============*/
/* Mark symbols. */
/*===============*/
symbolArray = GetSymbolTable(theEnv);
for (i = 0; i < SYMBOL_HASH_SIZE; i++)
{
symbolPtr = symbolArray[i];
while (symbolPtr != NULL)
{
symbolPtr->neededSymbol = FALSE;
symbolPtr = symbolPtr->next;
}
}
/*==============*/
/* Mark floats. */
/*==============*/
floatArray = GetFloatTable(theEnv);
for (i = 0; i < FLOAT_HASH_SIZE; i++)
{
floatPtr = floatArray[i];
while (floatPtr != NULL)
{
floatPtr->neededFloat = FALSE;
floatPtr = floatPtr->next;
}
}
/*================*/
/* Mark integers. */
/*================*/
integerArray = GetIntegerTable(theEnv);
for (i = 0; i < INTEGER_HASH_SIZE; i++)
{
integerPtr = integerArray[i];
while (integerPtr != NULL)
{
integerPtr->neededInteger = FALSE;
integerPtr = integerPtr->next;
}
}
/*===============*/
/* Mark bitmaps. */
/*===============*/
bitMapArray = GetBitMapTable(theEnv);
for (i = 0; i < BITMAP_HASH_SIZE; i++)
{
bitMapPtr = bitMapArray[i];
while (bitMapPtr != NULL)
{
bitMapPtr->neededBitMap = FALSE;
bitMapPtr = bitMapPtr->next;
}
}
}
/*****************************************************************/
/* WriteNeededSymbols: Stores all of the symbols in the symbol */
/* table needed for this binary image in the binary save file. */
/*****************************************************************/
globle void WriteNeededSymbols(
void *theEnv,
FILE *fp)
{
unsigned long i;
unsigned length;
SYMBOL_HN **symbolArray;
SYMBOL_HN *symbolPtr;
unsigned long int numberOfUsedSymbols = 0, size = 0;
/*=================================*/
/* Get a copy of the symbol table. */
/*=================================*/
symbolArray = GetSymbolTable(theEnv);
/*======================================================*/
/* Get the number of symbols and the total string size. */
/*======================================================*/
for (i = 0; i < SYMBOL_HASH_SIZE; i++)
{
for (symbolPtr = symbolArray[i];
symbolPtr != NULL;
symbolPtr = symbolPtr->next)
{
if (symbolPtr->neededSymbol)
{
numberOfUsedSymbols++;
size += strlen(symbolPtr->contents) + 1;
}
}
}
/*=============================================*/
/* Write out the symbols and the string sizes. */
/*=============================================*/
GenWrite((void *) &numberOfUsedSymbols,(unsigned long) sizeof(unsigned long int),fp);
GenWrite((void *) &size,(unsigned long) sizeof(unsigned long int),fp);
for (i = 0; i < SYMBOL_HASH_SIZE; i++)
{
for (symbolPtr = symbolArray[i];
symbolPtr != NULL;
symbolPtr = symbolPtr->next)
{
if (symbolPtr->neededSymbol)
{
length = strlen(symbolPtr->contents) + 1;
GenWrite((void *) symbolPtr->contents,(unsigned long) length,fp);
}
}
}
}
/*****************************************************************/
/* WriteNeededFloats: Stores all of the floats in the float */
/* table needed for this binary image in the binary save file. */
/*****************************************************************/
globle void WriteNeededFloats(
void *theEnv,
FILE *fp)
{
int i;
FLOAT_HN **floatArray;
FLOAT_HN *floatPtr;
unsigned long int numberOfUsedFloats = 0;
/*================================*/
/* Get a copy of the float table. */
/*================================*/
floatArray = GetFloatTable(theEnv);
/*===========================*/
/* Get the number of floats. */
/*===========================*/
for (i = 0; i < FLOAT_HASH_SIZE; i++)
{
for (floatPtr = floatArray[i];
floatPtr != NULL;
floatPtr = floatPtr->next)
{ if (floatPtr->neededFloat) numberOfUsedFloats++; }
}
/*======================================================*/
/* Write out the number of floats and the float values. */
/*======================================================*/
GenWrite(&numberOfUsedFloats,(unsigned long) sizeof(unsigned long int),fp);
for (i = 0 ; i < FLOAT_HASH_SIZE; i++)
{
for (floatPtr = floatArray[i];
floatPtr != NULL;
floatPtr = floatPtr->next)
{
if (floatPtr->neededFloat)
{ GenWrite(&floatPtr->contents,
(unsigned long) sizeof(floatPtr->contents),fp); }
}
}
}
/******************************************************************/
/* WriteNeededIntegers: Stores all of the integers in the integer */
/* table needed for this binary image in the binary save file. */
/******************************************************************/
globle void WriteNeededIntegers(
void *theEnv,
FILE *fp)
{
int i;
INTEGER_HN **integerArray;
INTEGER_HN *integerPtr;
unsigned long int numberOfUsedIntegers = 0;
/*==================================*/
/* Get a copy of the integer table. */
/*==================================*/
integerArray = GetIntegerTable(theEnv);
/*=============================*/
/* Get the number of integers. */
/*=============================*/
for (i = 0 ; i < INTEGER_HASH_SIZE; i++)
{
for (integerPtr = integerArray[i];
integerPtr != NULL;
integerPtr = integerPtr->next)
{
if (integerPtr->neededInteger) numberOfUsedIntegers++;
}
}
/*==========================================================*/
/* Write out the number of integers and the integer values. */
/*==========================================================*/
GenWrite(&numberOfUsedIntegers,(unsigned long) sizeof(unsigned long int),fp);
for (i = 0 ; i < INTEGER_HASH_SIZE; i++)
{
for (integerPtr = integerArray[i];
integerPtr != NULL;
integerPtr = integerPtr->next)
{
if (integerPtr->neededInteger)
{
GenWrite(&integerPtr->contents,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -