X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsupport%2Fsyserror.cpp;h=1427f87b85f05a7a299c3e0c50146c1d59e67ecc;hp=a4f8edae99413543deddff0e2192d0cc2c1f101c;hb=f7ee98f7d964ed361068179f0e7ea4475ed1abdf;hpb=9f29c8b32c972db1178d6f8551d5cd57ceb67083 diff --git a/libctsupport/syserror.cpp b/libctsupport/syserror.cpp index a4f8eda..1427f87 100644 --- a/libctsupport/syserror.cpp +++ b/libctsupport/syserror.cpp @@ -2,7 +2,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: syserror.cpp,v 1.19 2001/01/28 19:10:18 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 @@ -28,57 +28,74 @@ #ifdef HAVE_WXWINDOWS #include "../src/ctsim.h" +#include #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 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) - wxLog::OnLog (wxLOG_Message, strOutput.c_str(), time(NULL)); + 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"; @@ -88,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: "; @@ -105,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 @@ -115,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); @@ -149,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 @@ -161,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 ||