1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>rlog: rlog.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.0 -->
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li id="current"><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
</ul></div>
<h1>rlog.h</h1><a href="rlog_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*****************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"> * Author: Valient Gough <vgough@pobox.com></span>
<a name="l00003"></a>00003 <span class="comment"> *</span>
<a name="l00004"></a>00004 <span class="comment"> *****************************************************************************</span>
<a name="l00005"></a>00005 <span class="comment"> * Copyright (c) 2002-2004, Valient Gough</span>
<a name="l00006"></a>00006 <span class="comment"> *</span>
<a name="l00007"></a>00007 <span class="comment"> * This library is free software; you can distribute it and/or modify it under</span>
<a name="l00008"></a>00008 <span class="comment"> * the terms of the GNU Lesser General Public License (LGPL), as published by</span>
<a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; either version 2.1 of the License, or (at your</span>
<a name="l00010"></a>00010 <span class="comment"> * option) any later version.</span>
<a name="l00011"></a>00011 <span class="comment"> *</span>
<a name="l00012"></a>00012 <span class="comment"> * This library is distributed in the hope that it will be useful, but WITHOUT</span>
<a name="l00013"></a>00013 <span class="comment"> * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</span>
<a name="l00014"></a>00014 <span class="comment"> * FITNESS FOR A PARTICULAR PURPOSE. See the LGPL in the file COPYING for more</span>
<a name="l00015"></a>00015 <span class="comment"> * details.</span>
<a name="l00016"></a>00016 <span class="comment"> *</span>
<a name="l00017"></a>00017 <span class="comment"> */</span>
<a name="l00018"></a>00018
<a name="l00019"></a>00019
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _rlog_incl_</span>
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _rlog_incl_</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span>
<a name="l00023"></a>00023 <span class="preprocessor">#define CONCAT2(A,B) A##B</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#define CONCAT(A,B) CONCAT2(A,B)</span>
<a name="l00025"></a>00025 <span class="preprocessor"></span><span class="preprocessor">#define STR(X) #X</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include <rlog/common.h></span>
<a name="l00028"></a>00028
<a name="l00034"></a>00034 <span class="comment">// may be useful for checking from configuration files</span>
<a name="l00035"></a>00035 <span class="preprocessor">#define CURRENT_RLOG_VERSION 20040503</span>
<a name="l00036"></a>00036 <span class="preprocessor"></span><span class="keyword">extern</span> <span class="stringliteral">"C"</span> <span class="keywordtype">int</span> RLogVersion();
<a name="l00037"></a>00037
<a name="l00038"></a>00038 <span class="keyword">namespace </span>rlog
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040
<a name="l00041"></a>00041 <span class="keyword">class </span>RLogChannel;
<a name="l00042"></a>00042 <span class="keyword">class </span>RLogPublisher;
<a name="l00043"></a>00043 <span class="keyword">class </span>RLogNode;
<a name="l00044"></a>00044
<a name="l00048"></a>00048 <span class="keyword">enum</span> LogLevel
<a name="l00049"></a>00049 {
<a name="l00050"></a>00050 Log_Undef =0,
<a name="l00051"></a>00051 Log_Critical,
<a name="l00052"></a>00052 Log_Error,
<a name="l00053"></a>00053 Log_Warning,
<a name="l00054"></a>00054 Log_Notice,
<a name="l00055"></a>00055 Log_Info,
<a name="l00056"></a>00056 Log_Debug
<a name="l00057"></a>00057 };
<a name="l00058"></a>00058
<a name="l00069"></a>00069 <span class="keywordtype">void</span> RLOG_DECL RLogInit(<span class="keywordtype">int</span> &argc, <span class="keywordtype">char</span> **argv);
<a name="l00070"></a>00070
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <span class="comment">// Get channel with a particular component name</span>
<a name="l00073"></a>00073 RLOG_DECL RLogChannel *GetComponentChannel(<span class="keyword">const</span> <span class="keywordtype">char</span> *component,
<a name="l00074"></a>00074 <span class="keyword">const</span> <span class="keywordtype">char</span> *path,
<a name="l00075"></a>00075 LogLevel level = Log_Undef);
<a name="l00076"></a>00076
<a name="l00077"></a>00077 <span class="comment">// the global channel receives messages for all components</span>
<a name="l00078"></a>00078 RLOG_DECL RLogChannel *GetGlobalChannel( <span class="keyword">const</span> <span class="keywordtype">char</span> *path,
<a name="l00079"></a>00079 LogLevel level = Log_Undef);
<a name="l00080"></a>00080
<a name="l00124"></a><a class="code" href="rlog_8h.html#ae55883696f0d46d890824be09d70d5d">00124</a> <span class="preprocessor">#define DEF_CHANNEL(path,level) RLOG_CHANNEL_IMPL(RLOG_COMPONENT, path, level)</span>
<a name="l00125"></a>00125 <span class="preprocessor"></span><span class="preprocessor">#define RLOG_CHANNEL(path) RLOG_CHANNEL_IMPL(RLOG_COMPONENT, path, rlog::Log_Undef)</span>
<a name="l00126"></a>00126 <span class="preprocessor"></span><span class="preprocessor">#define RLOG_CHANNEL_IMPL(COMPONENT,path,level) \</span>
<a name="l00127"></a>00127 <span class="preprocessor"> rlog::GetComponentChannel(STR(COMPONENT),path,level)</span>
<a name="l00128"></a>00128 <span class="preprocessor"></span>
<a name="l00129"></a>00129 <span class="comment">/*</span>
<a name="l00130"></a>00130 <span class="comment"> Pre-defined channels, </span>
<a name="l00131"></a>00131 <span class="comment"> "debug", "warning", and "error".</span>
<a name="l00132"></a>00132 <span class="comment"></span>
<a name="l00133"></a>00133 <span class="comment"> You can of course defined sub-channels based on the predefined types,</span>
<a name="l00134"></a>00134 <span class="comment"> such as "debug/level1", or whatever.</span>
<a name="l00135"></a>00135 <span class="comment"> */</span>
<a name="l00136"></a>00136 <span class="keyword">extern</span> RLOG_DECL RLogChannel *_RLDebugChannel;
<a name="l00137"></a>00137 <span class="keyword">extern</span> RLOG_DECL RLogChannel *_RLInfoChannel;
<a name="l00138"></a>00138 <span class="keyword">extern</span> RLOG_DECL RLogChannel *_RLWarningChannel;
<a name="l00139"></a>00139 <span class="keyword">extern</span> RLOG_DECL RLogChannel *_RLErrorChannel;
<a name="l00140"></a>00140
<a name="l00153"></a><a class="code" href="structrlog_1_1PublishLoc.html">00153</a> <span class="keyword">struct </span><a class="code" href="structrlog_1_1PublishLoc.html">PublishLoc</a>
<a name="l00154"></a>00154 {
<a name="l00155"></a>00155 <span class="comment">// If the compiler supports printf attribute specification on function</span>
<a name="l00156"></a>00156 <span class="comment">// pointers, we'll use it here so that the compiler knows to check for</span>
<a name="l00157"></a>00157 <span class="comment">// proper printf formatting. If it doesn't support it, then we'll</span>
<a name="l00158"></a>00158 <span class="comment">// force the check by inserting a bogus inline function..</span>
<a name="l00160"></a>00160 <span class="comment"></span> void (*<a class="code" href="structrlog_1_1PublishLoc.html#94d3c16116a024bfe80432861439d498">publish</a>)(<a class="code" href="structrlog_1_1PublishLoc.html">PublishLoc</a> *, <a class="code" href="classrlog_1_1RLogChannel.html">RLogChannel</a> *, <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ... )
<a name="l00161"></a>00161 PRINTF_FP(3,4);
<a name="l00162"></a>00162 <a class="code" href="classrlog_1_1RLogNode.html">RLogNode</a> *pub;
<a name="l00163"></a>00163 <span class="keyword">const</span> <span class="keywordtype">char</span> *component;
<a name="l00164"></a>00164 <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName;
<a name="l00165"></a>00165 <span class="keyword">const</span> <span class="keywordtype">char</span> *functionName;
<a name="l00166"></a>00166 <span class="keywordtype">int</span> lineNum;
<a name="l00167"></a>00167 <a class="code" href="classrlog_1_1RLogChannel.html">RLogChannel</a> *channel;
<a name="l00168"></a>00168 };
<a name="l00169"></a>00169
<a name="l00176"></a>00176 <span class="keywordtype">void</span> RLOG_DECL RLog_Register(<a class="code" href="structrlog_1_1PublishLoc.html">PublishLoc</a> *loc, <a class="code" href="classrlog_1_1RLogChannel.html">RLogChannel</a> *,
<a name="l00177"></a>00177 <span class="keyword">const</span> <span class="keywordtype">char</span> *format, ... ) PRINTF(3,4);
<a name="l00178"></a>00178
<a name="l00184"></a>00184 <span class="keywordtype">void</span> RLOG_DECL rAssertFailed( const <span class="keywordtype">char</span> *component, const <span class="keywordtype">char</span> *file,
<a name="l00185"></a>00185 const <span class="keywordtype">char</span> *function, <span class="keywordtype">int</span> line,
<a name="l00186"></a>00186 const <span class="keywordtype">char</span> *conditionStr );
<a name="l00187"></a>00187
<a name="l00188"></a>00188 <span class="comment">// if we don't have printf attributes on function pointers, but we do have</span>
<a name="l00189"></a>00189 <span class="comment">// printf attributes, then make a bogus check function..</span>
<a name="l00190"></a>00190 <span class="preprocessor">#if !HAVE_PRINTF_FP && HAVE_PRINTF_ATTR</span>
<a name="l00191"></a>00191 <span class="preprocessor"></span> <span class="keywordtype">void</span> __checkArgs(<span class="keywordtype">int</span>, <span class="keyword">const</span> <span class="keywordtype">char</span> *, ... ) PRINTF(2,3);
<a name="l00192"></a>00192
<a name="l00193"></a>00193 inline <span class="keywordtype">void</span> __checkArgs(<span class="keywordtype">int</span>, const <span class="keywordtype">char</span> *, ...)
<a name="l00194"></a>00194 { }
<a name="l00195"></a>00195 <span class="preprocessor">#endif</span>
<a name="l00196"></a>00196 <span class="preprocessor"></span>}
<a name="l00197"></a>00197
<a name="l00198"></a>00198 <span class="preprocessor">#if C99_VARIADAC_MACROS</span>
<a name="l00199"></a>00199 <span class="preprocessor"></span><span class="preprocessor">#include <rlog/rlog-c99.h></span>
<a name="l00200"></a>00200 <span class="preprocessor">#elif PREC99_VARIADAC_MACROS</span>
<a name="l00201"></a>00201 <span class="preprocessor"></span><span class="preprocessor">#include <rlog/rlog-prec99.h></span>
<a name="l00202"></a>00202 <span class="preprocessor">#else</span>
<a name="l00203"></a>00203 <span class="preprocessor"></span><span class="preprocessor">#include <rlog/rlog-novariadic.h></span>
<a name="l00204"></a>00204 <span class="preprocessor">#endif</span>
<a name="l00205"></a>00205 <span class="preprocessor"></span>
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="preprocessor">#define _rAssertFailed(COMPONENT, COND) \</span>
<a name="l00208"></a>00208 <span class="preprocessor"> rlog::rAssertFailed(STR(COMPONENT),__FILE__,__FUNCTION__,__LINE__, COND)</span>
<a name="l00209"></a>00209 <span class="preprocessor"></span>
<a name="l00220"></a><a class="code" href="rlog_8h.html#964127b894c48e2d41a5e6bdbcc3455b">00220</a> <span class="preprocessor">#define rAssert( cond ) \</span>
<a name="l00221"></a>00221 <span class="preprocessor"> do { \</span>
<a name="l00222"></a>00222 <span class="preprocessor"> if( unlikely((cond) == false) ) \</span>
<a name="l00223"></a>00223 <span class="preprocessor"> { rError( "Assert failed: " STR(cond) ); \</span>
<a name="l00224"></a>00224 <span class="preprocessor"> _rAssertFailed(RLOG_COMPONENT, STR(cond)); \</span>
<a name="l00225"></a>00225 <span class="preprocessor"> } \</span>
<a name="l00226"></a>00226 <span class="preprocessor"> } while(0)</span>
<a name="l00227"></a>00227 <span class="preprocessor"></span>
<a name="l00235"></a><a class="code" href="rlog_8h.html#ff23c3efdd657d856c9d12b0ef8e746b">00235</a> <span class="preprocessor">#define rAssertSilent( cond ) \</span>
<a name="l00236"></a>00236 <span class="preprocessor"> do { \</span>
<a name="l00237"></a>00237 <span class="preprocessor"> if( unlikely((cond) == false) ) \</span>
<a name="l00238"></a>00238 <span class="preprocessor"> { _rAssertFailed(RLOG_COMPONENT, STR(cond)); } \</span>
<a name="l00239"></a>00239 <span class="preprocessor"> } while(0)</span>
<a name="l00240"></a>00240 <span class="preprocessor"></span>
<a name="l00241"></a>00241
<a name="l00246"></a>00246 <span class="comment">/* @def RLOG_NO_COPY</span>
<a name="l00247"></a>00247 <span class="comment"> @brief Disables class copy constructor and operator =.</span>
<a name="l00248"></a>00248 <span class="comment"></span>
<a name="l00249"></a>00249 <span class="comment"> This macro declares a private copy constructor and assignment operator</span>
<a name="l00250"></a>00250 <span class="comment"> which prevents automatic generation of these operation by the compiler.</span>
<a name="l00251"></a>00251 <span class="comment"></span>
<a name="l00252"></a>00252 <span class="comment"> Attention, it switches access to private, so use it only at the end of the</span>
<a name="l00253"></a>00253 <span class="comment"> class declaration.</span>
<a name="l00254"></a>00254 <span class="comment"> */</span>
<a name="l00255"></a>00255 <span class="preprocessor">#define RLOG_NO_COPY(CNAME) \</span>
<a name="l00256"></a>00256 <span class="preprocessor"> private: \</span>
<a name="l00257"></a>00257 <span class="preprocessor"> CNAME(const CNAME&); \</span>
<a name="l00258"></a>00258 <span class="preprocessor"> CNAME & operator = (const CNAME &)</span>
<a name="l00259"></a>00259 <span class="preprocessor"></span>
<a name="l00260"></a>00260
<a name="l00261"></a>00261 <span class="preprocessor">#endif // rlog.h</span>
<a name="l00262"></a>00262 <span class="preprocessor"></span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Nov 20 22:57:44 2006 for rlog by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.0 </small></address>
</body>
</html>
|