/*****************************************************************************
** This is part of the CTSim program
-** Copyright (C) 1983-2000 Kevin Rosenberg
-**
-** $Id: syserror.cpp,v 1.11 2000/12/29 20:11:42 kevin Exp $
+** Copyright (c) 1983-2009 Kevin Rosenberg
**
** 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
+* 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
-\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 (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
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
-
- std::ostringstream os;\r
+ return; // ignore error if less than reporting level
+
+ 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;
}
}
-
+
switch (severity) {
case ERR_FATAL:
os << "FATAL ERROR: ";
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 << "\n";
- strOutput = os.str();\r
-
- if (severity == ERR_FATAL)
- throw std::runtime_error (errStr);
-
+
+ os << errStr;
+ strOutput = os.str();
+
+ 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? ";
// 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);
/* 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
* error and ignore warnings
*/
-void
+void
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