⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgcom.c

📁 clips源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
      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 + -