r322: *** empty log message ***
[ctsim.git] / libctsupport / syserror.cpp
1 /*****************************************************************************
2 **  This is part of the CTSim program
3 **  Copyright (C) 1983-2000 Kevin Rosenberg
4 **
5 **  $Id: syserror.cpp,v 1.11 2000/12/29 20:11:42 kevin Exp $
6 **
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.
10 **
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.
15 **
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 ******************************************************************************/
20
21 #include <iostream>
22 #include <exception>
23 #include <stdexcept>
24 #include <stdarg.h>
25 #include <ctype.h>\r
26 #include <string>
27 #include "ct.h"
28
29
30 /* NAME
31 *   sys_error                   System error handler
32 *
33 * SYNOPSIS
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
39 */
40
41 static int s_reportErrorLevel = ERR_WARNING;    // Set error reporting level 
42 \r
43 bool g_bRunningWXWindows = false;
44
45 void sys_error (int severity, const char *msg, ...)
46 {
47   va_list arg;
48   
49   va_start(arg, msg);
50   \r
51   std::string strOutput;
52   sys_verror (strOutput, severity, msg, arg);
53   \r
54 //  if (g_bRunningWXWindows)\r
55 //    theApp->getLog() << strOutput.c_str();\r
56 //  else\r
57     std::cout << strOutput;\r
58
59   va_end(arg);
60 }
61
62 static int s_nErrorCount = 0;
63 const static int MAX_ERROR_COUNT = 20;
64
65
66 void sys_verror (std::string& strOutput, int severity, const char *msg, va_list arg)
67 {
68   if (severity < s_reportErrorLevel)
69     return;     // ignore error if less than reporting level
70   
71   std::ostringstream os;\r
72
73   s_nErrorCount++;\r
74   if (severity != ERR_FATAL) {
75     if (s_nErrorCount > MAX_ERROR_COUNT)
76       return;
77     else if (s_nErrorCount == MAX_ERROR_COUNT) {
78       os << "*****************************************************************\n";
79       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";
80       os << "***                                                           ***\n";
81       os << "***           No further errors will be reported              ***\n";
82       os << "*****************************************************************\n";\r
83       strOutput = os.str();
84       return;
85     }
86   }
87   
88   switch (severity) {
89   case ERR_FATAL:
90     os << "FATAL ERROR: ";
91     break;
92   case ERR_SEVERE:
93     os << "SEVERE ERROR: ";
94     break;
95   case ERR_WARNING:
96     os << "WARNING ERROR: ";
97     break;\r
98   case ERR_TRACE:\r
99     os << "Trace: ";\r
100     break;
101   default:
102     os << "Illegal error severity #" << severity << ": ";
103   }
104   
105   char errStr[2000];\r
106   
107 #if HAVE_VSNPRINTF
108   vsnprintf (errStr, sizeof(errStr), msg, arg);
109 #elif HAVE_VSPRINTF
110   vsprintf (errStr, msg, arg);\r
111 #else\r
112   strncpy (errStr, sizeof(errStr), "Error message not available on this platform.");
113 #endif
114   
115   os << errStr << "\n";
116   strOutput = os.str();\r
117   
118   if (severity == ERR_FATAL)
119     throw std::runtime_error (errStr);
120   
121 #if INTERACTIVE_ERROR_DISPLAY
122   std::cout << "A - Abort  C - Continue  W - Turn off warnings? ";
123   //  fflush(stderr);
124   do 
125   {
126     int c = cio_kb_waitc("AaBbCcWw", TRUE);       /* get code from keyboard */
127     c = tolower (c);
128     fputc (c, stderr);
129     fputc (NEWLINE, stderr);
130     
131     if (c == 'a')
132       exit (1);
133     else if (c == 'c')
134       return;
135     else if (c == 'w') 
136     {
137       sys_error_level (ERR_SEVERE);     /* report severe & fatal errors */
138       break;
139     }
140   } while (TRUE);
141 #endif
142 }
143
144
145 /* NAME
146 *   sys_error_level                     Set error reporting level
147 *
148 * SYNOPSIS
149 *   sys_error_level (severity)
150 *   int severity                Report all error as serious as severity and beyond
151 *
152 * DESCRIPTION
153 *   Causes the system to ignore all error below the level of severity
154 *   For example, if severity == ERR_SEVERE, then report severe & fatal
155 *   error and ignore warnings
156 */
157
158 void 
159 sys_error_level (int severity)
160 {
161   if (severity == ERR_FATAL ||
162     severity == ERR_SEVERE ||
163     severity == ERR_WARNING ||\r
164     severity == ERR_TRACE)
165     s_reportErrorLevel = severity;
166   else
167     s_reportErrorLevel = ERR_WARNING;
168 }
169