📄 watch.c
字号:
/*******************************************************/
/* "C" Language Integrated Production System */
/* */
/* CLIPS Version 6.24 06/05/06 */
/* */
/* WATCH MODULE */
/*******************************************************/
/*************************************************************/
/* Purpose: Support functions for the watch and unwatch */
/* commands. */
/* */
/* Principal Programmer(s): */
/* Gary D. Riley */
/* */
/* Contributing Programmer(s): */
/* Brian Donnell */
/* */
/* Revision History: */
/* 6.23: Changed name of variable log to logName */
/* because of Unix compiler warnings of shadowed */
/* definitions. */
/* */
/* 6.24: Renamed BOOLEAN macro type to intBool. */
/* */
/* Added EnvSetWatchItem function. */
/* */
/*************************************************************/
#define _WATCH_SOURCE_
#include "setup.h"
#if DEBUGGING_FUNCTIONS
#include <stdio.h>
#define _STDIO_INCLUDED_
#include <string.h>
#include "constant.h"
#include "envrnmnt.h"
#include "memalloc.h"
#include "router.h"
#include "argacces.h"
#include "extnfunc.h"
#include "watch.h"
/***************************************/
/* LOCAL INTERNAL FUNCTION DEFINITIONS */
/***************************************/
static struct watchItem *ValidWatchItem(void *,char *,int *);
static intBool RecognizeWatchRouters(void *,char *);
static int CaptureWatchPrints(void *,char *,char *);
static void DeallocateWatchData(void *);
/**********************************************/
/* InitializeWatchData: Allocates environment */
/* data for watch items. */
/**********************************************/
globle void InitializeWatchData(
void *theEnv)
{
AllocateEnvironmentData(theEnv,WATCH_DATA,sizeof(struct watchData),DeallocateWatchData);
}
/************************************************/
/* DeallocateWatchData: Deallocates environment */
/* data for watch items. */
/************************************************/
static void DeallocateWatchData(
void *theEnv)
{
struct watchItem *tmpPtr, *nextPtr;
tmpPtr = WatchData(theEnv)->ListOfWatchItems;
while (tmpPtr != NULL)
{
nextPtr = tmpPtr->next;
rtn_struct(theEnv,watchItem,tmpPtr);
tmpPtr = nextPtr;
}
}
/*************************************************************/
/* AddWatchItem: Adds an item to the list of watchable items */
/* that can be set using the watch and unwatch commands. */
/* Returns FALSE if the item is already in the list, */
/* otherwise returns TRUE. */
/*************************************************************/
globle intBool AddWatchItem(
void *theEnv,
char *name,
int code,
unsigned *flag,
int priority,
unsigned (*accessFunc)(void *,int,unsigned,struct expr *),
unsigned (*printFunc)(void *,char *,int,struct expr *))
{
struct watchItem *newPtr, *currentPtr, *lastPtr;
/*================================================================*/
/* Find the insertion point in the watchable items list to place */
/* the new item. If the item is already in the list return FALSE. */
/*================================================================*/
for (currentPtr = WatchData(theEnv)->ListOfWatchItems, lastPtr = NULL;
currentPtr != NULL;
currentPtr = currentPtr->next)
{
if (strcmp(currentPtr->name,name) == 0) return(FALSE);
if (priority < currentPtr->priority) lastPtr = currentPtr;
}
/*============================*/
/* Create the new watch item. */
/*============================*/
newPtr = get_struct(theEnv,watchItem);
newPtr->name = name;
newPtr->flag = flag;
newPtr->code = code;
newPtr->priority = priority;
newPtr->accessFunc = accessFunc;
newPtr->printFunc = printFunc;
/*=================================================*/
/* Insert the new item in the list of watch items. */
/*=================================================*/
if (lastPtr == NULL)
{
newPtr->next = WatchData(theEnv)->ListOfWatchItems;
WatchData(theEnv)->ListOfWatchItems = newPtr;
}
else
{
newPtr->next = lastPtr->next;
lastPtr->next = newPtr;
}
/*==================================================*/
/* Return TRUE to indicate the item has been added. */
/*==================================================*/
return(TRUE);
}
/*****************************************************/
/* EnvWatch: C access routine for the watch command. */
/*****************************************************/
globle intBool EnvWatch(
void *theEnv,
char *itemName)
{
return(EnvSetWatchItem(theEnv,itemName,ON,NULL));
}
/*********************************************************/
/* EnvUnwatch: C access routine for the unwatch command. */
/*********************************************************/
globle intBool EnvUnwatch(
void *theEnv,
char *itemName)
{
return(EnvSetWatchItem(theEnv,itemName,OFF,NULL));
}
/***********************************************************************/
/* EnvSetWatchItem: Sets the state of a specified watch item to either */
/* on or off. Returns TRUE if the item was set, otherwise FALSE. */
/***********************************************************************/
globle int EnvSetWatchItem(
void *theEnv,
char *itemName,
unsigned newState,
struct expr *argExprs)
{
struct watchItem *wPtr;
/*======================================================*/
/* If the new state isn't on or off, then return FALSE. */
/*======================================================*/
if ((newState != ON) && (newState != OFF)) return(FALSE);
/*===================================================*/
/* If the name of the watch item to set is all, then */
/* all watch items are set to the new state and TRUE */
/* is returned. */
/*===================================================*/
if (strcmp(itemName,"all") == 0)
{
for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
{
/*==============================================*/
/* If no specific arguments are specified, then */
/* set the global flag for the watch item. */
/*==============================================*/
if (argExprs == NULL) *(wPtr->flag) = newState;
/*=======================================*/
/* Set flags for individual watch items. */
/*=======================================*/
if ((wPtr->accessFunc == NULL) ? FALSE :
((*wPtr->accessFunc)(theEnv,wPtr->code,newState,argExprs) == FALSE))
{
SetEvaluationError(theEnv,TRUE);
return(FALSE);
}
}
return(TRUE);
}
/*=================================================*/
/* Search for the watch item to be set in the list */
/* of watch items. If found, set the watch item to */
/* its new state and return TRUE. */
/*=================================================*/
for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
{
if (strcmp(itemName,wPtr->name) == 0)
{
/*==============================================*/
/* If no specific arguments are specified, then */
/* set the global flag for the watch item. */
/*==============================================*/
if (argExprs == NULL) *(wPtr->flag) = newState;
/*=======================================*/
/* Set flags for individual watch items. */
/*=======================================*/
if ((wPtr->accessFunc == NULL) ? FALSE :
((*wPtr->accessFunc)(theEnv,wPtr->code,newState,argExprs) == FALSE))
{
SetEvaluationError(theEnv,TRUE);
return(FALSE);
}
return(TRUE);
}
}
/*=================================================*/
/* If the specified item was not found in the list */
/* of watchable items then return FALSE. */
/*=================================================*/
return(FALSE);
}
/******************************************************************/
/* EnvGetWatchItem: Gets the current state of the specified watch */
/* item. Returns the state of the watch item (0 for off and 1 */
/* for on) if the watch item is found in the list of watch */
/* items, otherwise -1 is returned. */
/******************************************************************/
globle int EnvGetWatchItem(
void *theEnv,
char *itemName)
{
struct watchItem *wPtr;
for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
{
if (strcmp(itemName,wPtr->name) == 0)
{ return((int) *(wPtr->flag)); }
}
return(-1);
}
/****************************************************************/
/* ValidWatchItem: Returns TRUE if the specified name is found */
/* in the list of watch items, otherwise returns FALSE. */
/****************************************************************/
static struct watchItem *ValidWatchItem(
void *theEnv,
char *itemName,
int *recognized)
{
struct watchItem *wPtr;
*recognized = TRUE;
if (strcmp(itemName,"all") == 0)
return(NULL);
for (wPtr = WatchData(theEnv)->ListOfWatchItems; wPtr != NULL; wPtr = wPtr->next)
{ if (strcmp(itemName,wPtr->name) == 0) return(wPtr); }
*recognized = FALSE;
return(NULL);
}
/*************************************************************/
/* GetNthWatchName: Returns the name associated with the nth */
/* item in the list of watchable items. If the nth item */
/* does not exist, then NULL is returned. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -