📄 constrct.c
字号:
/*******************************************************/ /* "C" Language Integrated Production System */ /* */ /* CLIPS Version 6.24 06/05/06 */ /* */ /* CONSTRUCT MODULE */ /*******************************************************//*************************************************************//* Purpose: Provides basic functionality for creating new *//* types of constructs, saving constructs to a file, and *//* adding new functionality to the clear and reset *//* commands. *//* *//* Principal Programmer(s): *//* Gary D. Riley *//* *//* Contributing Programmer(s): *//* *//* Revision History: *//* *//* 6.24: Added environment parameter to GenClose. *//* Added environment parameter to GenOpen. *//* *//* Renamed BOOLEAN macro type to intBool. *//* *//*************************************************************/#define _CONSTRCT_SOURCE_#include <stdio.h>#define _STDIO_INCLUDED_#include <string.h>#include "setup.h"#include "constant.h"#include "envrnmnt.h"#include "memalloc.h"#include "router.h"#include "scanner.h"#include "watch.h"#include "prcdrfun.h"#include "prcdrpsr.h"#include "argacces.h"#include "exprnpsr.h"#include "multifld.h"#include "moduldef.h"#include "sysdep.h"#include "utility.h"#include "commline.h"#include "ruledef.h" /* TBD Remove */#include "constrct.h"/***************************************//* LOCAL INTERNAL FUNCTION DEFINITIONS *//***************************************/ static void DeallocateConstructData(void *);/**************************************************//* InitializeConstructData: Allocates environment *//* data for constructs. *//**************************************************/globle void InitializeConstructData( void *theEnv) { AllocateEnvironmentData(theEnv,CONSTRUCT_DATA,sizeof(struct constructData),DeallocateConstructData);#if (! RUN_TIME) && (! BLOAD_ONLY) ConstructData(theEnv)->WatchCompilations = ON;#endif } /****************************************************//* DeallocateConstructData: Deallocates environment *//* data for constructs. *//****************************************************/static void DeallocateConstructData( void *theEnv) { struct construct *tmpPtr, *nextPtr;#if (! RUN_TIME) && (! BLOAD_ONLY) DeallocateCallList(theEnv,ConstructData(theEnv)->ListOfSaveFunctions);#endif DeallocateCallList(theEnv,ConstructData(theEnv)->ListOfResetFunctions); DeallocateCallList(theEnv,ConstructData(theEnv)->ListOfClearFunctions); DeallocateCallList(theEnv,ConstructData(theEnv)->ListOfClearReadyFunctions); tmpPtr = ConstructData(theEnv)->ListOfConstructs; while (tmpPtr != NULL) { nextPtr = tmpPtr->next; rtn_struct(theEnv,construct,tmpPtr); tmpPtr = nextPtr; } }#if (! RUN_TIME) && (! BLOAD_ONLY)/*************************************************//* FindConstruct: Determines whether a construct *//* type is in the ListOfConstructs. *//*************************************************/globle struct construct *FindConstruct( void *theEnv, char *name) { struct construct *currentPtr; for (currentPtr = ConstructData(theEnv)->ListOfConstructs; currentPtr != NULL; currentPtr = currentPtr->next) { if (strcmp(name,currentPtr->constructName) == 0) { return(currentPtr); } } return(NULL); }/***********************************************************//* RemoveConstruct: Removes a construct and its associated *//* parsing function from the ListOfConstructs. Returns *//* TRUE if the construct type was removed, otherwise *//* FALSE. *//***********************************************************/globle int RemoveConstruct( void *theEnv, char *name) { struct construct *currentPtr, *lastPtr = NULL; for (currentPtr = ConstructData(theEnv)->ListOfConstructs; currentPtr != NULL; currentPtr = currentPtr->next) { if (strcmp(name,currentPtr->constructName) == 0) { if (lastPtr == NULL) { ConstructData(theEnv)->ListOfConstructs = currentPtr->next; } else { lastPtr->next = currentPtr->next; } rtn_struct(theEnv,construct,currentPtr); return(TRUE); } lastPtr = currentPtr; } return(FALSE); }/************************************************//* Save: C access routine for the save command. *//************************************************/globle int EnvSave( void *theEnv, char *fileName) { struct callFunctionItem *saveFunction; FILE *filePtr; void *defmodulePtr; /*=====================*/ /* Open the save file. */ /*=====================*/ if ((filePtr = GenOpen(theEnv,fileName,"w")) == NULL) { return(FALSE); } /*===========================*/ /* Bypass the router system. */ /*===========================*/ SetFastSave(theEnv,filePtr); /*======================*/ /* Save the constructs. */ /*======================*/ for (defmodulePtr = EnvGetNextDefmodule(theEnv,NULL); defmodulePtr != NULL; defmodulePtr = EnvGetNextDefmodule(theEnv,defmodulePtr)) { for (saveFunction = ConstructData(theEnv)->ListOfSaveFunctions; saveFunction != NULL; saveFunction = saveFunction->next) { ((* (void (*)(void *,void *,char *)) saveFunction->func))(theEnv,defmodulePtr,(char *) filePtr); } } /*======================*/ /* Close the save file. */ /*======================*/ GenClose(theEnv,filePtr); /*===========================*/ /* Remove the router bypass. */ /*===========================*/ SetFastSave(theEnv,NULL); /*=========================*/ /* Return TRUE to indicate */ /* successful completion. */ /*=========================*/ return(TRUE); }/*******************************************************//* RemoveSaveFunction: Removes a function from the *//* ListOfSaveFunctions. Returns TRUE if the function *//* was successfully removed, otherwise FALSE. *//*******************************************************/globle intBool RemoveSaveFunction( void *theEnv, char *name) { int found; ConstructData(theEnv)->ListOfSaveFunctions = RemoveFunctionFromCallList(theEnv,name,ConstructData(theEnv)->ListOfSaveFunctions,&found); if (found) return(TRUE); return(FALSE); }/**********************************//* SetCompilationsWatch: Sets the *//* value of WatchCompilations. *//**********************************/globle void SetCompilationsWatch( void *theEnv, unsigned value) { ConstructData(theEnv)->WatchCompilations = value; }/*************************************//* GetCompilationsWatch: Returns the *//* value of WatchCompilations. *//*************************************/globle unsigned GetCompilationsWatch( void *theEnv) { return(ConstructData(theEnv)->WatchCompilations); }/**********************************//* SetPrintWhileLoading: Sets the *//* value of PrintWhileLoading. *//**********************************/globle void SetPrintWhileLoading( void *theEnv, intBool value) { ConstructData(theEnv)->PrintWhileLoading = value; }/*************************************//* GetPrintWhileLoading: Returns the *//* value of PrintWhileLoading. *//*************************************/globle intBool GetPrintWhileLoading( void *theEnv) { return(ConstructData(theEnv)->PrintWhileLoading); }#endif/*************************************//* InitializeConstructs: Initializes *//* the Construct Manager. *//*************************************/globle void InitializeConstructs( void *theEnv) {#if (! RUN_TIME) EnvDefineFunction2(theEnv,"clear", 'v', PTIEF ClearCommand, "ClearCommand", "00"); EnvDefineFunction2(theEnv,"reset", 'v', PTIEF ResetCommand, "ResetCommand", "00");#if DEBUGGING_FUNCTIONS && (! BLOAD_ONLY) AddWatchItem(theEnv,"compilations",0,&ConstructData(theEnv)->WatchCompilations,30,NULL,NULL);#endif#else#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(theEnv)#endif#endif }/**************************************//* ClearCommand: H/L access routine *//* for the clear command. *//**************************************/globle void ClearCommand( void *theEnv) { if (EnvArgCountCheck(theEnv,"clear",EXACTLY,0) == -1) return; EnvClear(theEnv); return; }/**************************************//* ResetCommand: H/L access routine *//* for the reset command. *//**************************************/globle void ResetCommand( void *theEnv) { if (EnvArgCountCheck(theEnv,"reset",EXACTLY,0) == -1) return; EnvReset(theEnv); return; }/******************************//* EnvReset: C access routine *//* for the reset command. *//******************************/globle void EnvReset( void *theEnv) { struct callFunctionItem *resetPtr; /*=====================================*/ /* The reset command can't be executed */ /* while a reset is in progress. */ /*=====================================*/ if (ConstructData(theEnv)->ResetInProgress) return; ConstructData(theEnv)->ResetInProgress = TRUE; ConstructData(theEnv)->ResetReadyInProgress = TRUE; /*================================================*/ /* If the reset is performed from the top level */ /* command prompt, reset the halt execution flag. */ /*================================================*/ if (EvaluationData(theEnv)->CurrentEvaluationDepth == 0) SetHaltExecution(theEnv,FALSE); /*=======================================================*/ /* Call the before reset function to determine if the */ /* reset should continue. [Used by the some of the */ /* windowed interfaces to query the user whether a */ /* reset should proceed with activations on the agenda.] */ /*=======================================================*/ if ((ConstructData(theEnv)->BeforeResetFunction != NULL) ? ((*ConstructData(theEnv)->BeforeResetFunction)(theEnv) == FALSE) : FALSE) { ConstructData(theEnv)->ResetReadyInProgress = FALSE; ConstructData(theEnv)->ResetInProgress = FALSE; return; } ConstructData(theEnv)->ResetReadyInProgress = FALSE; /*===========================*/ /* Call each reset function. */ /*===========================*/ for (resetPtr = ConstructData(theEnv)->ListOfResetFunctions; (resetPtr != NULL) && (GetHaltExecution(theEnv) == FALSE); resetPtr = resetPtr->next) { if (resetPtr->environmentAware) { (*resetPtr->func)(theEnv); } else { (* (void (*)(void)) resetPtr->func)(); } } /*============================================*/ /* Set the current module to the MAIN module. */ /*============================================*/ EnvSetCurrentModule(theEnv,(void *) EnvFindDefmodule(theEnv,"MAIN")); /*===========================================*/ /* Perform periodic cleanup if the reset was */ /* issued from an embedded controller. */ /*===========================================*/ if ((EvaluationData(theEnv)->CurrentEvaluationDepth == 0) && (! CommandLineData(theEnv)->EvaluatingTopLevelCommand) && (EvaluationData(theEnv)->CurrentExpression == NULL)) { PeriodicCleanup(theEnv,TRUE,FALSE); } /*===================================*/ /* A reset is no longer in progress. */ /*===================================*/ ConstructData(theEnv)->ResetInProgress = FALSE; }/************************************//* SetBeforeResetFunction: Sets the *//* value of BeforeResetFunction. *//************************************/globle int (*SetBeforeResetFunction(void *theEnv, int (*theFunction)(void *)))(void *) { int (*tempFunction)(void *); tempFunction = ConstructData(theEnv)->BeforeResetFunction; ConstructData(theEnv)->BeforeResetFunction = theFunction; return(tempFunction); }#if (! ENVIRONMENT_API_ONLY) && ALLOW_ENVIRONMENT_GLOBALS/*************************************//* AddResetFunction: Adds a function *//* to ListOfResetFunctions. *//*************************************/globle intBool AddResetFunction( char *name, void (*functionPtr)(void), int priority) { void *theEnv; theEnv = GetCurrentEnvironment(); ConstructData(theEnv)->ListOfResetFunctions = AddFunctionToCallList(theEnv,name,priority,(void (*)(void *)) functionPtr, ConstructData(theEnv)->ListOfResetFunctions,FALSE); return(TRUE); }#endif/****************************************//* EnvAddResetFunction: Adds a function *//* to ListOfResetFunctions. *//****************************************/globle intBool EnvAddResetFunction(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -