?? 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 + -