⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 globlpsr.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   /*==================================================================*/#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 + -