Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Logger.C

Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2000-2002, Jelle Kok, University of Amsterdam
00003 All rights reserved.
00004 
00005 Redistribution and use in source and binary forms, with or without 
00006 modification, are permitted provided that the following conditions are met:
00007 
00008 1. Redistributions of source code must retain the above copyright notice, this 
00009 list of conditions and the following disclaimer. 
00010 
00011 2. Redistributions in binary form must reproduce the above copyright notice, 
00012 this list of conditions and the following disclaimer in the documentation 
00013 and/or other materials provided with the distribution. 
00014 
00015 3. Neither the name of the University of Amsterdam nor the names of its 
00016 contributors may be used to endorse or promote products derived from this 
00017 software without specific prior written permission. 
00018 
00019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
00020 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00021 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00022 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
00023 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
00024 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
00025 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00026 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
00027 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
00028 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 */
00050 #include "Logger.h"
00051 #include <stdio.h>    // needed for vsprintf
00052 #include <string>     // needed for string
00053 #ifdef Solaris
00054  #include <varargs.h> // needed for va_list and va_start under Solaris
00055 #endif
00056 
00057 Logger Log;          
00059 /*****************************************************************************/
00060 /**************************** LOGGER *****************************************/
00061 /*****************************************************************************/
00062 
00070 Logger::Logger( ostream& o, int iMin, int iMax )
00071 {
00072   strcpy( m_strHeader, "" );
00073   m_timing.restartTime();
00074   m_os = &o;
00075 }
00076 
00084 bool Logger::log( int iLevel, string str)
00085 {
00086   if( isInLogLevel( iLevel ) )
00087   {
00088     *m_os << m_strHeader << str;
00089     return true;
00090   }
00091 
00092   return false;
00093 }
00094 
00105 bool Logger::log( int iLevel, char *str, ... )
00106 {
00107   if( isInLogLevel( iLevel ) )
00108   {
00109     va_list ap;
00110 #ifdef Solaris
00111     va_start( ap );
00112 #else
00113     va_start( ap, str );
00114 #endif
00115     vsprintf( m_buf, str, ap );
00116     va_end(ap);
00117 
00118     *m_os << m_strHeader << m_buf << endl;
00119     return true;
00120   }
00121 
00122   return false;
00123 }
00124 
00136 bool Logger::logWithTime( int iLevel, char *str, ... )
00137 {
00138   if( isInLogLevel( iLevel ) )
00139   {
00140     va_list ap;
00141 #ifdef Solaris
00142     va_start( ap );
00143 #else
00144     va_start( ap, str );
00145 #endif
00146     vsprintf( m_buf, str, ap );
00147     va_end(ap);
00148 
00149     string s = m_strHeader;
00150     s.append( m_buf );
00151     s.copy( m_buf, string::npos );
00152     m_buf[s.length()] = '\0';
00153     m_timing.printTimeDiffWithText( *m_os, m_buf );
00154     return true;
00155   }
00156 
00157   return false;
00158 }
00159 
00161 void Logger::restartTimer()
00162 {
00163   return m_timing.restartTime();
00164 }
00165 
00168 Timing Logger::getTiming( )
00169 {
00170   return m_timing;
00171 }
00172 
00173 
00178 bool Logger::isInLogLevel( int iLevel )
00179 {
00180   return m_setLogLevels.find( iLevel ) != m_setLogLevels.end() ;
00181 }
00182 
00187 bool  Logger::addLogLevel( int iLevel )
00188 {
00189   m_setLogLevels.insert( iLevel ); 
00190   return true;
00191 }
00192 
00198 bool  Logger::addLogRange( int iMin, int iMax )
00199 {
00200   bool bReturn = true;
00201   for( int i = iMin ; i <= iMax;  i++ )
00202     bReturn &= addLogLevel( i );
00203   return bReturn;
00204 }
00205 
00209 char* Logger::getHeader( )
00210 {
00211   return m_strHeader;
00212 }
00213 
00217 bool Logger::setHeader( char *str )
00218 {
00219   strcpy( m_strHeader, str );
00220   return true;
00221 }
00222 
00229 bool Logger::setHeader( int i1, int i2 )
00230 {
00231   sprintf( m_strHeader, "(%d, %d) ", i1, i2 );
00232   return true;
00233 }
00234 
00240 bool Logger::setOutputStream( ostream& o )
00241 {
00242   m_os = &o;
00243   return true;
00244 }
00245 
00250 ostream& Logger::getOutputStream(  )
00251 {
00252   return *m_os;
00253 }
00254 
00258 void Logger::showLogLevels( ostream &os )
00259 {
00260   set<int>::iterator itr;
00261   for (itr = m_setLogLevels.begin() ; itr != m_setLogLevels.end() ; itr++)
00262     os << *itr << " " ;
00263   os << endl;
00264   
00265 }
00266 /******************************************************************************/
00267 /*********************** CLASS TIMING *****************************************/
00268 /******************************************************************************/
00269 
00274 double Timing::getTimeDifference( struct timeval tv1, struct timeval tv2 )
00275 {
00276 
00277   return  ((double)tv1.tv_sec + (double)tv1.tv_usec/1000000 ) -
00278           ((double)tv2.tv_sec + (double)tv2.tv_usec/1000000 ) ;
00279 }
00280 
00289 void Timing::printTimeDiffWithText( ostream &os, char *str, int iFactor )
00290 {
00291   // set the with to 6 and fill remaining places with '0'.
00292   os <<setw(6)<< setfill('0')<< getElapsedTime()*iFactor << ":" << str << endl;
00293 }
00294 
00298 double Timing::getElapsedTime( )
00299 {
00300   struct timeval time2;
00301   gettimeofday( &time2, NULL );
00302   return getTimeDifference( time2, time1 );
00303 }
00304 
00306 void Timing::restartTime( )
00307 {
00308   gettimeofday( &time1, NULL );
00309 }
00310 
00311 
00312 /*****************************************************************************/
00313 /**************************** TESTING PURPOSES *******************************/
00314 /*****************************************************************************/
00315 
00316 /*
00317 #include<sys/poll.h>
00318 
00319 int main( void )
00320 {
00321   ofstream fout( "temp.txt" );
00322   Logger log( fout, 0, 2 );
00323   log.log( 0, "hello" );
00324   log.setHeader( "jelle" );
00325   poll(0,0,1000);
00326   log.log( 2, "hello" );
00327   log.log( 3, "hello" );
00328   int j = 2;
00329   double i = 2.324234;
00330   printf( "hoi: "); fflush(stdout);
00331   log.logWithTime( 1, "|%f %d|", i, j);
00332 }
00333 
00334 */

Generated on Tue Jul 2 10:18:52 2002 for UvA Trilearn 2002 by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001