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 + -
显示快捷键?