1 /*****************************************************************************
2 ** This is part of the CTSim program
3 ** Copyright (C) 1983-2000 Kevin Rosenberg
5 ** $Id: syserror.cpp,v 1.14 2001/01/12 16:41:56 kevin Exp $
7 ** This program is free software; you can redistribute it and/or modify
8 ** it under the terms of the GNU General Public License (version 2) as
9 ** published by the Free Software Foundation.
11 ** This program is distributed in the hope that it will be useful,
12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ** GNU General Public License for more details.
16 ** You should have received a copy of the GNU General Public License
17 ** along with this program; if not, write to the Free Software
18 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 ******************************************************************************/
31 * sys_error System error handler
34 * sys_error (severity, msg, args . . .)
35 * int severity Severity of error
36 * char *msg Error message
37 * args Argument list, direct transfer to printf stack
38 * Can take 24 byte transfer
41 static int s_reportErrorLevel = ERR_WARNING; // Set error reporting level
44 #include "../src/ctsim.h"
45 bool g_bRunningWXWindows = false;
48 void sys_error (int severity, const char *msg, ...)
54 std::string strOutput;
55 sys_verror (strOutput, severity, msg, arg);
58 if (g_bRunningWXWindows)
59 *theApp->getLog() << strOutput.c_str();
62 std::cout << strOutput;
67 static int s_nErrorCount = 0;
68 const static int MAX_ERROR_COUNT = 20;
71 void sys_verror (std::string& strOutput, int severity, const char *msg, va_list arg)
73 if (severity < s_reportErrorLevel)
74 return; // ignore error if less than reporting level
76 std::ostringstream os;
79 if (severity != ERR_FATAL) {
80 if (s_nErrorCount > MAX_ERROR_COUNT)
82 else if (s_nErrorCount == MAX_ERROR_COUNT) {
83 os << "*****************************************************************\n";
84 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";
86 os << "*** No further errors will be reported ***\n";
87 os << "*****************************************************************\n";
95 os << "FATAL ERROR: ";
98 os << "SEVERE ERROR: ";
101 os << "WARNING ERROR: ";
107 os << "Illegal error severity #" << severity << ": ";
113 vsnprintf (errStr, sizeof(errStr), msg, arg);
115 vsprintf (errStr, msg, arg);
117 strncpy (errStr, sizeof(errStr), "Error message not available on this platform.");
120 os << errStr << "\n";
121 strOutput = os.str();
123 if (severity == ERR_FATAL) {
124 std::cerr << strOutput;
125 throw std::runtime_error (strOutput);
128 #if INTERACTIVE_ERROR_DISPLAY
129 std::cout << "A - Abort C - Continue W - Turn off warnings? ";
133 int c = cio_kb_waitc("AaBbCcWw", TRUE); /* get code from keyboard */
136 fputc (NEWLINE, stderr);
144 sys_error_level (ERR_SEVERE); /* report severe & fatal errors */
153 * sys_error_level Set error reporting level
156 * sys_error_level (severity)
157 * int severity Report all error as serious as severity and beyond
160 * Causes the system to ignore all error below the level of severity
161 * For example, if severity == ERR_SEVERE, then report severe & fatal
162 * error and ignore warnings
166 sys_error_level (int severity)
168 if (severity == ERR_FATAL ||
169 severity == ERR_SEVERE ||
170 severity == ERR_WARNING ||
171 severity == ERR_TRACE)
172 s_reportErrorLevel = severity;
174 s_reportErrorLevel = ERR_WARNING;