📄 modulcmp.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.05 04/09/97 */ /* */ /* DEFMODULE CONSTRUCTS-TO-C MODULE */ /*******************************************************//*************************************************************//* Purpose: Implements the constructs-to-c feature for the *//* defmodule construct. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* *//* Revision History: *//* *//*************************************************************/#define _MODULCMP_SOURCE_#include "setup.h"#if CONSTRUCT_COMPILER && (! RUN_TIME)#include <stdio.h>#define _CLIPS_STDIO_#include "conscomp.h"#include "moduldef.h"#include "modulcmp.h"/***************//* DEFINITIONS *//***************/#define ItemPrefix() ArbitraryPrefix(DefmoduleCodeItem,0)#define DefmodulePrefix() ArbitraryPrefix(DefmoduleCodeItem,1)#define PortPrefix() ArbitraryPrefix(DefmoduleCodeItem,2)/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if ANSI_COMPILER static int ConstructToCode(char *,int,FILE *,int,int); static VOID InitDefmoduleCode(FILE *,int,int); static struct portItem *GetNextPortItem(struct defmodule **,struct portItem **, int *,int *); static int PortItemsToCode(char *,int,FILE *,int,int,int *); static VOID BeforeDefmodulesToCode(void);#else static int ConstructToCode(); static VOID InitDefmoduleCode(); static struct portItem *GetNextPortItem(); static int PortItemsToCode(); static VOID BeforeDefmodulesToCode();#endif/***************************************//* LOCAL INTERNAL VARIABLE DEFINITIONS *//***************************************/ static struct CodeGeneratorItem *DefmoduleCodeItem;/***************************************************************//* DefmoduleCompilerSetup: Initializes the defmodule construct *//* for use with the constructs-to-c command. *//***************************************************************/globle VOID DefmoduleCompilerSetup() { DefmoduleCodeItem = AddCodeGeneratorItem("defmodule",200,BeforeDefmodulesToCode, InitDefmoduleCode,ConstructToCode,3); } /***********************************************************//* BeforeDefmodulesToCode: Assigns each defmodule a unique *//* ID which will be used for pointer references when the *//* data structures are written to a file as C code *//***********************************************************/ static VOID BeforeDefmodulesToCode() { int value = 0; struct defmodule *theModule; for (theModule = (struct defmodule *) GetNextDefmodule(NULL); theModule != NULL; theModule = (struct defmodule *) GetNextDefmodule(theModule)) { theModule->bsaveID = value++; } }/*************************************************************//* PrintDefmoduleReference: Writes the C code representation *//* of a reference to a defmodule data structure. *//*************************************************************/globle VOID PrintDefmoduleReference(theFile,theModule) FILE *theFile; struct defmodule *theModule; { if (theModule == NULL) fprintf(theFile,"NULL"); else fprintf(theFile,"&%s%d_%ld[%ld]",DefmodulePrefix(),ImageID, (long) ((theModule->bsaveID / MaxIndices) + 1), (long) (theModule->bsaveID % MaxIndices)); } /************************************************//* InitDefmoduleCode: Writes out initialization *//* code for defmodules for a run-time module. *//************************************************/#if IBM_TBC#pragma argsused#endifstatic VOID InitDefmoduleCode(initFP,imageID,maxIndices) FILE *initFP; int imageID; int maxIndices; {#if MAC_MPW || MAC_MCW#pragma unused(maxIndices)#endif if (GetNextDefmodule(NULL) != NULL) { fprintf(initFP," SetListOfDefmodules((VOID *) %s%d_1);\n",DefmodulePrefix(),imageID); } else { fprintf(initFP," SetListOfDefmodules(NULL);\n"); } fprintf(initFP," SetCurrentModule((VOID *) GetNextDefmodule(NULL));\n"); } /***********************************************************//* ConstructToCode: Produces defmodule code for a run-time *//* module created using the constructs-to-c function. *//***********************************************************/static int ConstructToCode(fileName,fileID,headerFP,imageID,maxIndices) char *fileName; int fileID; FILE *headerFP; int imageID; int maxIndices; { struct defmodule *theConstruct; FILE *moduleFile = NULL, *itemsFile; int portItemCount = 0; struct portItem *portItemPtr; int mihCount = 0, moduleCount = 0; int j; struct moduleItem *theItem; int moduleArrayVersion = 1; int fileCount = 2; /*================================================*/ /* Include the appropriate defmodule header file. */ /*================================================*/ fprintf(headerFP,"#include \"moduldef.h\"\n"); /*============================================*/ /* Open up the items file for the defmodules. */ /* Only one file of this type is created so */ /* the maximum number of indices is ignored. */ /*============================================*/ if ((itemsFile = NewCFile(fileName,fileID,1,CLIPS_FALSE)) == NULL) { return(CLIPS_FALSE); } fprintf(itemsFile,"struct defmoduleItemHeader *%s%d_%d[] = {\n",ItemPrefix(),imageID,1); fprintf(headerFP,"extern struct defmoduleItemHeader *%s%d_%d[];\n",ItemPrefix(),imageID,1); /*======================================================*/ /* Loop through all the defmodules writing their C code */ /* representation to the file as they are traversed. */ /*======================================================*/ for (theConstruct = (struct defmodule *) GetNextDefmodule(NULL); theConstruct != NULL; theConstruct = (struct defmodule *) GetNextDefmodule(theConstruct)) { /*===========================================*/ /* Open a new file to write to if necessary. */ /*===========================================*/ moduleFile = OpenFileIfNeeded(moduleFile,fileName,fileID,imageID, &fileCount,moduleArrayVersion,headerFP, "struct defmodule",DefmodulePrefix(), CLIPS_FALSE,NULL); if (moduleFile == NULL) { moduleCount = maxIndices; CloseFileIfNeeded(moduleFile,&moduleCount, &moduleArrayVersion,maxIndices,NULL,NULL); fclose(itemsFile); return(CLIPS_FALSE); } /*======================================*/ /* Write the construct name and ppform. */ /*======================================*/ fprintf(moduleFile,"{"); PrintSymbolReference(moduleFile,theConstruct->name); fprintf(moduleFile,",NULL,"); /*=====================================================*/ /* Write the items array pointers to other constructs. */ /*=====================================================*/ fprintf(moduleFile,"&%s%d_1[%d],",ItemPrefix(),imageID,mihCount); for (j = 0, theItem = GetListOfModuleItems(); (j < GetNumberOfModuleItems()) && (theItem != NULL) ; j++, theItem = theItem->next) { mihCount++; if (theItem->constructsToCModuleReference == NULL) { fprintf(itemsFile,"NULL"); } else { (*theItem->constructsToCModuleReference)(itemsFile,(int) theConstruct->bsaveID,imageID,maxIndices); } if ((j + 1) < GetNumberOfModuleItems()) fprintf(itemsFile,","); else if (theConstruct->next != NULL) fprintf(itemsFile,",\n"); } /*=================================*/ /* Write the importList reference. */ /*=================================*/ if (theConstruct->importList == NULL) { fprintf(moduleFile,"NULL,"); } else { fprintf(moduleFile,"&%s%d_%d[%d],",PortPrefix(),imageID, (portItemCount / maxIndices) + 1, portItemCount % maxIndices); for (portItemPtr = theConstruct->importList; portItemPtr != NULL; portItemPtr = portItemPtr->next) { portItemCount++; } } /*=================================*/ /* Write the exportList reference. */ /*=================================*/ if (theConstruct->exportList == NULL) { fprintf(moduleFile,"NULL,"); } else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -