r10877: Automated commit for Debian build of ctsim upstream-version-4.4.3
[ctsim.git] / libctsupport / syserror.cpp
index 8468f820743affdc535a49a4809fabcf1d2a94c2..e24ec85511f3f2802c5e441430057839434abec6 100644 (file)
@@ -1,8 +1,8 @@
 /*****************************************************************************
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2000 Kevin Rosenberg
+**  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: syserror.cpp,v 1.10 2000/12/29 15:45:06 kevin Exp $
+**  $Id$
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
 #include <exception>
 #include <stdexcept>
 #include <stdarg.h>
-#include <ctype.h>\r
+#include <ctype.h>
 #include <string>
 #include "ct.h"
 
+#ifdef HAVE_WXWINDOWS
+#include "../src/ctsim.h"
+#include <wx/log.h>
+#endif
 
 /* NAME
 *   sys_error                  System error handler
 *   int severity               Severity of error
 *   char *msg                  Error message
 *   args                       Argument list, direct transfer to printf stack
-*                              Can take 24 byte transfer
 */
 
-static int s_reportErrorLevel = ERR_WARNING;   // Set error reporting level 
-\r
-bool g_bRunningWXWindows = false;
+static int s_reportErrorLevel = ERR_TRACE;     // Set error reporting level 
+
 
 void sys_error (int severity, const char *msg, ...)
 {
   va_list arg;
   
   va_start(arg, msg);
-  \r
+  
   std::string strOutput;
   sys_verror (strOutput, severity, msg, arg);
-  \r
-//  if (g_bRunningWXWindows)\r
-//    theApp->getLog() << strOutput.c_str();\r
-//  else\r
-    std::cout << strOutput;\r
+#ifdef HAVE_WXWINDOWS
+  if (g_bRunningWXWindows) {
+    if (theApp) {
+      wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
+      wxString msg (strOutput.c_str());
+      if (msg.length() > 0) {
+       msg += "\n";
+       eventLog.SetString( msg );
+       wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event, thread safe
+      }
+    } else {
+      wxMutexGuiEnter();
+      wxLog::OnLog (wxLOG_Message, strOutput.c_str(), time(NULL));
+      wxMutexGuiLeave();
+    }
+  }
+  else
+    std::cout << strOutput << "\n";
+#else
+    std::cout << strOutput << "\n";
+#endif
 
   va_end(arg);
 }
 
-static int s_nErrorCount = 0;
-const static int MAX_ERROR_COUNT = 20;
+static unsigned long s_nErrorCount = 0;
+unsigned long int g_lSysErrorMaxCount = 2000;
 
 
 void sys_verror (std::string& strOutput, int severity, const char *msg, va_list arg)
@@ -68,18 +87,20 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
   if (severity < s_reportErrorLevel)
     return;    // ignore error if less than reporting level
   
-  std::ostringstream os;\r
+  std::ostringstream os;
+
+  if (severity > ERR_TRACE)
+    s_nErrorCount++;
 
-  s_nErrorCount++;\r
   if (severity != ERR_FATAL) {
-    if (s_nErrorCount > MAX_ERROR_COUNT)
+    if (s_nErrorCount > g_lSysErrorMaxCount)
       return;
-    else if (s_nErrorCount == MAX_ERROR_COUNT) {
+    else if (s_nErrorCount == g_lSysErrorMaxCount) {
       os << "*****************************************************************\n";
       os << "***   M A X I M U M   E R R O R   C O U N T   R E A C H E D   ***\n";
       os << "***                                                           ***\n";
       os << "***           No further errors will be reported              ***\n";
-      os << "*****************************************************************\n";\r
+      os << "*****************************************************************\n";
       strOutput = os.str();
       return;
     }
@@ -94,29 +115,31 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
     break;
   case ERR_WARNING:
     os << "WARNING ERROR: ";
-    break;\r
-  case ERR_TRACE:\r
-    os << "Trace: ";\r
+    break;
+  case ERR_TRACE:
+    os << "Trace: ";
     break;
   default:
     os << "Illegal error severity #" << severity << ": ";
   }
   
-  char errStr[2000];\r
+  char errStr[2000];
   
 #if HAVE_VSNPRINTF
   vsnprintf (errStr, sizeof(errStr), msg, arg);
 #elif HAVE_VSPRINTF
-  vsprintf (errStr, msg, arg);\r
-#else\r
+  vsprintf (errStr, msg, arg);
+#else
   strncpy (errStr, sizeof(errStr), "Error message not available on this platform.");
 #endif
   
-  os << errStr << std::endl;
-  strOutput = os.str();\r
+  os << errStr;
+  strOutput = os.str();
   
-  if (severity == ERR_FATAL)
-    throw std::runtime_error (errStr);
+  if (severity == ERR_FATAL) {
+    std::cerr << strOutput << "\n";
+    throw std::runtime_error (strOutput); 
+  }
   
 #if INTERACTIVE_ERROR_DISPLAY
   std::cout << "A - Abort  C - Continue  W - Turn off warnings? ";
@@ -160,7 +183,7 @@ sys_error_level (int severity)
 {
   if (severity == ERR_FATAL ||
     severity == ERR_SEVERE ||
-    severity == ERR_WARNING ||\r
+    severity == ERR_WARNING ||
     severity == ERR_TRACE)
     s_reportErrorLevel = severity;
   else