📄 router.c
字号:
}
currentPtr = nextPtr;
}
if (RouterData(theEnv)->Abort) return;
genexit(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;
theEnv = GetCurrentEnvironment();
newPtr = get_struct(theEnv,router);
newPtr->name = routerName;
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;
newPtr = get_struct(theEnv,router);
newPtr->name = routerName;
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)
{
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. */
/*=========================================*/
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 *) genlongalloc(theEnv,length+1);
strncpy(tempStr,str,length);
tempStr[length] = 0;
rv = EnvPrintRouter(theEnv,logicalName,tempStr);
genlongfree(theEnv,tempStr,length+1);
return(rv);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -