📄 globlcmp.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.22 06/15/04 */ /* */ /* DEFGLOBAL CONSTRUCTS-TO-C MODULE */ /*******************************************************//*************************************************************//* Purpose: Implements the constructs-to-c feature for the *//* defglobal construct. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* Brian L. Donnell *//* *//* Revision History: *//* *//*************************************************************/#define _GLOBLCMP_SOURCE_#include "setup.h"#if DEFGLOBAL_CONSTRUCT && CONSTRUCT_COMPILER && (! RUN_TIME)#include <stdio.h>#define _STDIO_INCLUDED_#include "conscomp.h"#include "globldef.h"#include "envrnmnt.h"#include "globlcmp.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/ static int ConstructToCode(void *,char *,int,FILE *,int,int); static void DefglobalToCode(void *,FILE *,struct defglobal *, int,int,int); static void DefglobalModuleToCode(void *,FILE *,struct defmodule *,int,int,int); static void CloseDefglobalFiles(void *,FILE *,FILE *,int); static void BeforeDefglobalsToCode(void *); static void InitDefglobalsCode(void *,FILE *,int,int);/***************************************************************//* DefglobalCompilerSetup: Initializes the defglobal construct *//* for use with the constructs-to-c command. *//***************************************************************/globle void DefglobalCompilerSetup( void *theEnv) { DefglobalData(theEnv)->DefglobalCodeItem = AddCodeGeneratorItem(theEnv,"defglobal",0,BeforeDefglobalsToCode, InitDefglobalsCode,ConstructToCode,2); }/**************************************************************//* BeforeDefglobalsToCode: Assigns each defglobal a unique ID *//* which will be used for pointer references when the data *//* structures are written to a file as C code *//**************************************************************/static void BeforeDefglobalsToCode( void *theEnv) { MarkConstructBsaveIDs(theEnv,DefglobalData(theEnv)->DefglobalModuleIndex); }/*************************************************//* InitDefglobalsCode: Writes out initialization *//* code for defglobals for a run-time module. *//*************************************************/#if IBM_TBC#pragma argsused#endifstatic void InitDefglobalsCode( void *theEnv, FILE *initFP, int imageID, int maxIndices) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(maxIndices)#pragma unused(imageID)#pragma unused(theEnv)#endif fprintf(initFP," ResetDefglobals(theEnv);\n"); }/***********************************************************//* ConstructToCode: Produces defglobal 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 defglobal *theDefglobal; int moduleCount = 0, moduleArrayCount = 0, moduleArrayVersion = 1; int defglobalArrayCount = 0, defglobalArrayVersion = 1; FILE *moduleFile = NULL, *defglobalFile = NULL; /*================================================*/ /* Include the appropriate defglobal header file. */ /*================================================*/ fprintf(headerFP,"#include \"globldef.h\"\n"); /*===================================================================*/ /* Loop through all the modules and all the defglobals 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 defglobalModule",ModulePrefix(DefglobalData(theEnv)->DefglobalCodeItem), FALSE,NULL); if (moduleFile == NULL) { CloseDefglobalFiles(theEnv,moduleFile,defglobalFile,maxIndices); return(0); } DefglobalModuleToCode(theEnv,moduleFile,theModule,imageID,maxIndices,moduleCount); moduleFile = CloseFileIfNeeded(theEnv,moduleFile,&moduleArrayCount,&moduleArrayVersion, maxIndices,NULL,NULL); for (theDefglobal = (struct defglobal *) EnvGetNextDefglobal(theEnv,NULL); theDefglobal != NULL; theDefglobal = (struct defglobal *) EnvGetNextDefglobal(theEnv,theDefglobal)) { defglobalFile = OpenFileIfNeeded(theEnv,defglobalFile,fileName,fileID,imageID,&fileCount, defglobalArrayVersion,headerFP, "struct defglobal",ConstructPrefix(DefglobalData(theEnv)->DefglobalCodeItem), FALSE,NULL); if (defglobalFile == NULL) { CloseDefglobalFiles(theEnv,moduleFile,defglobalFile,maxIndices); return(0); } DefglobalToCode(theEnv,defglobalFile,theDefglobal,imageID,maxIndices,moduleCount); defglobalArrayCount++; defglobalFile = CloseFileIfNeeded(theEnv,defglobalFile,&defglobalArrayCount, &defglobalArrayVersion,maxIndices,NULL,NULL); } moduleCount++; moduleArrayCount++; } CloseDefglobalFiles(theEnv,moduleFile,defglobalFile,maxIndices); return(1); }/**********************************************************//* CloseDefglobalFiles: Closes all of the C files created *//* for defglobals. Called when an error occurs or when *//* the defglobals have all been written to the files. *//**********************************************************/static void CloseDefglobalFiles( void *theEnv, FILE *moduleFile, FILE *defglobalFile, int maxIndices) { int count = maxIndices; int arrayVersion = 0; if (defglobalFile != NULL) { count = maxIndices; CloseFileIfNeeded(theEnv,defglobalFile,&count,&arrayVersion,maxIndices,NULL,NULL); } if (moduleFile != NULL) { count = maxIndices; CloseFileIfNeeded(theEnv,moduleFile,&count,&arrayVersion,maxIndices,NULL,NULL); } }/***********************************************************//* DefglobalModuleToCode: Writes the C code representation *//* of a single defglobal module to the specified file. *//***********************************************************/#if IBM_TBC#pragma argsused#endifstatic void DefglobalModuleToCode( 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, DefglobalData(theEnv)->DefglobalModuleIndex,ConstructPrefix(DefglobalData(theEnv)->DefglobalCodeItem)); fprintf(theFile,"}"); }/**********************************************************//* DefglobalToCode: Writes the C code representation of a *//* single defglobal construct to the specified file. *//**********************************************************/static void DefglobalToCode( void *theEnv, FILE *theFile, struct defglobal *theDefglobal, int imageID, int maxIndices, int moduleCount) { /*==================*/ /* Defglobal Header */ /*==================*/ fprintf(theFile,"{"); ConstructHeaderToCode(theEnv,theFile,&theDefglobal->header,imageID,maxIndices, moduleCount,ModulePrefix(DefglobalData(theEnv)->DefglobalCodeItem), ConstructPrefix(DefglobalData(theEnv)->DefglobalCodeItem)); fprintf(theFile,","); /*============================================*/ /* Watch Flag, In Scope Flag, and Busy Count. */ /*============================================*/ fprintf(theFile,"0,0,%ld,",theDefglobal->busyCount); /*================*/ /* Current Value. */ /*================*/ fprintf(theFile,"{NULL,RVOID}"); /*=====================*/ /* Initial Expression. */ /*=====================*/ fprintf(theFile,","); PrintHashedExpressionReference(theEnv,theFile,theDefglobal->initial,imageID,maxIndices); fprintf(theFile,"}"); }/***************************************************************//* DefglobalCModuleReference: Writes the C code representation *//* of a reference to a defglobal module data structure. *//***************************************************************/globle void DefglobalCModuleReference( void *theEnv, FILE *theFile, int count, int imageID, int maxIndices) { fprintf(theFile,"MIHS &%s%d_%d[%d]", ModulePrefix(DefglobalData(theEnv)->DefglobalCodeItem), imageID, (count / maxIndices) + 1, (count % maxIndices)); }/******************************************************************//* DefglobalCConstructReference: Writes the C code representation *//* of a reference to a defglobal data structure. *//******************************************************************/globle void DefglobalCConstructReference( void *theEnv, FILE *theFile, void *vTheGlobal, int imageID, int maxIndices) { struct defglobal *theGlobal = (struct defglobal *) vTheGlobal; if (theGlobal == NULL) { fprintf(theFile,"NULL"); } else { fprintf(theFile,"&%s%d_%ld[%ld]",ConstructPrefix(DefglobalData(theEnv)->DefglobalCodeItem), imageID, (theGlobal->header.bsaveID / maxIndices) + 1, theGlobal->header.bsaveID % maxIndices); } }#endif /* DEFGLOBAL_CONSTRUCT && CONSTRUCT_COMPILER && (! RUN_TIME) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -