|
OpenADFortTk (basic)
|
00001 // -*-Mode: C++;-*- 00002 // $Header: /Volumes/cvsrep/developer/OpenADFortTk/src/lib/support/diagnostics.h,v 1.11 2005/03/19 22:54:51 eraxxon Exp $ 00003 #ifndef Diagnostics_INCLUDED 00004 #define Diagnostics_INCLUDED 00005 00006 #include "Exception.h" 00007 00008 namespace fortTkSupport { 00009 00015 class Diagnostics { 00016 public: 00017 static void setDiagnosticFilterLevel(int lvl); 00018 static int getDiagnosticFilterLevel(); 00019 static const char* Unimplemented; 00020 static const char* UnexpectedInput; 00021 static const char* UnexpectedOpr; 00022 // This routine is called before an error that stops execution. It is 00023 // especially useful for use with debuggers that do not have good 00024 // exception support. 00025 static void theMostVisitedBreakpointInHistory(const char* filenm = NULL, 00026 unsigned int lineno = 0); 00027 private: 00032 static int ourUserDebugLevel; 00033 }; 00034 00035 } // end namespace 00036 00037 // Private debugging level: messages for in-house debugging [0-9] 00038 #define FORTTK_DBG_LVL 0 00039 00040 // FORTTK_DIAGIF: If public diagnostic level is at least 'level' ... 00041 #define FORTTK_DIAGIF(level) if (level <= fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) 00042 00043 // FORTTK_DIAGIF_DEV: If development diagnostic level is at least 'level' ... 00044 #define FORTTK_DIAGIF_DEV(level) if (level <= FORTTK_DBG_LVL) 00045 00046 // All of these macros have a parameter named 'streamArgs' for one or 00047 // more ostream arguments. These macros use these arguments to create 00048 // a message string. Example: 00049 // if (...) FORTTK_ERR("bad val: '" << v << "'") 00050 00051 // FORTTK_MSG: Print a message if level satisfies the diagnostic filter 00052 #define FORTTK_MSG(level, streamArgs) \ 00053 if (level <= fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) { \ 00054 std::cerr << "FortTk: " << streamArgs << std::endl; } 00055 00056 // FORTTK_DEVMSG: Print a message if private level satisfies the 00057 // private diagnostic filter 00058 #define FORTTK_DEVMSG(level, streamArgs) \ 00059 if (level <= FORTTK_DBG_LVL) { \ 00060 std::cerr << "FortTk[debugLevel=" << level << "]: " << streamArgs << std::endl; } 00061 00062 // FORTTK_EMSG: Print an error message and continue. 00063 #define FORTTK_EMSG(streamArgs) \ 00064 { std::cerr << "FortTk: ERROR:"; \ 00065 if (fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) { \ 00066 std::cerr << "[" << __FILE__ << ":" << __LINE__ << "]"; } \ 00067 std::cerr << ": " << streamArgs << std::endl; } 00068 00069 // FORTTK_WMSG: Print an warning message and continue. 00070 #define FORTTK_WMSG(streamArgs) \ 00071 { std::cerr << "FortTk: WARNING:"; \ 00072 if (fortTkSupport::Diagnostics::getDiagnosticFilterLevel()) { \ 00073 std::cerr << "[" << __FILE__ << ":" << __LINE__ << "]"; } \ 00074 std::cerr << ": " << streamArgs << std::endl; } 00075 00076 // FORTTK_ASSERT: Throw an assertion (die) if 'expr' evaluates to 00077 // false. Stops at 'FortTk_TheMostVisitedBreakpointInHistory'. 00078 #define FORTTK_ASSERT(expr, streamArgs) \ 00079 if (!(expr)) FORTTK_THROW(streamArgs) 00080 00081 // FORTTK_ASSERT_WARN: Print a warning if 'expr' evaluates to false. 00082 // Stops at 'FortTk_TheMostVisitedBreakpointInHistory'. 00083 #define FORTTK_ASSERT_WARN(expr, streamArgs) \ 00084 if (!(expr)) FORTTK_WMSG(streamArgs) 00085 00086 // FORTTK_DIE: Print an error message and die. Stops at 00087 // 'FortTk_TheMostVisitedBreakpointInHistory'. 00088 // (Equivalent to FORTTK_THROW.) 00089 #define FORTTK_DIE(streamArgs) \ 00090 FORTTK_THROW(streamArgs) 00091 00092 // FORTTK_THROW: (C++ only) Throw a fatal exception. Stops at 00093 // 'FortTk_TheMostVisitedBreakpointInHistory'. 00094 // (Equivalent to FORTTK_DIE.) Based on Jean Utke's code in xaifBooster. 00095 #define FORTTK_THROW(streamArgs) \ 00096 { std::ostringstream WeIrDnAmE; \ 00097 WeIrDnAmE << streamArgs << std::ends; \ 00098 throw fortTkSupport::FatalException(WeIrDnAmE.str(), __FILE__, __LINE__); } 00099 00100 #endif 00101