📄 globldef.c
字号:
}
/*========================================================*/
/* 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(theValue));
vPtr->type = SYMBOL;
vPtr->value = EnvFalseSymbol(theEnv);
SetEvaluationError(theEnv,TRUE);
return(FALSE);
}
/*=================================*/
/* Get the value of the defglobal. */
/*=================================*/
QGetDefglobalValue(theEnv,theGlobal,vPtr);
return(TRUE);
}
/***************************************************************/
/* QGetDefglobalValue: Returns the value of a global variable. */
/***************************************************************/
globle int QGetDefglobalValue(
void *theEnv,
void *vTheGlobal,
DATA_OBJECT_PTR vPtr)
{
struct defglobal *theGlobal = (struct defglobal *) vTheGlobal;
/*===============================================*/
/* Transfer values which can be copied directly. */
/*===============================================*/
vPtr->type = theGlobal->current.type;
vPtr->value = theGlobal->current.value;
vPtr->begin = theGlobal->current.begin;
vPtr->end = theGlobal->current.end;
/*===========================================================*/
/* If the global contains a multifield value, return a copy */
/* of the value so that routines which use this value are */
/* not affected if the value of the global is later changed. */
/*===========================================================*/
if (vPtr->type == MULTIFIELD)
{
vPtr->value = EnvCreateMultifield(theEnv,(unsigned long) (vPtr->end + 1));
GenCopyMemory(struct field,vPtr->end + 1,
&((struct multifield *) vPtr->value)->theFields[0],
&((struct multifield *) theGlobal->current.value)->theFields[theGlobal->current.begin]);
}
return(TRUE);
}
/************************************************************/
/* EnvGetDefglobalValue: Returns the value of the specified */
/* global variable in the supplied DATA_OBJECT. */
/************************************************************/
globle intBool EnvGetDefglobalValue(
void *theEnv,
char *variableName,
DATA_OBJECT_PTR vPtr)
{
struct defglobal *theDefglobal;
if ((theDefglobal = (struct defglobal *) EnvFindDefglobal(theEnv,variableName)) == NULL)
{ return(FALSE); }
QGetDefglobalValue(theEnv,theDefglobal,vPtr);
return(TRUE);
}
/****************************************************************/
/* EnvSetDefglobalValue: Sets the value of the specified global */
/* variable to the value stored in the supplied DATA_OBJECT. */
/****************************************************************/
globle intBool EnvSetDefglobalValue(
void *theEnv,
char *variableName,
DATA_OBJECT_PTR vPtr)
{
struct defglobal *theGlobal;
if ((theGlobal = QFindDefglobal(theEnv,(SYMBOL_HN *) EnvAddSymbol(theEnv,variableName))) == NULL)
{ return(FALSE); }
QSetDefglobalValue(theEnv,theGlobal,vPtr,FALSE);
return(TRUE);
}
/**********************************************************/
/* DecrementDefglobalBusyCount: Decrements the busy count */
/* of a defglobal data structure. */
/**********************************************************/
static void DecrementDefglobalBusyCount(
void *theEnv,
void *vTheGlobal)
{
struct defglobal *theGlobal = (struct defglobal *) vTheGlobal;
if (! ConstructData(theEnv)->ClearInProgress) theGlobal->busyCount--;
}
/**********************************************************/
/* IncrementDefglobalBusyCount: Increments the busy count */
/* of a defglobal data structure. */
/**********************************************************/
#if IBM_TBC
#pragma argsused
#endif
static void IncrementDefglobalBusyCount(
void *theEnv,
void *vTheGlobal)
{
struct defglobal *theGlobal = (struct defglobal *) vTheGlobal;
#if MAC_MCW || IBM_MCW || MAC_XCD
#pragma unused(theEnv)
#endif
theGlobal->busyCount++;
}
/***********************************************************************/
/* UpdateDefglobalScope: Updates the scope flag of all the defglobals. */
/***********************************************************************/
globle void UpdateDefglobalScope(
void *theEnv)
{
struct defglobal *theDefglobal;
int moduleCount;
struct defmodule *theModule;
struct defmoduleItemHeader *theItem;
/*============================*/
/* Loop through every module. */
/*============================*/
for (theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theModule != NULL;
theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,theModule))
{
/*============================================================*/
/* Loop through every defglobal in the module being examined. */
/*============================================================*/
theItem = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,theModule,DefglobalData(theEnv)->DefglobalModuleIndex);
for (theDefglobal = (struct defglobal *) theItem->firstItem;
theDefglobal != NULL ;
theDefglobal = (struct defglobal *) EnvGetNextDefglobal(theEnv,theDefglobal))
{
/*====================================================*/
/* If the defglobal is visible to the current module, */
/* then mark it as being in scope, otherwise mark it */
/* as being out of scope. */
/*====================================================*/
if (FindImportedConstruct(theEnv,"defglobal",theModule,
ValueToString(theDefglobal->header.name),
&moduleCount,TRUE,NULL) != NULL)
{ theDefglobal->inScope = TRUE; }
else
{ theDefglobal->inScope = FALSE; }
}
}
}
/*******************************************************/
/* GetNextDefglobalInScope: Returns the next defglobal */
/* that is scope of the current module. Works in a */
/* similar fashion to GetNextDefglobal, but skips */
/* defglobals that are out of scope. */
/*******************************************************/
globle void *GetNextDefglobalInScope(
void *theEnv,
void *vTheGlobal)
{
struct defglobal *theGlobal = (struct defglobal *) vTheGlobal;
struct defmoduleItemHeader *theItem;
/*=======================================*/
/* If we're beginning the search for the */
/* first defglobal in scope, then ... */
/*=======================================*/
if (theGlobal == NULL)
{
/*==============================================*/
/* If the current module has been changed since */
/* the last time the scopes were computed, then */
/* recompute the scopes. */
/*==============================================*/
if (DefglobalData(theEnv)->LastModuleIndex != DefmoduleData(theEnv)->ModuleChangeIndex)
{
UpdateDefglobalScope(theEnv);
DefglobalData(theEnv)->LastModuleIndex = DefmoduleData(theEnv)->ModuleChangeIndex;
}
/*==========================================*/
/* Get the first module and first defglobal */
/* to start the search with. */
/*==========================================*/
DefglobalData(theEnv)->TheDefmodule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL);
theItem = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
theGlobal = (struct defglobal *) theItem->firstItem;
}
/*==================================================*/
/* Otherwise, see if the last defglobal returned by */
/* this function has a defglobal following it. */
/*==================================================*/
else
{ theGlobal = (struct defglobal *) EnvGetNextDefglobal(theEnv,theGlobal); }
/*======================================*/
/* Continue looping through the modules */
/* until a defglobal in scope is found. */
/*======================================*/
while (DefglobalData(theEnv)->TheDefmodule != NULL)
{
/*=====================================================*/
/* Loop through the defglobals in the module currently */
/* being examined to see if one is in scope. */
/*=====================================================*/
for (;
theGlobal != NULL;
theGlobal = (struct defglobal *) EnvGetNextDefglobal(theEnv,theGlobal))
{ if (theGlobal->inScope) return((void *) theGlobal); }
/*================================================*/
/* If a global in scope couldn't be found in this */
/* module, then move on to the next module. */
/*================================================*/
DefglobalData(theEnv)->TheDefmodule = (struct defmodule *) EnvGetNextDefmodule(theEnv,DefglobalData(theEnv)->TheDefmodule);
theItem = (struct defmoduleItemHeader *)
GetModuleItem(theEnv,DefglobalData(theEnv)->TheDefmodule,DefglobalData(theEnv)->DefglobalModuleIndex);
theGlobal = (struct defglobal *) theItem->firstItem;
}
/*====================================*/
/* All the globals in scope have been */
/* traversed and there are none left. */
/*====================================*/
return(NULL);
}
#endif /* DEFGLOBAL_CONSTRUCT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -