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

📄 router.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
     }   if (RouterData(theEnv)->Abort) return;   genexit(theEnv,num);  }/********************************************//* AbortExit: Forces ExitRouter to terminate *//*   after calling all closing routers.     *//********************************************/globle void AbortExit(  void *theEnv)  {   RouterData(theEnv)->Abort = TRUE;  }#if (! ENVIRONMENT_API_ONLY) && ALLOW_ENVIRONMENT_GLOBALS/*********************************************************//* AddRouter: Adds an I/O router to the list of routers. *//*********************************************************/globle intBool AddRouter(  char *routerName,  int priority,  int (*queryFunction)(char *),  int (*printFunction)(char *,char *),  int (*getcFunction)(char *),  int (*ungetcFunction)(int,char *),  int (*exitFunction)(int))  {   struct router *newPtr, *lastPtr, *currentPtr;   void *theEnv;   char *nameCopy;         theEnv = GetCurrentEnvironment();   newPtr = get_struct(theEnv,router);   nameCopy = (char *) genalloc(theEnv,strlen(routerName) + 1);   genstrcpy(nameCopy,routerName);        newPtr->name = nameCopy;         newPtr->active = TRUE;   newPtr->environmentAware = FALSE;   newPtr->priority = priority;   newPtr->context = NULL;   newPtr->query = (int (*)(void *,char *)) queryFunction;   newPtr->printer = (int (*)(void *,char *,char *)) printFunction;   newPtr->exiter = (int (*)(void *,int)) exitFunction;   newPtr->charget = (int (*)(void *,char *)) getcFunction;   newPtr->charunget = (int (*)(void *,int,char *)) ungetcFunction;   newPtr->next = NULL;   if (RouterData(theEnv)->ListOfRouters == NULL)     {      RouterData(theEnv)->ListOfRouters = newPtr;      return(1);     }   lastPtr = NULL;   currentPtr = RouterData(theEnv)->ListOfRouters;   while ((currentPtr != NULL) ? (priority < currentPtr->priority) : FALSE)     {      lastPtr = currentPtr;      currentPtr = currentPtr->next;     }   if (lastPtr == NULL)     {      newPtr->next = RouterData(theEnv)->ListOfRouters;      RouterData(theEnv)->ListOfRouters = newPtr;     }   else     {      newPtr->next = currentPtr;      lastPtr->next = newPtr;     }   return(1);  }#endif/************************************************************//* EnvAddRouter: Adds an I/O router to the list of routers. *//************************************************************/globle intBool EnvAddRouter(  void *theEnv,  char *routerName,  int priority,  int (*queryFunction)(void *,char *),  int (*printFunction)(void *,char *,char *),  int (*getcFunction)(void *,char *),  int (*ungetcFunction)(void *,int,char *),  int (*exitFunction)(void *,int))  {   return EnvAddRouterWithContext(theEnv,routerName,priority,                                  queryFunction,printFunction,getcFunction,                                  ungetcFunction,exitFunction,NULL);  }/***********************************************************************//* EnvAddRouterWithContext: Adds an I/O router to the list of routers. *//***********************************************************************/globle intBool EnvAddRouterWithContext(  void *theEnv,  char *routerName,  int priority,  int (*queryFunction)(void *,char *),  int (*printFunction)(void *,char *,char *),  int (*getcFunction)(void *,char *),  int (*ungetcFunction)(void *,int,char *),  int (*exitFunction)(void *,int),  void *context)  {   struct router *newPtr, *lastPtr, *currentPtr;   char  *nameCopy;   newPtr = get_struct(theEnv,router);   nameCopy = (char *) genalloc(theEnv,strlen(routerName) + 1);   genstrcpy(nameCopy,routerName);        newPtr->name = nameCopy;   newPtr->active = TRUE;   newPtr->environmentAware = TRUE;   newPtr->context = context;   newPtr->priority = priority;   newPtr->query = queryFunction;   newPtr->printer = printFunction;   newPtr->exiter = exitFunction;   newPtr->charget = getcFunction;   newPtr->charunget = ungetcFunction;   newPtr->next = NULL;   if (RouterData(theEnv)->ListOfRouters == NULL)     {      RouterData(theEnv)->ListOfRouters = newPtr;      return(1);     }   lastPtr = NULL;   currentPtr = RouterData(theEnv)->ListOfRouters;   while ((currentPtr != NULL) ? (priority < currentPtr->priority) : FALSE)     {      lastPtr = currentPtr;      currentPtr = currentPtr->next;     }   if (lastPtr == NULL)     {      newPtr->next = RouterData(theEnv)->ListOfRouters;      RouterData(theEnv)->ListOfRouters = newPtr;     }   else     {      newPtr->next = currentPtr;      lastPtr->next = newPtr;     }   return(1);  }/*****************************************************************//* EnvDeleteRouter: Removes an I/O router from the list of routers. *//*****************************************************************/globle int EnvDeleteRouter(  void *theEnv,  char *routerName)  {   struct router *currentPtr, *lastPtr;   currentPtr = RouterData(theEnv)->ListOfRouters;   lastPtr = NULL;   while (currentPtr != NULL)     {      if (strcmp(currentPtr->name,routerName) == 0)        {         genfree(theEnv,currentPtr->name,strlen(currentPtr->name) + 1);         if (lastPtr == NULL)           {            RouterData(theEnv)->ListOfRouters = currentPtr->next;            rm(theEnv,currentPtr,(int) sizeof(struct router));            return(1);           }         lastPtr->next = currentPtr->next;         rm(theEnv,currentPtr,(int) sizeof(struct router));         return(1);        }      lastPtr = currentPtr;      currentPtr = currentPtr->next;     }   return(0);  }/*********************************************************************//* QueryRouters: Determines if any router recognizes a logical name. *//*********************************************************************/globle int QueryRouters(  void *theEnv,  char *logicalName)  {   struct router *currentPtr;   currentPtr = RouterData(theEnv)->ListOfRouters;   while (currentPtr != NULL)     {      if (QueryRouter(theEnv,logicalName,currentPtr) == TRUE) return(TRUE);      currentPtr = currentPtr->next;     }   return(FALSE);  }/************************************************//* QueryRouter: Determines if a specific router *//*    recognizes a logical name.                *//************************************************/static int QueryRouter(  void *theEnv,  char *logicalName,  struct router *currentPtr)  {   /*===================================================*/   /* If the router is inactive, then it can't respond. */   /*===================================================*/   if (currentPtr->active == FALSE)     { return(FALSE); }   /*=============================================================*/   /* If the router has no query function, then it can't respond. */   /*=============================================================*/   if (currentPtr->query == NULL) return(FALSE);   /*=========================================*/   /* Call the router's query function to see */   /* if it recognizes the logical name.      */   /*=========================================*/      SetEnvironmentRouterContext(theEnv,currentPtr->context);   if (currentPtr->environmentAware)     {       if ((*currentPtr->query)(theEnv,logicalName) == TRUE)        { return(TRUE); }     }   else                 {       if (((int (*)(char *)) (*currentPtr->query))(logicalName) == TRUE)        { return(TRUE); }     }   return(FALSE);  }/*******************************************************//* EnvDeactivateRouter: Deactivates a specific router. *//*******************************************************/globle int EnvDeactivateRouter(  void *theEnv,  char *routerName)  {   struct router *currentPtr;   currentPtr = RouterData(theEnv)->ListOfRouters;   while (currentPtr != NULL)     {      if (strcmp(currentPtr->name,routerName) == 0)        {         currentPtr->active = FALSE;         return(TRUE);        }      currentPtr = currentPtr->next;     }   return(FALSE);  }/***************************************************//* EnvActivateRouter: Activates a specific router. *//***************************************************/globle int EnvActivateRouter(  void *theEnv,  char *routerName)  {   struct router *currentPtr;   currentPtr = RouterData(theEnv)->ListOfRouters;   while (currentPtr != NULL)     {      if (strcmp(currentPtr->name,routerName) == 0)        {         currentPtr->active = TRUE;         return(TRUE);        }      currentPtr = currentPtr->next;     }   return(FALSE);  }/********************************************************//* SetFastLoad: Used to bypass router system for loads. *//********************************************************/globle void SetFastLoad(  void *theEnv,  FILE *filePtr)  {    RouterData(theEnv)->FastLoadFilePtr = filePtr;   }/********************************************************//* SetFastSave: Used to bypass router system for saves. *//********************************************************/globle void SetFastSave(  void *theEnv,  FILE *filePtr)  {    RouterData(theEnv)->FastSaveFilePtr = filePtr;   }/******************************************************//* GetFastLoad: Returns the "fast load" file pointer. *//******************************************************/globle FILE *GetFastLoad(  void *theEnv)  {   return(RouterData(theEnv)->FastLoadFilePtr);   }/******************************************************//* GetFastSave: Returns the "fast save" file pointer. *//******************************************************/globle FILE *GetFastSave(  void *theEnv)  {   return(RouterData(theEnv)->FastSaveFilePtr);   }/*****************************************************//* UnrecognizedRouterMessage: Standard error message *//*   for an unrecognized router name.                *//*****************************************************/globle void UnrecognizedRouterMessage(  void *theEnv,  char *logicalName)  {   PrintErrorID(theEnv,"ROUTER",1,FALSE);   EnvPrintRouter(theEnv,WERROR,"Logical name ");   EnvPrintRouter(theEnv,WERROR,logicalName);   EnvPrintRouter(theEnv,WERROR," was not recognized by any routers\n");  }/*****************************************//* PrintNRouter: Generic print function. *//*****************************************/globle int PrintNRouter(  void *theEnv,  char *logicalName,  char *str,  unsigned long length)  {   char *tempStr;   int rv;   tempStr = (char *) genalloc(theEnv,length+1);   genstrncpy(tempStr,str,length);   tempStr[length] = 0;   rv = EnvPrintRouter(theEnv,logicalName,tempStr);   genfree(theEnv,tempStr,length+1);   return(rv);  }

⌨️ 快捷键说明

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