rlog.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Author:   Valient Gough <vgough@pobox.com>
00003  *
00004  *****************************************************************************
00005  * Copyright (c) 2002-2004, Valient Gough
00006  *
00007  * This library is free software; you can distribute it and/or modify it under
00008  * the terms of the GNU Lesser General Public License (LGPL), as published by
00009  * the Free Software Foundation; either version 2.1 of the License, or (at your
00010  * option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful, but WITHOUT
00013  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00014  * FITNESS FOR A PARTICULAR PURPOSE.  See the LGPL in the file COPYING for more
00015  * details.
00016  *
00017  */
00018                                                                                                 
00019 
00020 #ifndef _rlog_incl_
00021 #define _rlog_incl_
00022 
00023 #define CONCAT2(A,B) A##B
00024 #define CONCAT(A,B) CONCAT2(A,B)
00025 #define STR(X) #X
00026 
00027 #include <rlog/common.h>
00028 
00034 // may be useful for checking from configuration files
00035 #define CURRENT_RLOG_VERSION 20040503
00036 extern "C" int RLogVersion();
00037 
00038 namespace rlog
00039 {
00040 
00041     class RLogChannel;
00042     class RLogPublisher;
00043     class RLogNode;
00044 
00048     enum LogLevel
00049     {
00050         Log_Undef    =0, 
00051         Log_Critical,    
00052         Log_Error,       
00053         Log_Warning,     
00054         Log_Notice,      
00055         Log_Info,        
00056         Log_Debug        
00057     };
00058 
00069     void RLOG_DECL RLogInit(int &argc, char **argv);
00070 
00071 
00072     // Get channel with a particular component name
00073     RLOG_DECL RLogChannel *GetComponentChannel(const char *component, 
00074                                      const char *path, 
00075                                      LogLevel level = Log_Undef);
00076 
00077     // the global channel receives messages for all components
00078     RLOG_DECL RLogChannel *GetGlobalChannel( const char *path,
00079                                    LogLevel level = Log_Undef);
00080 
00124 #define DEF_CHANNEL(path,level) RLOG_CHANNEL_IMPL(RLOG_COMPONENT, path, level)
00125 #define RLOG_CHANNEL(path) RLOG_CHANNEL_IMPL(RLOG_COMPONENT, path, rlog::Log_Undef)
00126 #define RLOG_CHANNEL_IMPL(COMPONENT,path,level) \
00127     rlog::GetComponentChannel(STR(COMPONENT),path,level)
00128 
00129     /*
00130         Pre-defined channels, 
00131         "debug", "warning", and "error".
00132 
00133         You can of course defined sub-channels based on the predefined types,
00134         such as "debug/level1", or whatever.
00135     */
00136     extern RLOG_DECL RLogChannel *_RLDebugChannel;
00137     extern RLOG_DECL RLogChannel *_RLInfoChannel;
00138     extern RLOG_DECL RLogChannel *_RLWarningChannel;
00139     extern RLOG_DECL RLogChannel *_RLErrorChannel;
00140 
00153     struct PublishLoc
00154     {
00155         // If the compiler supports printf attribute specification on function
00156         // pointers, we'll use it here so that the compiler knows to check for
00157         // proper printf formatting.  If it doesn't support it, then we'll
00158         // force the check by inserting a bogus inline function..
00160         void (*publish)(PublishLoc *, RLogChannel *, const char *format, ... )
00161             PRINTF_FP(3,4);
00162         RLogNode *pub;
00163         const char *component;
00164         const char *fileName;
00165         const char *functionName;
00166         int lineNum;
00167         RLogChannel *channel;
00168     };
00169 
00176     void RLOG_DECL RLog_Register(PublishLoc *loc, RLogChannel *, 
00177                        const char *format, ... ) PRINTF(3,4);
00178 
00184     void RLOG_DECL rAssertFailed( const char *component, const char *file, 
00185                         const char *function, int line, 
00186                         const char *conditionStr );
00187 
00188     // if we don't have printf attributes on function pointers, but we do have
00189     // printf attributes, then make a bogus check function..
00190 #if !HAVE_PRINTF_FP && HAVE_PRINTF_ATTR
00191     void __checkArgs(int, const char *, ... ) PRINTF(2,3);
00192 
00193     inline void __checkArgs(int, const char *, ...)
00194     { }
00195 #endif
00196 }
00197 
00198 #if C99_VARIADAC_MACROS
00199 #include <rlog/rlog-c99.h>
00200 #elif PREC99_VARIADAC_MACROS
00201 #include <rlog/rlog-prec99.h>
00202 #else
00203 #include <rlog/rlog-novariadic.h>
00204 #endif
00205 
00206 
00207 #define _rAssertFailed(COMPONENT, COND) \
00208     rlog::rAssertFailed(STR(COMPONENT),__FILE__,__FUNCTION__,__LINE__, COND)
00209 
00220 #define rAssert( cond ) \
00221     do { \
00222         if( unlikely((cond) == false) ) \
00223         { rError( "Assert failed: " STR(cond) ); \
00224           _rAssertFailed(RLOG_COMPONENT, STR(cond)); \
00225         } \
00226     } while(0)
00227 
00235 #define rAssertSilent( cond ) \
00236     do { \
00237         if( unlikely((cond) == false) ) \
00238         { _rAssertFailed(RLOG_COMPONENT, STR(cond)); } \
00239     } while(0)
00240 
00241 
00246 /* @def RLOG_NO_COPY
00247     @brief Disables class copy constructor and operator =.
00248 
00249     This macro declares a private copy constructor and assignment operator
00250     which prevents automatic generation of these operation by the compiler.
00251 
00252     Attention, it switches access to private, so use it only at the end of the
00253     class declaration.
00254     */
00255 #define RLOG_NO_COPY(CNAME) \
00256     private: \
00257         CNAME(const CNAME&); \
00258         CNAME & operator = (const CNAME &)
00259 
00260 
00261 #endif // rlog.h
00262 

Generated on Mon Nov 20 22:57:44 2006 for rlog by  doxygen 1.5.0