00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _ErrorReporting_incl
00020 #define _ErrorReporting_incl
00021
00022 #include <rel/SmartPtr.h>
00023
00024 #include <stdio.h>
00025 #include <errno.h>
00026
00027 namespace rel
00028 {
00029
00030 class DebugChannel
00031 {
00032 public:
00033 enum MsgType
00034 {
00035 Debug,
00036 Info,
00037 Warning,
00038 Error,
00039 Fatal
00040 };
00041
00042 DebugChannel(MsgType type);
00043 virtual ~DebugChannel();
00044
00045
00046 virtual void emit(const char *file, int line, const char *message);
00047
00048 private:
00049 MsgType type;
00050
00051 };
00052
00053
00054
00055
00056 void rLogMessage(DebugChannel *channel,
00057 const char *file,
00058 int lineNum,
00059 const char *format, ...)
00060 #ifdef __GNUC__
00061 __attribute((format (printf, 4, 5)))
00062 #endif
00063 ;
00064
00065
00066
00067 void initializeDebugChannels();
00068
00069 }
00070
00071
00072
00073
00074 extern rel::SmartPtr<rel::DebugChannel> gDebugChannel;
00075 extern rel::SmartPtr<rel::DebugChannel> gInfoChannel;
00076 extern rel::SmartPtr<rel::DebugChannel> gWarningChannel;
00077 extern rel::SmartPtr<rel::DebugChannel> gErrorChannel;
00078 extern rel::SmartPtr<rel::DebugChannel> gFatalChannel;
00079
00080
00081 #define rMessage(Channel,Format,args...) \
00082 rel::rLogMessage(Channel, __FILE__,__LINE__,Format , ## args)
00083
00084
00085 #define rDebug(Format, args...) \
00086 rMessage(gDebugChannel.get(),Format , ## args)
00087
00088
00089 #define rInfo(Format, args...) \
00090 rMessage(gInfoChannel.get(),Format , ## args)
00091
00092
00093 #define rWarning(Format, args...) \
00094 rMessage(gWarningChannel.get(),Format , ## args)
00095
00096
00097 #define rError(Format, args...) \
00098 rMessage(gErrorChannel.get(),Format , ## args)
00099
00100
00101 #define rFatal(Format, args...) \
00102 rMessage(gFatalChannel.get(),Format , ## args)
00103
00104
00105
00106
00107 #define rPerror(Format,args...) \
00108 { \
00109 rError(Format, ## args); \
00110 if(errno < sys_nerr) \
00111 rError("errno = %i: %s", errno, sys_errlist[errno]); \
00112 else \
00113 rError("errno = %i", errno); \
00114 }
00115
00116
00117 #define assert_rError(CMD) \
00118 if(! (CMD) ) \
00119 rError("Assert failure: " #CMD);
00120
00121 #define assert_rFatal(CMD) \
00122 if(! (CMD) ) \
00123 rFatal("Assert failure: " #CMD);
00124
00125
00126 #endif // _ErrorReporting_incl