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