📄 globlpsr.c
字号:
/* Check for import/export conflicts from the construct definition. */ /*==================================================================*/ #if DEFMODULE_CONSTRUCT if (FindImportExportConflict("defglobal",((struct defmodule *) GetCurrentModule()),ValueToString(variableName))) { ImportExportConflictMessage("defglobal",ValueToString(variableName),NULL,NULL); *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); }#endif /*==============================*/ /* The next token must be an =. */ /*==============================*/ GetToken(readSource,theToken); if (strcmp(theToken->printForm,"=") != 0) { SyntaxErrorMessage("defglobal"); *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); } SavePPBuffer(" "); /*======================================================*/ /* Parse the expression to be assigned to the variable. */ /*======================================================*/ assignPtr = ParseAtomOrExpression(readSource,NULL); if (assignPtr == NULL) { *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); } /*==========================*/ /* Evaluate the expression. */ /*==========================*/ SetEvaluationError(CLIPS_FALSE); if (EvaluateExpression(assignPtr,&assignValue)) { ReturnExpression(assignPtr); *defglobalError = CLIPS_TRUE; return(CLIPS_FALSE); } SavePPBuffer(")"); /*======================================*/ /* Add the variable to the global list. */ /*======================================*/ AddDefglobal(variableName,&assignValue,assignPtr); /*==================================================*/ /* Return TRUE to indicate that the global variable */ /* definition was successfully parsed. */ /*==================================================*/ return(CLIPS_TRUE); }/*********************************************************//* AddDefglobal: Adds a defglobal to the current module. *//*********************************************************/static VOID AddDefglobal(name,vPtr,ePtr) SYMBOL_HN *name; DATA_OBJECT_PTR vPtr; struct expr *ePtr; { struct defglobal *defglobalPtr; BOOLEAN new = CLIPS_FALSE;#if DEBUGGING_FUNCTIONS int GlobalHadWatch = CLIPS_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(name); if (defglobalPtr == NULL) { new = CLIPS_TRUE; defglobalPtr = get_struct(defglobal); } else { DeinstallConstructHeader(&defglobalPtr->header);#if DEBUGGING_FUNCTIONS GlobalHadWatch = defglobalPtr->watch;#endif } /*===========================================*/ /* Remove the old values from the defglobal. */ /*===========================================*/ if (new == CLIPS_FALSE) { ValueDeinstall(&defglobalPtr->current); if (defglobalPtr->current.type == MULTIFIELD) { ReturnMultifield(defglobalPtr->current.value); } RemoveHashedExpression(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(&defglobalPtr->current,vPtr); ValueInstall(&defglobalPtr->current); defglobalPtr->initial = AddHashedExpression(ePtr); ReturnExpression(ePtr); ChangeToGlobals = CLIPS_TRUE; /*=================================*/ /* Restore the old watch value to */ /* the defglobal if redefined. */ /*=================================*/ #if DEBUGGING_FUNCTIONS defglobalPtr->watch = GlobalHadWatch ? CLIPS_TRUE : WatchGlobals;#endif /*======================================*/ /* Save the name and pretty print form. */ /*======================================*/ defglobalPtr->header.name = name; IncrementSymbolCount(name); SavePPBuffer("\n"); if (GetConserveMemory() == CLIPS_TRUE) { defglobalPtr->header.ppForm = NULL; } else { defglobalPtr->header.ppForm = CopyPPBuffer(); } defglobalPtr->inScope = CLIPS_TRUE; /*=============================================*/ /* If the defglobal was redefined, we're done. */ /*=============================================*/ if (new == CLIPS_FALSE) return; /*===================================*/ /* Copy the defglobal variable name. */ /*===================================*/ defglobalPtr->busyCount = 0; defglobalPtr->header.whichModule = (struct defmoduleItemHeader *) GetModuleItem(NULL,FindModuleItem("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 BOOLEAN ReplaceGlobalVariable(ePtr) struct expr *ePtr; { struct defglobal *theGlobal; int count; /*=================================*/ /* Search for the global variable. */ /*=================================*/ theGlobal = (struct defglobal *) FindImportedConstruct("defglobal",NULL,ValueToString(ePtr->value), &count,CLIPS_TRUE,NULL); /*=============================================*/ /* If it wasn't found, print an error message. */ /*=============================================*/ if (theGlobal == NULL) { GlobalReferenceErrorMessage(ValueToString(ePtr->value)); return(CLIPS_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("defglobal",ValueToString(ePtr->value)); return(CLIPS_FALSE); } /*==============================================*/ /* Replace the symbolic reference of the global */ /* variable with a direct pointer reference. */ /*==============================================*/ ePtr->type = DEFGLOBAL_PTR; ePtr->value = (VOID *) theGlobal; return(CLIPS_TRUE); }/*****************************************************************//* GlobalReferenceErrorMessage: Prints an error message when a *//* symbolic reference to a global variable cannot be resolved. *//*****************************************************************/globle VOID GlobalReferenceErrorMessage(variableName) char *variableName; { PrintErrorID("GLOBLPSR",1,CLIPS_TRUE); PrintCLIPS(WERROR,"\nGlobal variable ?*"); PrintCLIPS(WERROR,variableName); PrintCLIPS(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 + -