⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 insfile.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
   /*******************************************************/   /*      "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 + -