📄 msgcom.c
字号:
RETURNS : The number of handlers printed
SIDE EFFECTS : None
NOTES : Used by DescribeClass()
****************************************************/
globle long DisplayHandlersInLinks(
void *theEnv,
char *logName,
PACKED_CLASS_LINKS *plinks,
unsigned theIndex)
{
register unsigned 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
#endif
static 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,(int) newState,
NULL,EnvSetDefmessageHandlerWatch,argExprs));
}
/***********************************************************************
NAME : DefclassWatchPrint
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
#endif
static 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 *,unsigned),
void (*traceFunc)(void *,int,void *,unsigned),
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 *,unsigned),
void (*traceFunc)(void *,int,void *,unsigned))
{
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,
unsigned 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 + -