📄 msgcom.c
字号:
DisplayCore(theEnv,logicalName,core,0); DestroyHandlerLinks(theEnv,core); } }/**************************************************** NAME : DisplayHandlersInLinks DESCRIPTION : Recursively displays all handlers for an array of classes INPUTS : 1) The logical name of the output 2) The packed class links 3) The index to print from the links RETURNS : The number of handlers printed SIDE EFFECTS : None NOTES : Used by DescribeClass() ****************************************************/globle long DisplayHandlersInLinks( void *theEnv, char *logName, PACKED_CLASS_LINKS *plinks, int theIndex) { long i; long cnt; cnt = (long) plinks->classArray[theIndex]->handlerCount; if (((int) theIndex) < (plinks->classCount - 1)) cnt += DisplayHandlersInLinks(theEnv,logName,plinks,theIndex + 1); for (i = 0 ; i < plinks->classArray[theIndex]->handlerCount ; i++) PrintHandler(theEnv,logName,&plinks->classArray[theIndex]->handlers[i],TRUE); return(cnt); }#endif/* ========================================= ***************************************** INTERNALLY VISIBLE FUNCTIONS ========================================= ***************************************** */#if ! RUN_TIME/********************************************************** NAME : CreateSystemHandlers DESCRIPTION : Attachess the system message-handlers after a (clear) INPUTS : None RETURNS : Nothing useful SIDE EFFECTS : System handlers created NOTES : Must be called after CreateSystemClasses() **********************************************************/static void CreateSystemHandlers( void *theEnv) { NewSystemHandler(theEnv,USER_TYPE_NAME,INIT_STRING,"init-slots",0); NewSystemHandler(theEnv,USER_TYPE_NAME,DELETE_STRING,"delete-instance",0); NewSystemHandler(theEnv,USER_TYPE_NAME,CREATE_STRING,"(create-instance)",0);#if DEBUGGING_FUNCTIONS NewSystemHandler(theEnv,USER_TYPE_NAME,PRINT_STRING,"ppinstance",0);#endif NewSystemHandler(theEnv,USER_TYPE_NAME,DIRECT_MODIFY_STRING,"(direct-modify)",1); NewSystemHandler(theEnv,USER_TYPE_NAME,MSG_MODIFY_STRING,"(message-modify)",1); NewSystemHandler(theEnv,USER_TYPE_NAME,DIRECT_DUPLICATE_STRING,"(direct-duplicate)",2); NewSystemHandler(theEnv,USER_TYPE_NAME,MSG_DUPLICATE_STRING,"(message-duplicate)",2); }#endif#if (! BLOAD_ONLY) && (! RUN_TIME)/************************************************************ NAME : WildDeleteHandler DESCRIPTION : Deletes a handler from a class INPUTS : 1) Class address (Can be NULL) 2) Message Handler Name (Can be NULL) 3) Type name ("primary", etc.) RETURNS : 1 if successful, 0 otherwise SIDE EFFECTS : Handler deleted if possible NOTES : None ************************************************************/static int WildDeleteHandler( void *theEnv, DEFCLASS *cls, SYMBOL_HN *msym, char *tname) { int mtype; if (msym == NULL) msym = (SYMBOL_HN *) EnvAddSymbol(theEnv,"*"); if (tname != NULL) { mtype = (int) HandlerType(theEnv,"undefmessage-handler",tname); if (mtype == MERROR) return(0); } else mtype = -1; if (cls == NULL) { int success = 1; for (cls = (DEFCLASS *) EnvGetNextDefclass(theEnv,NULL) ; cls != NULL ; cls = (DEFCLASS *) EnvGetNextDefclass(theEnv,(void *) cls)) if (DeleteHandler(theEnv,cls,msym,mtype,FALSE) == 0) success = 0; return(success); } return(DeleteHandler(theEnv,cls,msym,mtype,TRUE)); }#endif#if DEBUGGING_FUNCTIONS/****************************************************************** NAME : DefmessageHandlerWatchAccess DESCRIPTION : Parses a list of class names passed by AddWatchItem() and sets the traces accordingly INPUTS : 1) A code indicating which trace flag is to be set 0 - Watch instance creation/deletion 1 - Watch slot changes to instances 2) The value to which to set the trace flags 3) A list of expressions containing the names of the classes for which to set traces RETURNS : TRUE if all OK, FALSE otherwise SIDE EFFECTS : Watch flags set in specified classes NOTES : Accessory function for AddWatchItem() ******************************************************************/#if IBM_TBC#pragma argsused#endifstatic unsigned DefmessageHandlerWatchAccess( void *theEnv, int code, unsigned newState, EXPRESSION *argExprs) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(code)#endif return(DefmessageHandlerWatchSupport(theEnv,(char *) (newState ? "watch" : "unwatch"),NULL,newState, NULL,EnvSetDefmessageHandlerWatch,argExprs)); }/*********************************************************************** NAME : DefmessageHandlerWatchPrint DESCRIPTION : Parses a list of class names passed by AddWatchItem() and displays the traces accordingly INPUTS : 1) The logical name of the output 2) A code indicating which trace flag is to be examined 0 - Watch instance creation/deletion 1 - Watch slot changes to instances 3) A list of expressions containing the names of the classes for which to examine traces RETURNS : TRUE if all OK, FALSE otherwise SIDE EFFECTS : Watch flags displayed for specified classes NOTES : Accessory function for AddWatchItem() ***********************************************************************/#if IBM_TBC#pragma argsused#endifstatic unsigned DefmessageHandlerWatchPrint( void *theEnv, char *logName, int code, EXPRESSION *argExprs) {#if MAC_MCW || IBM_MCW || MAC_XCD#pragma unused(code)#endif return(DefmessageHandlerWatchSupport(theEnv,"list-watch-items",logName,-1, PrintHandlerWatchFlag,NULL,argExprs)); }/******************************************************* NAME : DefmessageHandlerWatchSupport DESCRIPTION : Sets or displays handlers specified INPUTS : 1) The calling function name 2) The logical output name for displays (can be NULL) 4) The new set state (can be -1) 5) The print function (can be NULL) 6) The trace function (can be NULL) 7) The handlers expression list RETURNS : TRUE if all OK, FALSE otherwise SIDE EFFECTS : Handler trace flags set or displayed NOTES : None *******************************************************/static unsigned DefmessageHandlerWatchSupport( void *theEnv, char *funcName, char *logName, int newState, void (*printFunc)(void *,char *,void *,int), void (*traceFunc)(void *,int,void *,int), EXPRESSION *argExprs) { struct defmodule *theModule; void *theClass; char *theHandlerStr; int theType; int argIndex = 2; DATA_OBJECT tmpData; /* =============================== If no handlers are specified, show the trace for all handlers in all handlers =============================== */ if (argExprs == NULL) { SaveCurrentModule(theEnv); theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,NULL); while (theModule != NULL) { EnvSetCurrentModule(theEnv,(void *) theModule); if (traceFunc == NULL) { EnvPrintRouter(theEnv,logName,EnvGetDefmoduleName(theEnv,(void *) theModule)); EnvPrintRouter(theEnv,logName,":\n"); } theClass = EnvGetNextDefclass(theEnv,NULL); while (theClass != NULL) { if (WatchClassHandlers(theEnv,theClass,NULL,-1,logName,newState, TRUE,printFunc,traceFunc) == FALSE) return(FALSE); theClass = EnvGetNextDefclass(theEnv,theClass); } theModule = (struct defmodule *) EnvGetNextDefmodule(theEnv,(void *) theModule); } RestoreCurrentModule(theEnv); return(TRUE); } /* ================================================ Set or show the traces for the specified handler ================================================ */ while (argExprs != NULL) { if (EvaluateExpression(theEnv,argExprs,&tmpData)) return(FALSE); if (tmpData.type != SYMBOL) { ExpectedTypeError1(theEnv,funcName,argIndex,"class name"); return(FALSE); } theClass = (void *) LookupDefclassByMdlOrScope(theEnv,DOToString(tmpData)); if (theClass == NULL) { ExpectedTypeError1(theEnv,funcName,argIndex,"class name"); return(FALSE); } if (GetNextArgument(argExprs) != NULL) { argExprs = GetNextArgument(argExprs); argIndex++; if (EvaluateExpression(theEnv,argExprs,&tmpData)) return(FALSE); if (tmpData.type != SYMBOL) { ExpectedTypeError1(theEnv,funcName,argIndex,"handler name"); return(FALSE); } theHandlerStr = DOToString(tmpData); if (GetNextArgument(argExprs) != NULL) { argExprs = GetNextArgument(argExprs); argIndex++; if (EvaluateExpression(theEnv,argExprs,&tmpData)) return(FALSE); if (tmpData.type != SYMBOL) { ExpectedTypeError1(theEnv,funcName,argIndex,"handler type"); return(FALSE); } if ((theType = (int) HandlerType(theEnv,funcName,DOToString(tmpData))) == MERROR) return(FALSE); } else theType = -1; } else { theHandlerStr = NULL; theType = -1; } if (WatchClassHandlers(theEnv,theClass,theHandlerStr,theType,logName, newState,FALSE,printFunc,traceFunc) == FALSE) { ExpectedTypeError1(theEnv,funcName,argIndex,"handler"); return(FALSE); } argIndex++; argExprs = GetNextArgument(argExprs); } return(TRUE); }/******************************************************* NAME : WatchClassHandlers DESCRIPTION : Sets or displays handlers specified INPUTS : 1) The class 2) The handler name (or NULL wildcard) 3) The handler type (or -1 wildcard) 4) The logical output name for displays (can be NULL) 5) The new set state (can be -1) 6) The print function (can be NULL) 7) The trace function (can be NULL) RETURNS : TRUE if all OK, FALSE otherwise SIDE EFFECTS : Handler trace flags set or displayed NOTES : None *******************************************************/static unsigned WatchClassHandlers( void *theEnv, void *theClass, char *theHandlerStr, int theType, char *logName, int newState, int indentp, void (*printFunc)(void *,char *,void *,int), void (*traceFunc)(void *,int,void *,int)) { unsigned theHandler; int found = FALSE; theHandler = EnvGetNextDefmessageHandler(theEnv,theClass,0); while (theHandler != 0) { if ((theType == -1) ? TRUE : (theType == (int) ((DEFCLASS *) theClass)->handlers[theHandler-1].type)) { if ((theHandlerStr == NULL) ? TRUE : (strcmp(theHandlerStr,EnvGetDefmessageHandlerName(theEnv,theClass,theHandler)) == 0)) { if (traceFunc != NULL) (*traceFunc)(theEnv,newState,theClass,theHandler); else { if (indentp) EnvPrintRouter(theEnv,logName," "); (*printFunc)(theEnv,logName,theClass,theHandler); } found = TRUE; } } theHandler = EnvGetNextDefmessageHandler(theEnv,theClass,theHandler); } if ((theHandlerStr != NULL) && (theType != -1) && (found == FALSE)) return(FALSE); return(TRUE); }/*************************************************** NAME : PrintHandlerWatchFlag DESCRIPTION : Displays trace value for handler INPUTS : 1) The logical name of the output 2) The class 3) The handler index RETURNS : Nothing useful SIDE EFFECTS : None NOTES : None ***************************************************/static void PrintHandlerWatchFlag( void *theEnv, char *logName, void *theClass, int theHandler) { EnvPrintRouter(theEnv,logName,EnvGetDefclassName(theEnv,theClass)); EnvPrintRouter(theEnv,logName," "); EnvPrintRouter(theEnv,logName,EnvGetDefmessageHandlerName(theEnv,theClass,theHandler)); EnvPrintRouter(theEnv,logName," "); EnvPrintRouter(theEnv,logName,EnvGetDefmessageHandlerType(theEnv,theClass,theHandler)); EnvPrintRouter(theEnv,logName,(char *) (EnvGetDefmessageHandlerWatch(theEnv,theClass,theHandler) ? " = on\n" : " = off\n")); }#endif /* DEBUGGING_FUNCTIONS */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -