📄 insfile.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.24 06/05/06 */ /* */ /* INSTANCE LOAD/SAVE (ASCII/BINARY) MODULE */ /*******************************************************//*************************************************************//* Purpose: File load/save routines for instances *//* *//* Principal Programmer(s): *//* Brian L. Donnell *//* *//* Contributing Programmer(s): *//* *//* Revision History: *//* *//* 6.24: Added environment parameter to GenClose. *//* Added environment parameter to GenOpen. *//* *//* Renamed BOOLEAN macro type to intBool. *//* *//* Corrected code to remove compiler warnings. *//* *//*************************************************************//* ========================================= ***************************************** EXTERNAL DEFINITIONS ========================================= ***************************************** */#include <stdlib.h>#include "setup.h"#if OBJECT_SYSTEM#include "argacces.h"#include "classcom.h"#include "classfun.h"#include "memalloc.h"#include "extnfunc.h"#include "inscom.h"#include "insfun.h"#include "insmngr.h"#include "inspsr.h"#include "object.h"#include "router.h"#include "strngrtr.h"#include "symblbin.h"#include "sysdep.h"#include "envrnmnt.h"#if DEFTEMPLATE_CONSTRUCT && DEFRULE_CONSTRUCT#include "factmngr.h"#endif#define _INSFILE_SOURCE_#include "insfile.h"/* ========================================= ***************************************** CONSTANTS ========================================= ***************************************** */#define MAX_BLOCK_SIZE 10240/* ========================================= ***************************************** MACROS AND TYPES ========================================= ***************************************** */struct bsaveSlotValue { long slotName; unsigned valueCount; };struct bsaveSlotValueAtom { unsigned short type; long value; };/* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTION HEADERS ========================================= ***************************************** */static long InstancesSaveCommandParser(void *,char *,long (*)(void *,char *,int, EXPRESSION *,intBool));static DATA_OBJECT *ProcessSaveClassList(void *,char *,EXPRESSION *,int,intBool);static void ReturnSaveClassList(void *,DATA_OBJECT *);static long SaveOrMarkInstances(void *,void *,int,DATA_OBJECT *,intBool,intBool, void (*)(void *,void *,INSTANCE_TYPE *));static long SaveOrMarkInstancesOfClass(void *,void *,struct defmodule *,int,DEFCLASS *, intBool,int,void (*)(void *,void *,INSTANCE_TYPE *));static void SaveSingleInstanceText(void *,void *,INSTANCE_TYPE *);static void ProcessFileErrorMessage(void *,char *,char *);#if BSAVE_INSTANCESstatic void WriteBinaryHeader(void *,FILE *);static void MarkSingleInstance(void *,void *,INSTANCE_TYPE *);static void MarkNeededAtom(void *,int,void *);static void SaveSingleInstanceBinary(void *,void *,INSTANCE_TYPE *);static void SaveAtomBinary(void *,unsigned short,void *,FILE *);#endifstatic long LoadOrRestoreInstances(void *,char *,int,int);#if BLOAD_INSTANCESstatic intBool VerifyBinaryHeader(void *,char *);static intBool LoadSingleBinaryInstance(void *);static void BinaryLoadInstanceError(void *,SYMBOL_HN *,DEFCLASS *);static void CreateSlotValue(void *,DATA_OBJECT *,struct bsaveSlotValueAtom *,unsigned long); static void *GetBinaryAtomValue(void *,struct bsaveSlotValueAtom *);static void BufferedRead(void *,void *,unsigned long);static void FreeReadBuffer(void *);#endif/* ========================================= ***************************************** EXTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** *//*************************************************** NAME : SetupInstanceFileCommands DESCRIPTION : Defines function interfaces for saving instances to files INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : Functions defined to KB NOTES : None ***************************************************/globle void SetupInstanceFileCommands( void *theEnv) {#if BLOAD_INSTANCES || BSAVE_INSTANCES AllocateEnvironmentData(theEnv,INSTANCE_FILE_DATA,sizeof(struct instanceFileData),NULL); InstanceFileData(theEnv)->InstanceBinaryPrefixID = "\5\6\7CLIPS"; InstanceFileData(theEnv)->InstanceBinaryVersionID = "V6.00";#endif#if (! RUN_TIME) EnvDefineFunction2(theEnv,"save-instances",'l',PTIEF SaveInstancesCommand, "SaveInstancesCommand","1*wk"); EnvDefineFunction2(theEnv,"load-instances",'l',PTIEF LoadInstancesCommand, "LoadInstancesCommand","11k"); EnvDefineFunction2(theEnv,"restore-instances",'l',PTIEF RestoreInstancesCommand, "RestoreInstancesCommand","11k");#if BSAVE_INSTANCES EnvDefineFunction2(theEnv,"bsave-instances",'l',PTIEF BinarySaveInstancesCommand, "BinarySaveInstancesCommand","1*wk");#endif#if BLOAD_INSTANCES EnvDefineFunction2(theEnv,"bload-instances",'l',PTIEF BinaryLoadInstancesCommand, "BinaryLoadInstancesCommand","11k");#endif#endif }/**************************************************************************** NAME : SaveInstancesCommand DESCRIPTION : H/L interface for saving current instances to a file INPUTS : None RETURNS : The number of instances saved SIDE EFFECTS : Instances saved to named file NOTES : H/L Syntax : (save-instances <file> [local|visible [[inherit] <class>+]]) ****************************************************************************/globle long SaveInstancesCommand( void *theEnv) { return(InstancesSaveCommandParser(theEnv,"save-instances",EnvSaveInstances)); }/****************************************************** NAME : LoadInstancesCommand DESCRIPTION : H/L interface for loading instances from a file INPUTS : None RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded from named file NOTES : H/L Syntax : (load-instances <file>) ******************************************************/globle long LoadInstancesCommand( void *theEnv) { char *fileFound; DATA_OBJECT temp; long instanceCount; if (EnvArgTypeCheck(theEnv,"load-instances",1,SYMBOL_OR_STRING,&temp) == FALSE) return(0L); fileFound = DOToString(temp); instanceCount = EnvLoadInstances(theEnv,fileFound); if (EvaluationData(theEnv)->EvaluationError) ProcessFileErrorMessage(theEnv,"load-instances",fileFound); return(instanceCount); }/*************************************************** NAME : EnvLoadInstances DESCRIPTION : Loads instances from named file INPUTS : The name of the input file RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded from file NOTES : None ***************************************************/globle long EnvLoadInstances( void *theEnv, char *file) { return(LoadOrRestoreInstances(theEnv,file,TRUE,TRUE)); }/*************************************************** NAME : EnvLoadInstancesFromString DESCRIPTION : Loads instances from given string INPUTS : 1) The input string 2) Index of char in string after last valid char (-1 for all chars) RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded from string NOTES : Uses string routers ***************************************************/globle long EnvLoadInstancesFromString( void *theEnv, char *theString, int theMax) { long theCount; char * theStrRouter = "*** load-instances-from-string ***"; if ((theMax == -1) ? (!OpenStringSource(theEnv,theStrRouter,theString,0)) : (!OpenTextSource(theEnv,theStrRouter,theString,0,(unsigned) theMax))) return(-1L); theCount = LoadOrRestoreInstances(theEnv,theStrRouter,TRUE,FALSE); CloseStringSource(theEnv,theStrRouter); return(theCount); }/********************************************************* NAME : RestoreInstancesCommand DESCRIPTION : H/L interface for loading instances from a file w/o messages INPUTS : None RETURNS : The number of instances restored SIDE EFFECTS : Instances loaded from named file NOTES : H/L Syntax : (restore-instances <file>) *********************************************************/globle long RestoreInstancesCommand( void *theEnv) { char *fileFound; DATA_OBJECT temp; long instanceCount; if (EnvArgTypeCheck(theEnv,"restore-instances",1,SYMBOL_OR_STRING,&temp) == FALSE) return(0L); fileFound = DOToString(temp); instanceCount = EnvRestoreInstances(theEnv,fileFound); if (EvaluationData(theEnv)->EvaluationError) ProcessFileErrorMessage(theEnv,"restore-instances",fileFound); return(instanceCount); }/*************************************************** NAME : EnvRestoreInstances DESCRIPTION : Restores instances from named file INPUTS : The name of the input file RETURNS : The number of instances restored SIDE EFFECTS : Instances restored from file NOTES : None ***************************************************/globle long EnvRestoreInstances( void *theEnv, char *file) { return(LoadOrRestoreInstances(theEnv,file,FALSE,TRUE)); }/*************************************************** NAME : EnvRestoreInstancesFromString DESCRIPTION : Restores instances from given string INPUTS : 1) The input string 2) Index of char in string after last valid char (-1 for all chars) RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded from string NOTES : Uses string routers ***************************************************/globle long EnvRestoreInstancesFromString( void *theEnv, char *theString, int theMax) { long theCount; char * theStrRouter = "*** load-instances-from-string ***"; if ((theMax == -1) ? (!OpenStringSource(theEnv,theStrRouter,theString,0)) : (!OpenTextSource(theEnv,theStrRouter,theString,0,(unsigned) theMax))) return(-1L); theCount = LoadOrRestoreInstances(theEnv,theStrRouter,FALSE,FALSE); CloseStringSource(theEnv,theStrRouter); return(theCount); }#if BLOAD_INSTANCES/******************************************************* NAME : BinaryLoadInstancesCommand DESCRIPTION : H/L interface for loading instances from a binary file INPUTS : None RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded from named binary file NOTES : H/L Syntax : (bload-instances <file>) *******************************************************/globle long BinaryLoadInstancesCommand( void *theEnv) { char *fileFound; DATA_OBJECT temp; long instanceCount; if (EnvArgTypeCheck(theEnv,"bload-instances",1,SYMBOL_OR_STRING,&temp) == FALSE) return(0L); fileFound = DOToString(temp); instanceCount = EnvBinaryLoadInstances(theEnv,fileFound); if (EvaluationData(theEnv)->EvaluationError) ProcessFileErrorMessage(theEnv,"bload-instances",fileFound); return(instanceCount); }/**************************************************** NAME : EnvBinaryLoadInstances DESCRIPTION : Loads instances quickly from a binary file INPUTS : The file name RETURNS : The number of instances loaded SIDE EFFECTS : Instances loaded w/o message-passing NOTES : None ****************************************************/globle long EnvBinaryLoadInstances( void *theEnv, char *theFile) { long i,instanceCount; if (GenOpenReadBinary(theEnv,"bload-instances",theFile) == 0) { SetEvaluationError(theEnv,TRUE); return(-1L); } if (VerifyBinaryHeader(theEnv,theFile) == FALSE) { GenCloseBinary(theEnv); SetEvaluationError(theEnv,TRUE); return(-1L); } EnvIncrementGCLocks(theEnv); ReadNeededAtomicValues(theEnv); InstanceFileData(theEnv)->BinaryInstanceFileOffset = 0L; GenReadBinary(theEnv,(void *) &InstanceFileData(theEnv)->BinaryInstanceFileSize,sizeof(unsigned long)); GenReadBinary(theEnv,(void *) &instanceCount,sizeof(long)); for (i = 0L ; i < instanceCount ; i++) { if (LoadSingleBinaryInstance(theEnv) == FALSE) { FreeReadBuffer(theEnv); FreeAtomicValueStorage(theEnv); GenCloseBinary(theEnv); SetEvaluationError(theEnv,TRUE); EnvDecrementGCLocks(theEnv); return(i); } } FreeReadBuffer(theEnv); FreeAtomicValueStorage(theEnv); GenCloseBinary(theEnv); EnvDecrementGCLocks(theEnv); return(instanceCount); }#endif/******************************************************* NAME : EnvSaveInstances DESCRIPTION : Saves current instances to named file INPUTS : 1) The name of the output file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -