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

📄 strngrtr.c

📁 NASA 开发使用的一个专家系统
💻 C
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.05  04/09/97            */   /*                                                     */   /*              STRING I/O ROUTER MODULE               */   /*******************************************************//*************************************************************//* Purpose: I/O Router routines which allow strings to be    *//*   used as input and output sources.                       *//*                                                           *//* Principal Programmer(s):                                  *//*      Gary D. Riley                                        *//*                                                           *//* Contributing Programmer(s):                               *//*      Brian L. Donnell                                     *//*                                                           *//* Revision History:                                         *//*                                                           *//*************************************************************/#define _STRNGRTR_SOURCE_#include <stdio.h>#define _CLIPS_STDIO_#include <string.h>#include "setup.h"#include "constant.h"#include "clipsmem.h"#include "router.h"#include "strngrtr.h"#define READ_STRING 0#define WRITE_STRING 1struct stringRouter  {   char *name;   char *str;   int currentPosition;   int maximumPosition;   int readWriteType;   struct stringRouter *next;  };/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/#if ANSI_COMPILER   static int                     FindString(char *);   static int                     PrintString(char *,char *);   static int                     GetcString(char *);   static int                     UngetcString(int,char *);   static struct stringRouter    *FindStringRouter(char *);   static int                     CreateReadStringSource(char *,char *,int,int);#else   static int                     FindString();   static int                     PrintString();   static int                     GetcString();   static int                     UngetcString();   static struct stringRouter    *FindStringRouter();   static int                     CreateReadStringSource();#endif/***************************************//* LOCAL INTERNAL VARIABLE DEFINITIONS *//***************************************/   static struct stringRouter *ListOfStringRouters = NULL;/**********************************************************//* InitializeStringRouter: Initializes string I/O router. *//**********************************************************/globle VOID InitializeStringRouter()  {   AddRouter("string",0,FindString,PrintString,GetcString,UngetcString,NULL);  }/*************************************************************//* FindString: Find routine for string router logical names. *//*************************************************************/static int FindString(fileid)  char *fileid;  {   struct stringRouter *head;   head = ListOfStringRouters;   while (head != NULL)     {      if (strcmp(head->name,fileid) == 0)        { return(CLIPS_TRUE); }      head = head->next;     }   return(CLIPS_FALSE);  }/**************************************************//* PrintString: Print routine for string routers. *//**************************************************/static int PrintString(logicalName,str)  char *logicalName, *str;  {   struct stringRouter *head;   head = FindStringRouter(logicalName);   if (head == NULL)     {      CLIPSSystemError("ROUTER",3);      ExitCLIPS(5);     }   if (head->readWriteType != WRITE_STRING) return(1);   if (head->currentPosition >= (head->maximumPosition - 1)) return(1);   strncpy(&head->str[head->currentPosition],           str,(CLIPS_STD_SIZE) (head->maximumPosition - head->currentPosition) - 1);   head->currentPosition += strlen(str);   return(1);  }/************************************************//* GetcString: Getc routine for string routers. *//************************************************/static int GetcString(logicalName)  char *logicalName;  {   struct stringRouter *head;   int rc;   head = FindStringRouter(logicalName);   if (head == NULL)     {      CLIPSSystemError("ROUTER",1);      ExitCLIPS(5);     }   if (head->readWriteType != READ_STRING) return(EOF);   if (head->currentPosition >= head->maximumPosition)     {      head->currentPosition++;      return(EOF);     }   rc = head->str[head->currentPosition];   head->currentPosition++;   return(rc);  }/****************************************************//* UngetcString: Ungetc routine for string routers. *//****************************************************/#if IBM_TBC#pragma argsused#endifstatic int UngetcString(ch,logicalName)  int ch;  char *logicalName;  {   struct stringRouter *head;#if MAC_MPW || MAC_MCW#pragma unused(ch)#endif   head = FindStringRouter(logicalName);   if (head == NULL)     {      CLIPSSystemError("ROUTER",2);      ExitCLIPS(5);     }   if (head->readWriteType != READ_STRING) return(0);   if (head->currentPosition > 0)     { head->currentPosition--; }   return(1);  }/************************************************//* OpenStringSource: Opens a new string router. *//************************************************/globle int OpenStringSource(name,str,currentPosition)  char *name;  char *str;  int currentPosition;  {   int maximumPosition;   if (str == NULL)     {      currentPosition = 0;      maximumPosition = 0;     }   else     { maximumPosition = strlen(str); }   return(CreateReadStringSource(name,str,currentPosition,maximumPosition));  }/******************************************************//* OpenTextSource: Opens a new string router for text *//*   (which is not NULL terminated).                  *//******************************************************/globle int OpenTextSource(name,str,currentPosition,maximumPosition)  char *name;  char *str;  int currentPosition;  int maximumPosition;  {   if (str == NULL)     {      currentPosition = 0;      maximumPosition = 0;     }   return(CreateReadStringSource(name,str,currentPosition,maximumPosition));  }/******************************************************************//* CreateReadStringSource: Creates a new string router for input. *//******************************************************************/static int CreateReadStringSource(name,str,currentPosition,maximumPosition)  char *name;  char *str;  int currentPosition;  int maximumPosition;  {   struct stringRouter *newStringRouter;   if (FindStringRouter(name) != NULL) return(0);   newStringRouter = get_struct(stringRouter);   newStringRouter->name = (char *) gm1((int) strlen(name) + 1);   strcpy(newStringRouter->name,name);   newStringRouter->str = str;   newStringRouter->currentPosition = currentPosition;   newStringRouter->readWriteType = READ_STRING;   newStringRouter->maximumPosition = maximumPosition;   newStringRouter->next = ListOfStringRouters;   ListOfStringRouters = newStringRouter;   return(1);  }/**********************************************//* CloseStringSource: Closes a string router. *//**********************************************/globle int CloseStringSource(name)  char *name;  {   struct stringRouter *head, *last;   last = NULL;   head = ListOfStringRouters;   while (head != NULL)     {      if (strcmp(head->name,name) == 0)        {         if (last == NULL)           {            ListOfStringRouters = head->next;            rm(head->name,(int) strlen(head->name) + 1);            rtn_struct(stringRouter,head);            return(1);           }         else           {            last->next = head->next;            rm(head->name,(int) strlen(head->name) + 1);            rtn_struct(stringRouter,head);            return(1);           }        }      last = head;      head = head->next;     }   return(0);  }/******************************************************************//* OpenStringDestination: Opens a new string router for printing. *//******************************************************************/globle int OpenStringDestination(name,str,maximumPosition)  char *name;  char *str;  int maximumPosition;  {   struct stringRouter *newStringRouter;   if (FindStringRouter(name) != NULL) return(0);   newStringRouter = get_struct(stringRouter);   newStringRouter->name = (char *) gm1((int) strlen(name) + 1);   strcpy(newStringRouter->name,name);   newStringRouter->str = str;   newStringRouter->currentPosition = 0;   newStringRouter->readWriteType = WRITE_STRING;   newStringRouter->maximumPosition = maximumPosition;   newStringRouter->next = ListOfStringRouters;   ListOfStringRouters = newStringRouter;   return(1);  }/***************************************************//* CloseStringDestination: Closes a string router. *//***************************************************/globle int CloseStringDestination(name)  char *name;  {   return(CloseStringSource(name));  }/*******************************************************************//* FindStringRouter: Returns a pointer to the named string router. *//*******************************************************************/static struct stringRouter *FindStringRouter(name)  char *name;  {   struct stringRouter *head;   head = ListOfStringRouters;   while (head != NULL)     {      if (strcmp(head->name,name) == 0)        { return(head); }      head = head->next;     }   return(NULL);  }

⌨️ 快捷键说明

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