📄 envrnmnt.c
字号:
printf("\n[ENVRNMNT5] Unable to create new environment.\n");
return(NULL);
}
theData = malloc(sizeof(void *) * MAXIMUM_ENVIRONMENT_POSITIONS);
if (theData == NULL)
{
free(theEnvironment);
printf("\n[ENVRNMNT6] Unable to create environment data.\n");
return(NULL);
}
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;
/*=============================================*/
/* 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;
}
/**********************************************/
/* 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");
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -