Applied initial patches for wx2.8 compatibility
[ctsim.git] / libctsupport / syserror.cpp
index 1b9aff402c8513575e9492bb8f877b2eb48484a7..1427f87b85f05a7a299c3e0c50146c1d59e67ecc 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.14 2001/01/12 16:41:56 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 <string>
 #include "ct.h"
 
+#ifdef HAVE_WXWINDOWS
+#include "../src/ctsim.h"
+#include <wx/log.h>
+#endif
 
 /* NAME
-*   sys_error                  System error handler
+*   sys_error                   System error handler
 *
 * SYNOPSIS
 *   sys_error (severity, msg, args . . .)
-*   int severity               Severity of error
-*   char *msg                  Error message
-*   args                       Argument list, direct transfer to printf stack
-*                              Can take 24 byte transfer
+*   int severity                Severity of error
+*   char *msg                   Error message
+*   args                        Argument list, direct transfer to printf stack
 */
 
-static int s_reportErrorLevel = ERR_WARNING;   // Set error reporting level 
+static int s_reportErrorLevel = ERR_TRACE;      // Set error reporting level
 
-#ifdef HAVE_WXWINDOWS
-#include "../src/ctsim.h"
-bool g_bRunningWXWindows = false;
-#endif
 
 void sys_error (int severity, const char *msg, ...)
 {
   va_list arg;
-  
+
   va_start(arg, msg);
-  
+
   std::string strOutput;
   sys_verror (strOutput, severity, msg, arg);
+
 #ifdef HAVE_WXWINDOWS
-  if (g_bRunningWXWindows)
-    *theApp->getLog() << strOutput.c_str();
+  if (g_bRunningWXWindows) {
+    if (theApp) {
+      wxCommandEvent eventLog (wxEVT_COMMAND_MENU_SELECTED, MAINMENU_LOG_EVENT );
+      wxString msg (wxConvCurrent->cMB2WX(strOutput.c_str()));
+      if (msg.length() > 0) {
+        msg += wxChar('\n');
+        eventLog.SetString( msg );
+        wxPostEvent( theApp->getMainFrame(), eventLog ); // send log event, thread safe
+      }
+    } else {
+      wxMutexGuiEnter();
+      wxLog::OnLog (wxLOG_Message, wxConvCurrent->cMB2WX(strOutput.c_str()), time(NULL));
+      wxMutexGuiLeave();
+    }
+  }
   else
+    std::cout << strOutput << "\n";
+#else
+    std::cout << strOutput << "\n";
 #endif
-    std::cout << strOutput;
 
   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)
 {
   if (severity < s_reportErrorLevel)
-    return;    // ignore error if less than reporting level
-  
+    return;     // ignore error if less than reporting level
+
   std::ostringstream os;
 
-  s_nErrorCount++;
+  if (severity > ERR_TRACE)
+    s_nErrorCount++;
+
   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";
@@ -89,7 +105,7 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
       return;
     }
   }
-  
+
   switch (severity) {
   case ERR_FATAL:
     os << "FATAL ERROR: ";
@@ -106,9 +122,9 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
   default:
     os << "Illegal error severity #" << severity << ": ";
   }
-  
+
   char errStr[2000];
-  
+
 #if HAVE_VSNPRINTF
   vsnprintf (errStr, sizeof(errStr), msg, arg);
 #elif HAVE_VSPRINTF
@@ -116,32 +132,32 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
 #else
   strncpy (errStr, sizeof(errStr), "Error message not available on this platform.");
 #endif
-  
-  os << errStr << "\n";
+
+  os << errStr;
   strOutput = os.str();
-  
+
   if (severity == ERR_FATAL) {
-    std::cerr << strOutput;
-    throw std::runtime_error (strOutput); 
+    std::cerr << strOutput << "\n";
+    throw std::runtime_error (strOutput);
   }
-  
+
 #if INTERACTIVE_ERROR_DISPLAY
   std::cout << "A - Abort  C - Continue  W - Turn off warnings? ";
   //  fflush(stderr);
-  do 
+  do
   {
-    int c = cio_kb_waitc("AaBbCcWw", TRUE);      /* get code from keyboard */
+    int c = cio_kb_waitc("AaBbCcWw", TRUE);       /* get code from keyboard */
     c = tolower (c);
     fputc (c, stderr);
     fputc (NEWLINE, stderr);
-    
+
     if (c == 'a')
       exit (1);
     else if (c == 'c')
       return;
-    else if (c == 'w') 
+    else if (c == 'w')
     {
-      sys_error_level (ERR_SEVERE);    /* report severe & fatal errors */
+      sys_error_level (ERR_SEVERE);     /* report severe & fatal errors */
       break;
     }
   } while (TRUE);
@@ -150,11 +166,11 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
 
 
 /* NAME
-*   sys_error_level                    Set error reporting level
+*   sys_error_level                     Set error reporting level
 *
 * SYNOPSIS
 *   sys_error_level (severity)
-*   int severity               Report all error as serious as severity and beyond
+*   int severity                Report all error as serious as severity and beyond
 *
 * DESCRIPTION
 *   Causes the system to ignore all error below the level of severity
@@ -162,7 +178,7 @@ void sys_verror (std::string& strOutput, int severity, const char *msg, va_list
 *   error and ignore warnings
 */
 
-void 
+void
 sys_error_level (int severity)
 {
   if (severity == ERR_FATAL ||