📄 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; size_t length; SYMBOL_HN **symbolArray; SYMBOL_HN *symbolPtr; unsigned long int numberOfUsedSymbols = 0; size_t 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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -