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

📄 modulcmp.c

📁 NASA 开发使用的一个专家系统
💻 C
📖 第 1 页 / 共 2 页
字号:
   /*******************************************************/   /*      "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 + -