1 
2 #ifndef ERRORDESC_H
3 #define ERRORDESC_H
4 
5 /*
6 * NIST Utils Class Library
7 * clutils/errordesc.h
8 * April 1997
9 * David Sauder
10 * K. C. Morris
11 
12 * Development of this software was funded by the United States Government,
13 * and is not subject to copyright.
14 */
15 
16 #include <sc_export.h>
17 #include <string>
18 #include <iostream>
19 using namespace std;
20 
21 #define _POC_  " report problem to scl-dev at groups.google.com"
22 
23 typedef enum Severity {
24     SEVERITY_MAX    = -5,
25     SEVERITY_DUMP   = -4,
26     SEVERITY_EXIT   = -3,   // fatal
27     SEVERITY_BUG    = -2,   // non-recoverable error -- probably bug
28     SEVERITY_INPUT_ERROR = -1,  // non-recoverable error
29     SEVERITY_WARNING    = 0,    // recoverable error
30     SEVERITY_INCOMPLETE = 1,    // incomplete data
31     SEVERITY_USERMSG    = 2,    // possibly an error
32     SEVERITY_NULL   = 3 // no error or message
33 } Severity;
34 
35 #define  DEBUG_OFF  0
36 #define  DEBUG_USR  1
37 #define  DEBUG_ALL  2
38 typedef int DebugLevel;
39 
40 /******************************************************************
41  ** Class:  ErrorDescriptor
42  ** Data Members:
43  **    severity level of error
44  **    user message
45  **    detailed message
46  ** Description:
47  **    the error is a detailed error message + a severity level
48  **    also keeps a user message separately
49  **    detailed message gets sent to ostream
50  **    uses std::string class to keep the user messages
51  **    keeps severity of error
52  **    created with or without error
53  ** Status:
54  ******************************************************************/
55 
56 class SC_UTILS_EXPORT ErrorDescriptor {
57     private:
58         std::string _userMsg, _detailMsg;
59     protected:
60         Severity    _severity;
61 
62         static DebugLevel   _debug_level;
63         static ostream * _out; // note this will not be persistent
64     public:
65         ErrorDescriptor( Severity s    = SEVERITY_NULL,
66                          DebugLevel d  = DEBUG_OFF );
67         ~ErrorDescriptor( void );
68 
69         void PrintContents( ostream & out = cout ) const;
70 
ClearErrorMsg()71         void ClearErrorMsg() {
72             _severity = SEVERITY_NULL;
73             _userMsg.clear();
74             _detailMsg.clear();
75         }
76 
77         // return the enum value of _severity
severity()78         Severity severity() const {
79             return _severity;
80         }
severity(Severity s)81         Severity severity( Severity s ) {
82             return ( _severity = s );
83         }
84         std::string severityString() const;
85         Severity GetCorrSeverity( const char * s );
GreaterSeverity(Severity s)86         Severity GreaterSeverity( Severity s ) {
87             return ( ( s < _severity ) ?  _severity = s : _severity );
88         }
89 
UserMsg()90         std::string UserMsg() const {
91             return _userMsg;
92         }
93         void UserMsg( const char * msg );
UserMsg(const std::string msg)94         void UserMsg( const std::string msg ) {
95             _userMsg.assign( msg );
96         }
97 
98         void AppendToUserMsg( const char * msg );
99         void AppendToUserMsg( const char c );
AppendToUserMsg(const std::string & msg)100         void AppendToUserMsg( const std::string & msg ) {
101             _userMsg.append( msg );
102         }
103         void PrependToUserMsg( const char * msg );
104 
DetailMsg()105         std::string DetailMsg() const {
106             return _detailMsg;
107         }
DetailMsg(const std::string msg)108         void DetailMsg( const std::string msg ) {
109             _detailMsg.assign( msg );
110         }
111         void DetailMsg( const char * msg );
112         void AppendToDetailMsg( const char * msg );
AppendToDetailMsg(const std::string & msg)113         void AppendToDetailMsg( const std::string & msg ) {
114             _detailMsg.append( msg );
115         }
116         void PrependToDetailMsg( const char * msg );
117         void AppendToDetailMsg( const char c );
118 
AppendFromErrorArg(ErrorDescriptor * err)119         Severity AppendFromErrorArg( ErrorDescriptor * err ) {
120             GreaterSeverity( err->severity() );
121             AppendToDetailMsg( err->DetailMsg() );
122             AppendToUserMsg( err->UserMsg() );
123             return severity();
124         }
125 
debug_level()126         DebugLevel debug_level() const        {
127             return _debug_level;
128         }
debug_level(DebugLevel d)129         void debug_level( DebugLevel d )   {
130             _debug_level = d;
131         }
SetOutput(ostream * o)132         void SetOutput( ostream * o )      {
133             _out = o;
134         }
135 } ;
136 
137 #endif
138