envrnmnt.c
来自「clips源代码」· C语言 代码 · 共 672 行 · 第 1/2 页
C
672 行
memset(theData,0,sizeof(void *) * MAXIMUM_ENVIRONMENT_POSITIONS); theEnvironment->initialized = FALSE; theEnvironment->theData = (void **) theData; theEnvironment->next = NULL; theEnvironment->listOfCleanupEnvironmentFunctions = NULL;#if ALLOW_ENVIRONMENT_GLOBALS theEnvironment->environmentIndex = NextEnvironmentIndex++;#else theEnvironment->environmentIndex = 0;#endif theEnvironment->context = NULL; theEnvironment->routerContext = NULL; theEnvironment->functionContext = NULL; /*=============================================*/ /* Allocate storage for the cleanup functions. */ /*=============================================*/ theData = malloc(sizeof(void (*)(struct environmentData *)) * MAXIMUM_ENVIRONMENT_POSITIONS); if (theData == NULL) { free(theEnvironment->theData); free(theEnvironment); printf("\n[ENVRNMNT7] Unable to create environment data.\n"); return(NULL); } memset(theData,0,sizeof(void (*)(struct environmentData *)) * MAXIMUM_ENVIRONMENT_POSITIONS); theEnvironment->cleanupFunctions = (void (**)(void *))theData;#if ALLOW_ENVIRONMENT_GLOBALS AddHashedEnvironment(theEnvironment); CurrentEnvironment = theEnvironment;#endif EnvInitializeEnvironment(theEnvironment,symbolTable,floatTable,integerTable,bitmapTable); return(theEnvironment); }#if ALLOW_ENVIRONMENT_GLOBALS/*******************************************//* SetCurrentEnvironment: Sets the current *//* environment to the one specified. *//*******************************************/globle void SetCurrentEnvironment( void *theEnvironment) { CurrentEnvironment = (struct environmentData *) theEnvironment; } /**************************************************//* SetCurrentEnvironmentByIndex: Sets the current *//* environment to the one having the specified *//* environment index. *//**************************************************/globle intBool SetCurrentEnvironmentByIndex( unsigned long environmentIndex) { struct environmentData *theEnvironment; theEnvironment = FindEnvironment(environmentIndex); if (theEnvironment == NULL) { return(FALSE); } SetCurrentEnvironment(theEnvironment); return(TRUE); } /**************************************************//* GetEnvironmentByIndex: Returns the environment *//* having the specified environment index. *//**************************************************/globle void *GetEnvironmentByIndex( unsigned long environmentIndex) { struct environmentData *theEnvironment; theEnvironment = FindEnvironment(environmentIndex); return(theEnvironment); } /********************************************//* GetCurrentEnvironment: Returns a pointer *//* to the current environment. *//********************************************/globle void *GetCurrentEnvironment() { return(CurrentEnvironment); } /******************************************//* GetEnvironmentIndex: Returns the index *//* of the specified environment. *//******************************************/globle unsigned long GetEnvironmentIndex( void *theEnvironment) { return(((struct environmentData *) theEnvironment)->environmentIndex); } #endif/**********************************************//* GetEnvironmentContext: Returns the context *//* of the specified environment. *//**********************************************/globle void *GetEnvironmentContext( void *theEnvironment) { return(((struct environmentData *) theEnvironment)->context); } /*******************************************//* SetEnvironmentContext: Sets the context *//* of the specified environment. *//*******************************************/globle void *SetEnvironmentContext( void *theEnvironment, void *theContext) { void *oldContext; oldContext = ((struct environmentData *) theEnvironment)->context; ((struct environmentData *) theEnvironment)->context = theContext; return oldContext; } /***************************************************//* GetEnvironmentRouterContext: Returns the router *//* context of the specified environment. *//***************************************************/globle void *GetEnvironmentRouterContext( void *theEnvironment) { return(((struct environmentData *) theEnvironment)->routerContext); } /************************************************//* SetEnvironmentRouterContext: Sets the router *//* context of the specified environment. *//************************************************/globle void *SetEnvironmentRouterContext( void *theEnvironment, void *theRouterContext) { void *oldRouterContext; oldRouterContext = ((struct environmentData *) theEnvironment)->routerContext; ((struct environmentData *) theEnvironment)->routerContext = theRouterContext; return oldRouterContext; } /*******************************************************//* GetEnvironmentFunctionContext: Returns the function *//* context of the specified environment. *//*******************************************************/globle void *GetEnvironmentFunctionContext( void *theEnvironment) { return(((struct environmentData *) theEnvironment)->functionContext); } /**************************************************//* SetEnvironmentFunctionContext: Sets the router *//* context of the specified environment. *//**************************************************/globle void *SetEnvironmentFunctionContext( void *theEnvironment, void *theFunctionContext) { void *oldFunctionContext; oldFunctionContext = ((struct environmentData *) theEnvironment)->functionContext; ((struct environmentData *) theEnvironment)->functionContext = theFunctionContext; return oldFunctionContext; } /**********************************************//* DestroyEnvironment: Destroys the specified *//* environment returning all of its memory. *//**********************************************/globle intBool DestroyEnvironment( void *vtheEnvironment) { struct environmentCleanupFunction *cleanupPtr; int i; struct memoryData *theMemData; intBool rv = TRUE; struct environmentData *theEnvironment = (struct environmentData *) vtheEnvironment; /* if (EvaluationData(theEnvironment)->CurrentExpression != NULL) { return(FALSE); } #if DEFRULE_CONSTRUCT if (EngineData(theEnvironment)->ExecutingRule != NULL) { return(FALSE); }#endif*/ theMemData = MemoryData(theEnvironment); EnvReleaseMem(theEnvironment,-1,FALSE); for (i = 0; i < MAXIMUM_ENVIRONMENT_POSITIONS; i++) { if (theEnvironment->cleanupFunctions[i] != NULL) { (*theEnvironment->cleanupFunctions[i])(theEnvironment); } } free(theEnvironment->cleanupFunctions); for (cleanupPtr = theEnvironment->listOfCleanupEnvironmentFunctions; cleanupPtr != NULL; cleanupPtr = cleanupPtr->next) { (*cleanupPtr->func)(theEnvironment); } RemoveEnvironmentCleanupFunctions(theEnvironment); EnvReleaseMem(theEnvironment,-1,FALSE);#if ALLOW_ENVIRONMENT_GLOBALS RemoveHashedEnvironment(theEnvironment);#endif if ((theMemData->MemoryAmount != 0) || (theMemData->MemoryCalls != 0)) { printf("\n[ENVRNMNT8] Environment data not fully deallocated.\n"); printf("\n[ENVRNMNT8] MemoryAmount = %ld.\n",(long) theMemData->MemoryAmount); printf("\n[ENVRNMNT8] MemoryCalls = %ld.\n",(long) theMemData->MemoryCalls); rv = FALSE; } free(theMemData->MemoryTable);#if BLOCK_MEMORY ReturnAllBlocks(theEnvironment);#endif for (i = 0; i < MAXIMUM_ENVIRONMENT_POSITIONS; i++) { if (theEnvironment->theData[i] != NULL) { free(theEnvironment->theData[i]); theEnvironment->theData[i] = NULL; } } free(theEnvironment->theData); #if ALLOW_ENVIRONMENT_GLOBALS if (CurrentEnvironment == theEnvironment) { CurrentEnvironment = NULL; }#endif free(theEnvironment); return(rv); } /**************************************************//* AddEnvironmentCleanupFunction: Adds a function *//* to the ListOfCleanupEnvironmentFunctions. *//**************************************************/globle intBool AddEnvironmentCleanupFunction( void *vtheEnv, char *name, void (*functionPtr)(void *), int priority) { struct environmentCleanupFunction *newPtr, *currentPtr, *lastPtr = NULL; struct environmentData *theEnv = (struct environmentData *) vtheEnv; newPtr = (struct environmentCleanupFunction *) malloc(sizeof(struct environmentCleanupFunction)); if (newPtr == NULL) { return(FALSE); } newPtr->name = name; newPtr->func = functionPtr; newPtr->priority = priority; if (theEnv->listOfCleanupEnvironmentFunctions == NULL) { newPtr->next = NULL; theEnv->listOfCleanupEnvironmentFunctions = newPtr; return(TRUE); } currentPtr = theEnv->listOfCleanupEnvironmentFunctions; while ((currentPtr != NULL) ? (priority < currentPtr->priority) : FALSE) { lastPtr = currentPtr; currentPtr = currentPtr->next; } if (lastPtr == NULL) { newPtr->next = theEnv->listOfCleanupEnvironmentFunctions; theEnv->listOfCleanupEnvironmentFunctions = newPtr; } else { newPtr->next = currentPtr; lastPtr->next = newPtr; } return(TRUE); }/**************************************************//* RemoveEnvironmentCleanupFunctions: Removes the *//* list of environment cleanup functions. *//**************************************************/static void RemoveEnvironmentCleanupFunctions( struct environmentData *theEnv) { struct environmentCleanupFunction *nextPtr; while (theEnv->listOfCleanupEnvironmentFunctions != NULL) { nextPtr = theEnv->listOfCleanupEnvironmentFunctions->next; free(theEnv->listOfCleanupEnvironmentFunctions); theEnv->listOfCleanupEnvironmentFunctions = nextPtr; } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?