📄 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_INSTANCES
static 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 *);
#endif
static long LoadOrRestoreInstances(void *,char *,int,int);
#if BLOAD_INSTANCES
static 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,(unsigned long) sizeof(unsigned long));
GenReadBinary(theEnv,(void *) &instanceCount,(unsigned long) 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 + -