/*****************************************************************************
** This is part of the CTSim program
-** Copyright (C) 1983-2000 Kevin Rosenberg
+** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: syserror.cpp,v 1.4 2000/08/25 15:59:13 kevin Exp $
+** $Id: syserror.cpp,v 1.21 2001/02/20 04:48:45 kevin Exp $
**
** 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 <stdexcept>
#include <stdarg.h>
#include <ctype.h>
-#include "ctsupport.h"
+#include <string>
+#include "ct.h"
+#ifdef HAVE_WXWINDOWS
+#include "../src/ctsim.h"
+#endif
/* NAME
- * 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
- */
+* 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
+*/
-static int errorlevel = 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);
-
- sys_verror (severity, msg, arg);
+
+ std::string strOutput;
+ sys_verror (strOutput, severity, msg, arg);
+
+#ifdef HAVE_WXWINDOWS
+ if (g_bRunningWXWindows) {
+ if (theApp)
+ *theApp->getLog() << strOutput.c_str() << "\n";
+ else
+ wxLog::OnLog (wxLOG_Message, strOutput.c_str(), time(NULL));
+ }
+ else
+#endif
+ std::cout << strOutput << "\n";
va_end(arg);
}
-static int nErrorCount = 0;
+static int s_nErrorCount = 0;
const static int MAX_ERROR_COUNT = 20;
-void sys_verror (int severity, const char *msg, va_list arg)
+void sys_verror (std::string& strOutput, int severity, const char *msg, va_list arg)
{
- if (severity < errorlevel)
- return; // ignore error if less than max level
+ if (severity < s_reportErrorLevel)
+ return; // ignore error if less than reporting level
+
+ std::ostringstream os;
+
+ if (severity > ERR_TRACE)
+ s_nErrorCount++;
- nErrorCount++;
if (severity != ERR_FATAL) {
- if (nErrorCount > MAX_ERROR_COUNT)
+ if (s_nErrorCount > MAX_ERROR_COUNT)
return;
- else if (nErrorCount == MAX_ERROR_COUNT) {
- cout << "*****************************************************************" << endl;
- cout << "*** M A X I M U M E R R O R C O U N T R E A C H E D ***" << endl;
- cout << "*** ***" << endl;
- cout << "*** No further errors will be reported ***" << endl;
- cout << "*****************************************************************" << endl;
+ else if (s_nErrorCount == MAX_ERROR_COUNT) {
+ 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";
+ strOutput = os.str();
return;
}
}
-
+
switch (severity) {
case ERR_FATAL:
- cout << "FATAL ERROR: ";
+ os << "FATAL ERROR: ";
break;
case ERR_SEVERE:
- cout << "SEVERE ERROR: ";
+ os << "SEVERE ERROR: ";
break;
case ERR_WARNING:
- cout << "WARNING ERROR: ";
+ os << "WARNING ERROR: ";
+ break;
+ case ERR_TRACE:
+ os << "Trace: ";
break;
default:
- sys_error (ERR_FATAL, "illegal error code #%d [sys_error]", severity);
+ os << "Illegal error severity #" << severity << ": ";
}
- char errStr[512];
+ char errStr[2000];
+
+#if HAVE_VSNPRINTF
vsnprintf (errStr, sizeof(errStr), msg, arg);
- cout << errStr << endl;
+#elif HAVE_VSPRINTF
+ vsprintf (errStr, msg, arg);
+#else
+ strncpy (errStr, sizeof(errStr), "Error message not available on this platform.");
+#endif
- if (severity == ERR_FATAL)
- throw 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
- cout << "A - Abort C - Continue W - Turn off warnings? ";
+ std::cout << "A - Abort C - Continue W - Turn off warnings? ";
// fflush(stderr);
do
- {
- 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')
- {
- sys_error_level (ERR_SEVERE); /* report severe & fatal errors */
- break;
- }
- } while (TRUE);
+ {
+ 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')
+ {
+ sys_error_level (ERR_SEVERE); /* report severe & fatal errors */
+ break;
+ }
+ } while (TRUE);
#endif
}
/* NAME
- * sys_error_level Set error reporting level
- *
- * SYNOPSIS
- * sys_error_level (severity)
- * int severity Report all error as serious as severity and beyond
- *
- * DESCRIPTION
- * Causes the system to ignore all error below the level of severity
- * For example, if severity == ERR_SEVERE, then report severe & fatal
- * error and ignore warnings
- */
+* sys_error_level Set error reporting level
+*
+* SYNOPSIS
+* sys_error_level (severity)
+* int severity Report all error as serious as severity and beyond
+*
+* DESCRIPTION
+* Causes the system to ignore all error below the level of severity
+* For example, if severity == ERR_SEVERE, then report severe & fatal
+* error and ignore warnings
+*/
void
sys_error_level (int severity)
{
if (severity == ERR_FATAL ||
- severity == ERR_SEVERE ||
- severity == ERR_WARNING)
- errorlevel = severity;
+ severity == ERR_SEVERE ||
+ severity == ERR_WARNING ||
+ severity == ERR_TRACE)
+ s_reportErrorLevel = severity;
else
- errorlevel = ERR_WARNING;
+ s_reportErrorLevel = ERR_WARNING;
}