?? router.c
字號:
} 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); }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -