Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

LOW_helper_msglog.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           LOW_helper_msglog.cpp  -  description
00003                              -------------------
00004     begin                : Sun Jul 21 2002
00005     copyright            : (C) 2002 by Harald Roelle, Helmut Reiser
00006     email                : roelle@informatik.uni-muenchen.de, reiser@informatik.uni-muenchen.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 
00019 #include <memory>
00020 
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <errno.h>
00025 #include <stdarg.h>
00026 
00027 
00028 #include "LOW_helper_msglog.h"
00029 #include "LOW_platformMisc.h"
00030 #include "LOW_semaphoreSetFactory.h"
00031 #include "LOW_IPCKeyGeneratorFactory.h"
00032 #include "LOW_IPCKeyGenerator.h"
00033 
00034 
00035 //=====================================================================================
00036 //
00037 // static attributes
00038 //
00039 
00040 bool LOW_helper_msglog::errorOccured = false;
00041 bool LOW_helper_msglog::debugLevels[all_dl];
00042 
00043 bool LOW_helper_msglog::useStdMsgStream     = true;
00044 bool LOW_helper_msglog::useStdWarnStream    = true;
00045 bool LOW_helper_msglog::useStdErrStream     = true;
00046 bool LOW_helper_msglog::useStdDebugStream   = true;
00047 bool LOW_helper_msglog::useExtraMsgStream   = false;
00048 bool LOW_helper_msglog::useExtraWarnStream  = false;
00049 bool LOW_helper_msglog::useExtraErrStream   = false;
00050 bool LOW_helper_msglog::useExtraDebugStream = false;
00051   
00052 FILE* LOW_helper_msglog::stdOutStream     = stdout;
00053 FILE* LOW_helper_msglog::stdWarnStream    = stderr;
00054 FILE* LOW_helper_msglog::stdErrStream     = stderr;
00055 FILE* LOW_helper_msglog::stdDebugStream   = stderr;
00056 FILE* LOW_helper_msglog::extraOutStream   = NULL;
00057 FILE* LOW_helper_msglog::extraWarnStream  = NULL;
00058 FILE* LOW_helper_msglog::extraErrStream   = NULL;
00059 FILE* LOW_helper_msglog::extraDebugStream = NULL;
00060 
00061 
00062 //=====================================================================================
00063 //
00064 // static methods
00065 //
00066 
00067 void LOW_helper_msglog::enableDebugLevel( const debugLevel_t inLevel, const bool isEnabled)
00068 {
00069   debugLevels[inLevel] = isEnabled;
00070 }
00071 
00072 
00073 //=====================================================================================
00074 //
00075 // static log methods
00076 //
00077 
00078 /**
00079  * Print error message
00080  */
00081 void LOW_helper_msglog::printPerror( const int inErrno, const char *inFormat, ...)
00082 {
00083   va_list inParamList;
00084   int     length = 0;
00085   char    dummy;
00086   char    *buffer;
00087 
00088   // calculate length
00089   va_start( inParamList, inFormat);
00090   length += vsnprintf( &dummy, 0, inFormat, inParamList);
00091   va_end( inParamList);
00092   length += strlen( ": ");
00093   length += strlen( sys_errlist[inErrno]);
00094   length ++; // the null char
00095   
00096   buffer = (char*) callocCheck( length);
00097   
00098   va_start( inParamList, inFormat);
00099   vsprintf( buffer, inFormat, inParamList);
00100   va_end( inParamList);
00101   if ( inErrno < sys_nerr-1 ) {
00102     strcat( buffer, ": ");
00103     strcat( buffer, sys_errlist[inErrno]);
00104   }
00105 
00106   printError( "%s", buffer);
00107   
00108   free( buffer);
00109 }
00110 
00111 
00112 /**
00113  * Print error message
00114  */
00115 void LOW_helper_msglog::printError( const char *inFormat, ...)
00116 {
00117   va_list inParamList;
00118 
00119   va_start( inParamList, inFormat);
00120   va_printToLog( err_log, inFormat, inParamList);
00121   va_end( inParamList);
00122 }
00123 
00124 
00125 /**
00126  * Print warning
00127  */
00128 void LOW_helper_msglog::printWarning( const char *inFormat, ...)
00129 {
00130   va_list inParamList;
00131 
00132   va_start( inParamList, inFormat);
00133   va_printToLog( warn_log, inFormat, inParamList);
00134   va_end( inParamList);
00135 }
00136 
00137 
00138 /**
00139  * Print message
00140  */
00141 void LOW_helper_msglog::printMessage( const char *inFormat, ...)
00142 {
00143   va_list inParamList;
00144 
00145   va_start( inParamList, inFormat);
00146   va_printToLog( msg_log, inFormat, inParamList);
00147   va_end( inParamList);
00148 }
00149 
00150 
00151 /**
00152  * Print debug message
00153  */
00154 void LOW_helper_msglog::printDebug( const debugLevel_t inLevel, const char *inFormat, ...)
00155 {
00156   va_list inParamList;
00157 
00158   if ( debugLevels[inLevel] || debugLevels[all_dl] ) {
00159     va_start( inParamList, inFormat);
00160     va_printToLog( debug_log, inFormat, inParamList);
00161     va_end( inParamList);
00162   }
00163 }
00164 
00165 
00166 
00167 //=====================================================================================
00168 //
00169 // locks
00170 //
00171 
00172 LOW_semaphoreSet*  LOW_helper_msglog::msgLock::semSet =  LOW_helper_msglog::msgLock::semaphoreInit();
00173 
00174 
00175 LOW_helper_msglog::msgLock::msgLock()
00176 {
00177   semSet->decSem( 0);
00178 }
00179 
00180 
00181 LOW_helper_msglog::msgLock::~msgLock()
00182 {
00183   semSet->incSem( 0);
00184 }
00185 
00186 
00187 LOW_semaphoreSet* LOW_helper_msglog::msgLock::semaphoreInit()
00188 { 
00189   auto_ptr<LOW_IPCKeyGenerator> keyGenerator (LOW_IPCKeyGeneratorFactory::new_IPCKeyGenerator());
00190   return LOW_semaphoreSetFactory::new_semaphoreSet( keyGenerator->getSemSetKey( "/dev/stdout"), 1, 1);
00191 };
00192 
00193 
00194 
00195 
00196 //=====================================================================================
00197 //
00198 // private methods
00199 //
00200 
00201 void LOW_helper_msglog::va_printToLog( const logType_t inLogType, const char *inFormat, va_list inParamList)
00202 {
00203   FILE    *extraStream = 0, *stdStream = 0;
00204   char    dummy, *buffer, *indentStr, *tmpPtr;
00205   int     headLen, length;
00206 
00207   msgLock lock = msgLock();
00208   
00209   switch ( inLogType ) {
00210     case msg_log:
00211       stdStream   = useStdMsgStream   ? stdOutStream   : NULL;
00212       extraStream = useExtraMsgStream ? extraOutStream : NULL;
00213       break;
00214     case warn_log:
00215       stdStream   = useStdWarnStream   ? stdWarnStream   : NULL;
00216       extraStream = useExtraWarnStream ? extraWarnStream : NULL;
00217       break;
00218     case err_log:
00219       stdStream   = useStdErrStream   ? stdErrStream   : NULL;
00220       extraStream = useExtraErrStream ? extraErrStream : NULL;
00221       break;
00222     case debug_log:
00223       stdStream   = useStdDebugStream   ? stdDebugStream   : NULL;
00224       extraStream = useExtraDebugStream ? extraDebugStream : NULL;
00225       break;
00226   }
00227   
00228   headLen = fprintLogHeader( extraStream, stdStream);
00229 
00230   // build string for indention
00231   indentStr = (char*) callocCheck( headLen+1);
00232   memset( indentStr, ' ', headLen);
00233   indentStr[headLen] = '\0';
00234 
00235   if ( inLogType==err_log )
00236     fprintfMulti( extraStream, stdStream, "ERROR -- ");
00237     
00238   if ( inLogType==debug_log )
00239     fprintfMulti( extraStream, stdStream, "DEBUG -- ");
00240 
00241   // detect length and reserve buffer
00242   length = vsnprintf( &dummy, 0, inFormat, inParamList);  // detect length
00243   buffer = (char*) callocCheck( length+1);  // get buffer (remember ther \0!)
00244 
00245   vsprintf( buffer, inFormat, inParamList);  // print into buffer
00246   tmpPtr = strtok( buffer, "\n"); 
00247   fprintfMulti( extraStream, stdStream, "%s\n", tmpPtr); // first line without indent
00248   while( (tmpPtr=strtok( NULL, "\n")) != NULL ) {  // subsequent lines with indent
00249     fprintfMulti( extraStream, stdStream, "%s%s\n", indentStr, tmpPtr);
00250   }
00251 
00252   free( buffer);
00253   free( indentStr);
00254 }
00255 
00256 
00257 unsigned int LOW_helper_msglog::fprintLogHeader( FILE *inExtraStream, FILE *inStdStream)
00258 {
00259   char      tmpStr[200];
00260   time_t    curtime;
00261   struct tm *loctime;
00262 
00263   curtime = time( NULL);
00264   loctime = localtime( &curtime);
00265   strftime( tmpStr, 200, "%a %Y/%m/%d %T", loctime);
00266   fprintfMulti( inExtraStream, inStdStream, "%s [%d]: ", tmpStr, LOW_platformMisc::getThreadID());
00267   return( strlen( tmpStr));
00268 }
00269 
00270 
00271 void LOW_helper_msglog::fprintfMulti( FILE *inExtraStream, FILE *inStdStream, const char *inFormat, ...)
00272 {
00273   va_list inParamList;
00274   va_start( inParamList, inFormat);
00275   vfprintfMulti( inExtraStream, inStdStream, inFormat, inParamList);
00276   va_end( inParamList);
00277 }
00278 
00279 
00280 void LOW_helper_msglog::vfprintfMulti( FILE *inExtraStream, FILE *inStdStream, const char *inFormat, va_list inAp)
00281 {
00282   if ( inExtraStream )  vfprintf( inExtraStream, inFormat, inAp);
00283   if ( inStdStream )    vfprintf( inStdStream, inFormat, inAp);
00284 }
00285 
00286 
00287 void* LOW_helper_msglog::callocCheck( const size_t inSize)
00288 {
00289   void* retPtr;
00290 
00291   if ( (retPtr=calloc( 1, inSize)) == NULL ) {
00292     LOW_helper_msglog::printPerror( errno, "Error in LOW_helper_msglog::callocCheck()");
00293     std::terminate();
00294   }
00295 
00296   return retPtr;
00297 }

Generated on Sun Jan 12 21:07:43 2003 by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001