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

📄 strngrtr.c

📁 clips源代码
💻 C
字号:
   /*******************************************************/   /*      "C" Language Integrated Production System      */   /*                                                     */   /*             CLIPS Version 6.22  06/15/04            */   /*                                                     */   /*              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 _STDIO_INCLUDED_#include <stdlib.h>#include <string.h>#include "setup.h"#include "constant.h"#include "envrnmnt.h"#include "memalloc.h"#include "router.h"#include "sysdep.h"#include "strngrtr.h"#define READ_STRING 0#define WRITE_STRING 1/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/   static int                     FindString(void *,char *);   static int                     PrintString(void *,char *,char *);   static int                     GetcString(void *,char *);   static int                     UngetcString(void *,int,char *);   static struct stringRouter    *FindStringRouter(void *,char *);   static int                     CreateReadStringSource(void *,char *,char *,size_t,size_t);   static void                    DeallocateStringRouterData(void *);/**********************************************************//* InitializeStringRouter: Initializes string I/O router. *//**********************************************************/globle void InitializeStringRouter(  void *theEnv)  {   AllocateEnvironmentData(theEnv,STRING_ROUTER_DATA,sizeof(struct stringRouterData),DeallocateStringRouterData);   EnvAddRouter(theEnv,"string",0,FindString,PrintString,GetcString,UngetcString,NULL);  }  /*******************************************//* DeallocateStringRouterData: Deallocates *//*    environment data for string routers. *//*******************************************/static void DeallocateStringRouterData(  void *theEnv)  {   struct stringRouter *tmpPtr, *nextPtr;      tmpPtr = StringRouterData(theEnv)->ListOfStringRouters;   while (tmpPtr != NULL)     {      nextPtr = tmpPtr->next;      rm(theEnv,tmpPtr->name,strlen(tmpPtr->name) + 1);      rtn_struct(theEnv,stringRouter,tmpPtr);      tmpPtr = nextPtr;     }  }/*************************************************************//* FindString: Find routine for string router logical names. *//*************************************************************/static int FindString(  void *theEnv,  char *fileid)  {   struct stringRouter *head;   head = StringRouterData(theEnv)->ListOfStringRouters;   while (head != NULL)     {      if (strcmp(head->name,fileid) == 0)        { return(TRUE); }      head = head->next;     }   return(FALSE);  }/**************************************************//* PrintString: Print routine for string routers. *//**************************************************/static int PrintString(  void *theEnv,  char *logicalName,  char *str)  {   struct stringRouter *head;   head = FindStringRouter(theEnv,logicalName);   if (head == NULL)     {      SystemError(theEnv,"ROUTER",3);      EnvExitRouter(theEnv,EXIT_FAILURE);     }   if (head->readWriteType != WRITE_STRING) return(1);      if (head->maximumPosition == 0) return(1);      if ((head->currentPosition + 1) >= head->maximumPosition) return(1);   genstrncpy(&head->str[head->currentPosition],              str,(STD_SIZE) (head->maximumPosition - head->currentPosition) - 1);   head->currentPosition += strlen(str);      return(1);  }/************************************************//* GetcString: Getc routine for string routers. *//************************************************/static int GetcString(  void *theEnv,  char *logicalName)  {   struct stringRouter *head;   int rc;   head = FindStringRouter(theEnv,logicalName);   if (head == NULL)     {      SystemError(theEnv,"ROUTER",1);      EnvExitRouter(theEnv,EXIT_FAILURE);     }   if (head->readWriteType != READ_STRING) return(EOF);   if (head->currentPosition >= head->maximumPosition)     {      head->currentPosition++;      return(EOF);     }   rc = (unsigned char) head->str[head->currentPosition];   head->currentPosition++;   return(rc);  }/****************************************************//* UngetcString: Ungetc routine for string routers. *//****************************************************/#if IBM_TBC#pragma argsused#endifstatic int UngetcString(  void *theEnv,  int ch,  char *logicalName)  {   struct stringRouter *head;#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(ch)#endif   head = FindStringRouter(theEnv,logicalName);   if (head == NULL)     {      SystemError(theEnv,"ROUTER",2);      EnvExitRouter(theEnv,EXIT_FAILURE);     }   if (head->readWriteType != READ_STRING) return(0);   if (head->currentPosition > 0)     { head->currentPosition--; }   return(1);  }/************************************************//* OpenStringSource: Opens a new string router. *//************************************************/globle int OpenStringSource(  void *theEnv,  char *name,  char *str,  size_t currentPosition)  {   size_t maximumPosition;   if (str == NULL)     {      currentPosition = 0;      maximumPosition = 0;     }   else     { maximumPosition = strlen(str); }   return(CreateReadStringSource(theEnv,name,str,currentPosition,maximumPosition));  }/******************************************************//* OpenTextSource: Opens a new string router for text *//*   (which is not NULL terminated).                  *//******************************************************/globle int OpenTextSource(  void *theEnv,  char *name,  char *str,  size_t currentPosition,  size_t maximumPosition)  {   if (str == NULL)     {      currentPosition = 0;      maximumPosition = 0;     }   return(CreateReadStringSource(theEnv,name,str,currentPosition,maximumPosition));  }/******************************************************************//* CreateReadStringSource: Creates a new string router for input. *//******************************************************************/static int CreateReadStringSource(  void *theEnv,  char *name,  char *str,  size_t currentPosition,  size_t maximumPosition)  {   struct stringRouter *newStringRouter;   if (FindStringRouter(theEnv,name) != NULL) return(0);   newStringRouter = get_struct(theEnv,stringRouter);   newStringRouter->name = (char *) gm1(theEnv,strlen(name) + 1);   genstrcpy(newStringRouter->name,name);   newStringRouter->str = str;   newStringRouter->currentPosition = currentPosition;   newStringRouter->readWriteType = READ_STRING;   newStringRouter->maximumPosition = maximumPosition;   newStringRouter->next = StringRouterData(theEnv)->ListOfStringRouters;   StringRouterData(theEnv)->ListOfStringRouters = newStringRouter;   return(1);  }/**********************************************//* CloseStringSource: Closes a string router. *//**********************************************/globle int CloseStringSource(  void *theEnv,  char *name)  {   struct stringRouter *head, *last;   last = NULL;   head = StringRouterData(theEnv)->ListOfStringRouters;   while (head != NULL)     {      if (strcmp(head->name,name) == 0)        {         if (last == NULL)           {            StringRouterData(theEnv)->ListOfStringRouters = head->next;            rm(theEnv,head->name,strlen(head->name) + 1);            rtn_struct(theEnv,stringRouter,head);            return(1);           }         else           {            last->next = head->next;            rm(theEnv,head->name,strlen(head->name) + 1);            rtn_struct(theEnv,stringRouter,head);            return(1);           }        }      last = head;      head = head->next;     }   return(0);  }/******************************************************************//* OpenStringDestination: Opens a new string router for printing. *//******************************************************************/globle int OpenStringDestination(  void *theEnv,  char *name,  char *str,  size_t maximumPosition)  {   struct stringRouter *newStringRouter;   if (FindStringRouter(theEnv,name) != NULL) return(0);   newStringRouter = get_struct(theEnv,stringRouter);   newStringRouter->name = (char *) gm1(theEnv,(int) strlen(name) + 1);   genstrcpy(newStringRouter->name,name);   newStringRouter->str = str;   newStringRouter->currentPosition = 0;   newStringRouter->readWriteType = WRITE_STRING;   newStringRouter->maximumPosition = maximumPosition;   newStringRouter->next = StringRouterData(theEnv)->ListOfStringRouters;   StringRouterData(theEnv)->ListOfStringRouters = newStringRouter;   return(1);  }/***************************************************//* CloseStringDestination: Closes a string router. *//***************************************************/globle int CloseStringDestination(  void *theEnv,  char *name)  {   return(CloseStringSource(theEnv,name));  }/*******************************************************************//* FindStringRouter: Returns a pointer to the named string router. *//*******************************************************************/static struct stringRouter *FindStringRouter(  void *theEnv,  char *name)  {   struct stringRouter *head;   head = StringRouterData(theEnv)->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 + -