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

📄 dffctcmp.c

📁 clips源代码
💻 C
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.22  06/15/04            */   /*                                                     */   /*            DEFFACTS CONSTRUCTS-TO-C MODULE          */   /*******************************************************//*************************************************************//* Purpose: Implements the constructs-to-c feature for the   *//*    deffacts construct.                                    *//*                                                           *//* Principal Programmer(s):                                  *//*      Gary D. Riley                                        *//*                                                           *//* Contributing Programmer(s):                               *//*      Brian L. Donnell                                     *//*                                                           *//* Revision History:                                         *//*                                                           *//*************************************************************/#define _DFFCTCMP_SOURCE_#include "setup.h"#if DEFFACTS_CONSTRUCT && CONSTRUCT_COMPILER && (! RUN_TIME)#include <stdio.h>#define _STDIO_INCLUDED_#include "conscomp.h"#include "dffctdef.h"#include "envrnmnt.h"#include "dffctcmp.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/   static int                     ConstructToCode(void *,char *,int,FILE *,int,int);   static void                    DeffactsToCode(void *,FILE *,struct deffacts *,                                                 int,int,int);   static void                    DeffactsModuleToCode(void *,FILE *,struct defmodule *,int,int,int);   static void                    CloseDeffactsFiles(void *,FILE *,FILE *,int);   static void                    BeforeDeffactsToCode(void *);/*************************************************************//* DeffactsCompilerSetup: Initializes the deffacts construct *//*    for use with the constructs-to-c command.              *//*************************************************************/globle void DeffactsCompilerSetup(  void *theEnv)  {   DeffactsData(theEnv)->DeffactsCodeItem =       AddCodeGeneratorItem(theEnv,"deffacts",0,BeforeDeffactsToCode,                           NULL,ConstructToCode,2);  }/*************************************************************//* BeforeDeffactsToCode: Assigns each deffacts a unique ID   *//*   which will be used for pointer references when the data *//*   structures are written to a file as C code              *//*************************************************************/static void BeforeDeffactsToCode(  void *theEnv)  {   MarkConstructBsaveIDs(theEnv,DeffactsData(theEnv)->DeffactsModuleIndex);  }/**********************************************************//* ConstructToCode: Produces deffacts code for a run-time *//*   module created using the constructs-to-c function.   *//**********************************************************/static int ConstructToCode(  void *theEnv,  char *fileName,  int fileID,  FILE *headerFP,  int imageID,  int maxIndices)  {   int fileCount = 1;   struct defmodule *theModule;   struct deffacts *theDeffacts;   int moduleCount = 0, moduleArrayCount = 0, moduleArrayVersion = 1;   int deffactsArrayCount = 0, deffactsArrayVersion = 1;   FILE *moduleFile = NULL, *deffactsFile = NULL;   /*===============================================*/   /* Include the appropriate deffacts header file. */   /*===============================================*/   fprintf(headerFP,"#include \"dffctdef.h\"\n");   /*=================================================================*/   /* Loop through all the modules and all the deffacts writing their */   /* C code representation to the file as they are traversed.        */   /*=================================================================*/   for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);        theModule != NULL;        theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))     {      EnvSetCurrentModule(theEnv,(void *) theModule);      moduleFile = OpenFileIfNeeded(theEnv,moduleFile,fileName,fileID,imageID,&fileCount,                                    moduleArrayVersion,headerFP,                                    "struct deffactsModule",ModulePrefix(DeffactsData(theEnv)->DeffactsCodeItem),                                    FALSE,NULL);      if (moduleFile == NULL)        {         CloseDeffactsFiles(theEnv,moduleFile,deffactsFile,maxIndices);         return(0);        }      DeffactsModuleToCode(theEnv,moduleFile,theModule,imageID,maxIndices,moduleCount);      moduleFile = CloseFileIfNeeded(theEnv,moduleFile,&moduleArrayCount,&moduleArrayVersion,                                     maxIndices,NULL,NULL);      /*===================================================*/      /* Loop through each of the deffacts in this module. */      /*===================================================*/      for (theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,NULL);           theDeffacts != NULL;           theDeffacts = (struct deffacts *) EnvGetNextDeffacts(theEnv,theDeffacts))        {         deffactsFile = OpenFileIfNeeded(theEnv,deffactsFile,fileName,fileID,imageID,&fileCount,                                         deffactsArrayVersion,headerFP,                                         "struct deffacts",ConstructPrefix(DeffactsData(theEnv)->DeffactsCodeItem),                                         FALSE,NULL);         if (deffactsFile == NULL)           {            CloseDeffactsFiles(theEnv,moduleFile,deffactsFile,maxIndices);            return(0);           }         DeffactsToCode(theEnv,deffactsFile,theDeffacts,imageID,maxIndices,moduleCount);         deffactsArrayCount++;         deffactsFile = CloseFileIfNeeded(theEnv,deffactsFile,&deffactsArrayCount,                                          &deffactsArrayVersion,maxIndices,NULL,NULL);        }      moduleCount++;      moduleArrayCount++;     }   CloseDeffactsFiles(theEnv,moduleFile,deffactsFile,maxIndices);   return(1);  }/*********************************************************//* CloseDeffactsFiles: Closes all of the C files created *//*   for deffacts. Called when an error occurs or when   *//*   the deffacts have all been written to the files.    *//*********************************************************/static void CloseDeffactsFiles(  void *theEnv,  FILE *moduleFile,  FILE *deffactsFile,  int maxIndices)  {   int count = maxIndices;   int arrayVersion = 0;   if (deffactsFile != NULL)     {      count = maxIndices;      CloseFileIfNeeded(theEnv,deffactsFile,&count,&arrayVersion,maxIndices,NULL,NULL);     }   if (moduleFile != NULL)     {      count = maxIndices;      CloseFileIfNeeded(theEnv,moduleFile,&count,&arrayVersion,maxIndices,NULL,NULL);     }  }/**********************************************************//* DeffactsModuleToCode: Writes the C code representation *//*   of a single deffacts module to the specified file.   *//**********************************************************/#if IBM_TBC#pragma argsused#endifstatic void DeffactsModuleToCode(  void *theEnv,  FILE *theFile,  struct defmodule *theModule,  int imageID,  int maxIndices,  int moduleCount)  {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(moduleCount)#endif      fprintf(theFile,"{");   ConstructModuleToCode(theEnv,theFile,theModule,imageID,maxIndices,                                  DeffactsData(theEnv)->DeffactsModuleIndex,                                  ConstructPrefix(DeffactsData(theEnv)->DeffactsCodeItem));   fprintf(theFile,"}");  }/*********************************************************//* DeffactsToCode: Writes the C code representation of a *//*   single deffacts construct to the specified file.    *//*********************************************************/static void DeffactsToCode(  void *theEnv,  FILE *theFile,  struct deffacts *theDeffacts,  int imageID,  int maxIndices,  int moduleCount)  {   /*=================*/   /* Deffacts Header */   /*=================*/   fprintf(theFile,"{");   ConstructHeaderToCode(theEnv,theFile,&theDeffacts->header,imageID,maxIndices,                         moduleCount,ModulePrefix(DeffactsData(theEnv)->DeffactsCodeItem),                         ConstructPrefix(DeffactsData(theEnv)->DeffactsCodeItem));   fprintf(theFile,",");   /*=============*/   /* Assert List */   /*=============*/   ExpressionToCode(theEnv,theFile,theDeffacts->assertList);   fprintf(theFile,"}");  }/**************************************************************//* DeffactsCModuleReference: Writes the C code representation *//*   of a reference to a deffacts module data structure.      *//**************************************************************/globle void DeffactsCModuleReference(  void *theEnv,  FILE *theFile,  int count,  int imageID,  int maxIndices)  {   fprintf(theFile,"MIHS &%s%d_%d[%d]",                      ModulePrefix(DeffactsData(theEnv)->DeffactsCodeItem),                      imageID,                      (count / maxIndices) + 1,                      (count % maxIndices));  }#endif /* DEFFACTS_CONSTRUCT && CONSTRUCT_COMPILER && (! RUN_TIME) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -