📄 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 "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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -