📄 globlpsr.c
字号:
/*==================================================================*/
#if DEFMODULE_CONSTRUCT
if (FindImportExportConflict(theEnv,"defglobal",((struct defmodule *) EnvGetCurrentModule(theEnv)),ValueToString(variableName)))
{
ImportExportConflictMessage(theEnv,"defglobal",ValueToString(variableName),NULL,NULL);
*defglobalError = TRUE;
return(FALSE);
}
#endif
/*==============================*/
/* The next token must be an =. */
/*==============================*/
GetToken(theEnv,readSource,theToken);
if (strcmp(theToken->printForm,"=") != 0)
{
SyntaxErrorMessage(theEnv,"defglobal");
*defglobalError = TRUE;
return(FALSE);
}
SavePPBuffer(theEnv," ");
/*======================================================*/
/* Parse the expression to be assigned to the variable. */
/*======================================================*/
assignPtr = ParseAtomOrExpression(theEnv,readSource,NULL);
if (assignPtr == NULL)
{
*defglobalError = TRUE;
return(FALSE);
}
/*==========================*/
/* Evaluate the expression. */
/*==========================*/
if (! ConstructData(theEnv)->CheckSyntaxMode)
{
SetEvaluationError(theEnv,FALSE);
if (EvaluateExpression(theEnv,assignPtr,&assignValue))
{
ReturnExpression(theEnv,assignPtr);
*defglobalError = TRUE;
return(FALSE);
}
}
else
{ ReturnExpression(theEnv,assignPtr); }
SavePPBuffer(theEnv,")");
/*======================================*/
/* Add the variable to the global list. */
/*======================================*/
if (! ConstructData(theEnv)->CheckSyntaxMode)
{ AddDefglobal(theEnv,variableName,&assignValue,assignPtr); }
/*==================================================*/
/* Return TRUE to indicate that the global variable */
/* definition was successfully parsed. */
/*==================================================*/
return(TRUE);
}
/*********************************************************/
/* AddDefglobal: Adds a defglobal to the current module. */
/*********************************************************/
static void AddDefglobal(
void *theEnv,
SYMBOL_HN *name,
DATA_OBJECT_PTR vPtr,
struct expr *ePtr)
{
struct defglobal *defglobalPtr;
intBool newGlobal = FALSE;
#if DEBUGGING_FUNCTIONS
int GlobalHadWatch = FALSE;
#endif
/*========================================================*/
/* If the defglobal is already defined, then use the old */
/* data structure and substitute new values. If it hasn't */
/* been defined, then create a new data structure. */
/*========================================================*/
defglobalPtr = QFindDefglobal(theEnv,name);
if (defglobalPtr == NULL)
{
newGlobal = TRUE;
defglobalPtr = get_struct(theEnv,defglobal);
}
else
{
DeinstallConstructHeader(theEnv,&defglobalPtr->header);
#if DEBUGGING_FUNCTIONS
GlobalHadWatch = defglobalPtr->watch;
#endif
}
/*===========================================*/
/* Remove the old values from the defglobal. */
/*===========================================*/
if (newGlobal == FALSE)
{
ValueDeinstall(theEnv,&defglobalPtr->current);
if (defglobalPtr->current.type == MULTIFIELD)
{ ReturnMultifield(theEnv,(struct multifield *) defglobalPtr->current.value); }
RemoveHashedExpression(theEnv,defglobalPtr->initial);
}
/*=======================================*/
/* Copy the new values to the defglobal. */
/*=======================================*/
defglobalPtr->current.type = vPtr->type;
if (vPtr->type != MULTIFIELD) defglobalPtr->current.value = vPtr->value;
else DuplicateMultifield(theEnv,&defglobalPtr->current,vPtr);
ValueInstall(theEnv,&defglobalPtr->current);
defglobalPtr->initial = AddHashedExpression(theEnv,ePtr);
ReturnExpression(theEnv,ePtr);
DefglobalData(theEnv)->ChangeToGlobals = TRUE;
/*=================================*/
/* Restore the old watch value to */
/* the defglobal if redefined. */
/*=================================*/
#if DEBUGGING_FUNCTIONS
defglobalPtr->watch = GlobalHadWatch ? TRUE : WatchGlobals;
#endif
/*======================================*/
/* Save the name and pretty print form. */
/*======================================*/
defglobalPtr->header.name = name;
defglobalPtr->header.usrData = NULL;
IncrementSymbolCount(name);
SavePPBuffer(theEnv,"\n");
if (EnvGetConserveMemory(theEnv) == TRUE)
{ defglobalPtr->header.ppForm = NULL; }
else
{ defglobalPtr->header.ppForm = CopyPPBuffer(theEnv); }
defglobalPtr->inScope = TRUE;
/*=============================================*/
/* If the defglobal was redefined, we're done. */
/*=============================================*/
if (newGlobal == FALSE) return;
/*===================================*/
/* Copy the defglobal variable name. */
/*===================================*/
defglobalPtr->busyCount = 0;
defglobalPtr->header.whichModule = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,NULL,FindModuleItem(theEnv,"defglobal")->moduleIndex);
/*=============================================*/
/* Add the defglobal to the list of defglobals */
/* for the current module. */
/*=============================================*/
AddConstructToModule(&defglobalPtr->header);
}
/*****************************************************************/
/* ReplaceGlobalVariable: Replaces a global variable found in an */
/* expression with the appropriate primitive data type which */
/* can later be used to retrieve the global variable's value. */
/*****************************************************************/
globle intBool ReplaceGlobalVariable(
void *theEnv,
struct expr *ePtr)
{
struct defglobal *theGlobal;
int count;
/*=================================*/
/* Search for the global variable. */
/*=================================*/
theGlobal = (struct defglobal *)
FindImportedConstruct(theEnv,"defglobal",NULL,ValueToString(ePtr->value),
&count,TRUE,NULL);
/*=============================================*/
/* If it wasn't found, print an error message. */
/*=============================================*/
if (theGlobal == NULL)
{
GlobalReferenceErrorMessage(theEnv,ValueToString(ePtr->value));
return(FALSE);
}
/*========================================================*/
/* The current implementation of the defmodules shouldn't */
/* allow a construct to be defined which would cause an */
/* ambiguous reference, but we'll check for it anyway. */
/*========================================================*/
if (count > 1)
{
AmbiguousReferenceErrorMessage(theEnv,"defglobal",ValueToString(ePtr->value));
return(FALSE);
}
/*==============================================*/
/* Replace the symbolic reference of the global */
/* variable with a direct pointer reference. */
/*==============================================*/
ePtr->type = DEFGLOBAL_PTR;
ePtr->value = (void *) theGlobal;
return(TRUE);
}
/*****************************************************************/
/* GlobalReferenceErrorMessage: Prints an error message when a */
/* symbolic reference to a global variable cannot be resolved. */
/*****************************************************************/
globle void GlobalReferenceErrorMessage(
void *theEnv,
char *variableName)
{
PrintErrorID(theEnv,"GLOBLPSR",1,TRUE);
EnvPrintRouter(theEnv,WERROR,"\nGlobal variable ?*");
EnvPrintRouter(theEnv,WERROR,variableName);
EnvPrintRouter(theEnv,WERROR,"* was referenced, but is not defined.\n");
}
#endif /* (! RUN_TIME) && (! BLOAD_ONLY) */
#endif /* DEFGLOBAL_CONSTRUCT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -