📄 dffctcmp.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 + -