//===========================================================================// // Purpose : Method definitions for the TIO_PrintHandler class. // // Public methods include: // - NewInstance, DeleteInstance, GetInstance, HasInstance // - Info, Warning, Error, Fatal, Trace, Internal, Direct // - Write // - WriteBanner // - WriteCenter // - WriteVersion // - WriteHelp // - SetStdioOutput // - SetCustomOutput // - SetLogFileOutput // - SetUserFileOutput // - AddInfoAcceptRegExp // - AddInfoRejectRegExp // - AddWarningAcceptRegExp // - AddWarningRejectRegExp // - AddErrorAcceptRegExp // - AddErrorRejectRegExp // - AddTraceAcceptRegExp // - AddTraceRejectRegExp // - FindUserName // - FindHostName // - FindWorkingDir // - EnableOutput, DisableOutput // - IsOutputEnabled // - IsWithinMaxWarningCount // - IsWithinMaxErrorCount // - IsWithinMaxCount // - IsValidMaxWarningCount // - IsValidMaxErrorCount // - IsValidNew // // Protected methods include: // - TIO_PrintHandler_c, ~TIO_PrintHandler_c // // Private methods include: // - WriteMessage_ // - FormatMessage_ // - PrefixMessage_ // - OutputMessage_ // - ApplySystemCommand_ // //===========================================================================// #include #include #include #include using namespace std; #if defined( SUN8 ) || defined( SUN10 ) #include #endif #include "TC_Typedefs.h" #include "TC_StringUtils.h" #include "TC_Name.h" #include "TCT_NameList.h" #include "TIO_Typedefs.h" #include "TIO_StringText.h" #include "TIO_SkinHandler.h" #include "TIO_PrintHandler.h" // Initialize the user message "singleton" class, as needed TIO_PrintHandler_c* TIO_PrintHandler_c::pinstance_ = 0; //===========================================================================// // Method : TIO_PrintHandler_c // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// TIO_PrintHandler_c::TIO_PrintHandler_c( void ) { this->outputs_.isStdioEnabled = false; this->outputs_.isCustomEnabled = false; this->outputs_.isLogFileEnabled = false; this->outputs_.isUserFileEnabled = false; this->display_.pinfoAcceptList = 0; this->display_.pinfoRejectList = 0; this->display_.pwarningAcceptList = 0; this->display_.pwarningRejectList = 0; this->display_.perrorAcceptList = 0; this->display_.perrorRejectList = 0; this->display_.ptraceAcceptList = 0; this->display_.ptraceRejectList = 0; this->counts_.warningCount = 0; this->counts_.errorCount = 0; this->counts_.internalCount = 0; this->counts_.maxWarningCount = UINT_MAX; this->counts_.maxErrorCount = 1; this->counts_.isMaxWarningEnabled = true; this->counts_.isMaxErrorEnabled = true; this->formats_.timeStampsEnabled = false; this->formats_.srPrefix = ""; pinstance_ = 0; } //===========================================================================// // Method : ~TIO_PrintHandler_c // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// TIO_PrintHandler_c::~TIO_PrintHandler_c( void ) { TCT_NameList_c< TC_Name_c >* pinfoAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoAcceptList ); TCT_NameList_c< TC_Name_c >* pinfoRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoRejectList ); TCT_NameList_c< TC_Name_c >* pwarningAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningAcceptList ); TCT_NameList_c< TC_Name_c >* pwarningRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningRejectList ); TCT_NameList_c< TC_Name_c >* perrorAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorAcceptList ); TCT_NameList_c< TC_Name_c >* perrorRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorRejectList ); TCT_NameList_c< TC_Name_c >* ptraceAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceAcceptList ); TCT_NameList_c< TC_Name_c >* ptraceRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceRejectList ); delete pinfoAcceptList; delete pinfoRejectList; delete pwarningAcceptList; delete pwarningRejectList; delete perrorAcceptList; delete perrorRejectList; delete ptraceAcceptList; delete ptraceRejectList; } //===========================================================================// // Method : NewInstance // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::NewInstance( void ) { pinstance_ = new TC_NOTHROW TIO_PrintHandler_c; } //===========================================================================// // Method : DeleteInstance // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::DeleteInstance( void ) { if( pinstance_ ) { delete pinstance_; pinstance_ = 0; } } //===========================================================================// // Method : GetInstance // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// TIO_PrintHandler_c& TIO_PrintHandler_c::GetInstance( bool newInstance ) { if( !pinstance_ ) { if( newInstance ) { NewInstance( ); if( pinstance_ ) { pinstance_->SetStdioOutput( stdout ); } } } return( *pinstance_ ); } //===========================================================================// // Method : HasInstance // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::HasInstance( void ) { return( pinstance_ ? true : false ); } //===========================================================================// // Method : Info // Purpose : Format and print the given info message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::Info( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Info( TIO_PRINT_INFO, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list } //===========================================================================// void TIO_PrintHandler_c::Info( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { string srText( TIO_PSZ_STR( pszText )); if(( srText.length( ) > 1 ) && ( srText[srText.length( )-1] == '\n' )) { srText = srText.substr( 0, srText.length( )-1 ); } TCT_NameList_c< TC_Name_c >* pinfoAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoAcceptList ); TCT_NameList_c< TC_Name_c >* pinfoRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoRejectList ); mode = ( !pinfoAcceptList ? mode : TIO_PRINT_UNDEFINED ); if( pinfoAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( pinfoAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_INFO; } } if( pinfoRejectList && ( mode == TIO_PRINT_INFO )) { if( pinfoRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( mode != TIO_PRINT_UNDEFINED ) { this->WriteMessage_( mode, pszText, vaArgs ); } } //===========================================================================// // Method : Warning // Purpose : Format and print a (recoverable) warning message. The // max warning count is checked to determine a return value // (ie. do we continue or abort after this warning message). // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::Warning( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list bool isValid = this->Warning( TIO_PRINT_WARNING, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list return( isValid ); } //===========================================================================// bool TIO_PrintHandler_c::Warning( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { bool isValid = true; string srText( TIO_PSZ_STR( pszText )); if(( srText.length( ) > 1 ) && ( srText[srText.length( )-1] == '\n' )) { srText = srText.substr( 0, srText.length( )-1 ); } TCT_NameList_c< TC_Name_c >* pwarningAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningAcceptList ); TCT_NameList_c< TC_Name_c >* pwarningRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningRejectList ); TCT_NameList_c< TC_Name_c >* perrorAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorAcceptList ); TCT_NameList_c< TC_Name_c >* perrorRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorRejectList ); mode = ( !pwarningAcceptList && !perrorAcceptList ? mode : TIO_PRINT_UNDEFINED ); if( pwarningAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( pwarningAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_WARNING; } } if( pwarningRejectList && ( mode == TIO_PRINT_WARNING )) { if( pwarningRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( perrorAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( perrorAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_ERROR; } } if( perrorRejectList && ( mode == TIO_PRINT_ERROR )) { if( perrorRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( mode != TIO_PRINT_UNDEFINED ) { this->WriteMessage_( mode, pszText, vaArgs ); if( mode == TIO_PRINT_ERROR ) { // Update current error count and test against the max error count isValid = this->IsValidMaxErrorCount( ); } if( mode == TIO_PRINT_WARNING ) { // Update current warning count and test against the max warning count isValid = this->IsValidMaxWarningCount( ); } } return( isValid ); } //===========================================================================// // Method : Error // Purpose : Format and print a (non-recoverable) error message. The // max error count is checked to determine a return value // (ie. do we continue or abort after this error message). // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::Error( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list bool isValid = this->Error( TIO_PRINT_ERROR, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list return( isValid ); } //===========================================================================// bool TIO_PrintHandler_c::Error( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { bool isValid = true; string srText( TIO_PSZ_STR( pszText )); if(( srText.length( ) > 1 ) && ( srText[srText.length( )-1] == '\n' )) { srText = srText.substr( 0, srText.length( )-1 ); } TCT_NameList_c< TC_Name_c >* perrorAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorAcceptList ); TCT_NameList_c< TC_Name_c >* perrorRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorRejectList ); TCT_NameList_c< TC_Name_c >* pwarningAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningAcceptList ); TCT_NameList_c< TC_Name_c >* pwarningRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningRejectList ); mode = ( !perrorAcceptList && !pwarningAcceptList ? mode : TIO_PRINT_UNDEFINED ); if( perrorAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( perrorAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_ERROR; } } if( perrorRejectList && ( mode == TIO_PRINT_ERROR )) { if( perrorRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( pwarningAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( pwarningAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_WARNING; } } if( pwarningRejectList && ( mode == TIO_PRINT_WARNING )) { if( pwarningRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( mode != TIO_PRINT_UNDEFINED ) { this->WriteMessage_( mode, pszText, vaArgs ); if( mode == TIO_PRINT_ERROR ) { // Update current error count and test against the max error count isValid = this->IsValidMaxErrorCount( ); } if( mode == TIO_PRINT_WARNING ) { // Update current warning count and test against the max warning count isValid = this->IsValidMaxWarningCount( ); } } return( isValid ); } //===========================================================================// // Method : Fatal // Purpose : Format and print a (program-specified) fatal message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original // 08/10/12 jeffr : Changed return "void" to "bool" (will always be false) //===========================================================================// bool TIO_PrintHandler_c::Fatal( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Fatal( TIO_PRINT_FATAL, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list return( false ); } //===========================================================================// bool TIO_PrintHandler_c::Fatal( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { this->WriteMessage_( mode, pszText, vaArgs ); return( false ); } //===========================================================================// // Method : Trace // Purpose : Format and print a (user-specified) trace message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original // 08/10/12 jeffr : Replaced "(int)" cast with original "static_cast< int >" //===========================================================================// void TIO_PrintHandler_c::Trace( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Trace( TIO_PRINT_TRACE, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list } //===========================================================================// void TIO_PrintHandler_c::Trace( FILE* pfile, size_t lenSpace, const char* pszText, ... ) { FILE* pstream = this->outputs_.stdioOutput.GetStream( ); if( pfile ) { this->outputs_.stdioOutput.SetStream( pfile ); } static char szText[TIO_FORMAT_STRING_LEN_MAX]; if( lenSpace > 0 ) { sprintf( szText, "%*s%s", static_cast< int >( lenSpace ), lenSpace ? " " : "", pszText ); pszText = szText; } va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Trace( TIO_PRINT_TRACE, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list if( pfile ) { this->outputs_.stdioOutput.SetStream( pstream ); } } //===========================================================================// void TIO_PrintHandler_c::Trace( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { string srText( TIO_PSZ_STR( pszText )); if(( srText.length( ) > 1 ) && ( srText[srText.length( )-1] == '\n' )) { srText = srText.substr( 0, srText.length( )-1 ); } TCT_NameList_c< TC_Name_c >* ptraceAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceAcceptList ); TCT_NameList_c< TC_Name_c >* ptraceRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceRejectList ); mode = ( ptraceRejectList ? mode : TIO_PRINT_UNDEFINED ); if( ptraceAcceptList && ( mode == TIO_PRINT_UNDEFINED )) { if( ptraceAcceptList->MatchRegExp( srText )) { mode = TIO_PRINT_TRACE; } } if( ptraceRejectList && ( mode == TIO_PRINT_TRACE )) { if( ptraceRejectList->MatchRegExp( srText )) { mode = TIO_PRINT_UNDEFINED; } } if( mode != TIO_PRINT_UNDEFINED ) { this->WriteMessage_( mode, pszText, vaArgs ); } } //===========================================================================// // Method : Internal // Purpose : Format and print an (programming error) internal // message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::Internal( const char* pszSource, const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Internal( TIO_PRINT_INTERNAL, pszSource, pszText, vaArgs ); // Update current internal count ++this->counts_.internalCount; va_end( vaArgs ); // Reset variable argument list return( false ); } //===========================================================================// bool TIO_PrintHandler_c::Internal( TIO_PrintMode_t mode, const char* pszSource, const char* pszText, va_list vaArgs ) { this->WriteMessage_( mode, pszText, vaArgs, pszSource ); return( false ); } //===========================================================================// // Method : Direct // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::Direct( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->Direct( TIO_PRINT_DIRECT, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list } //===========================================================================// void TIO_PrintHandler_c::Direct( TIO_PrintMode_t mode, const char* pszText, va_list vaArgs ) { this->WriteMessage_( mode, pszText, vaArgs ); } //===========================================================================// // Method : Write // Purpose : Format and print a (user-specified) message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original // 08/10/12 jeffr : Replaced "(int)" cast with original "static_cast< int >" //===========================================================================// void TIO_PrintHandler_c::Write( const char* pszText, ... ) { va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->WriteMessage_( TIO_PRINT_DIRECT, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list } //===========================================================================// void TIO_PrintHandler_c::Write( size_t lenSpace, const char* pszText, ... ) { static char szText[TIO_FORMAT_STRING_LEN_MAX]; if( lenSpace > 0 ) { sprintf( szText, "%*s%s", static_cast< int >( lenSpace ), lenSpace ? " " : "", pszText ); pszText = szText; } va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->WriteMessage_( TIO_PRINT_DIRECT, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list } //===========================================================================// void TIO_PrintHandler_c::Write( FILE* pfile, size_t lenSpace, const char* pszText, ... ) { FILE* pstream = this->outputs_.stdioOutput.GetStream( ); if( pfile ) { this->outputs_.stdioOutput.SetStream( pfile ); } static char szText[TIO_FORMAT_STRING_LEN_MAX]; if( lenSpace > 0 ) { sprintf( szText, "%*s%s", static_cast< int >( lenSpace ), lenSpace ? " " : "", pszText ); pszText = szText; } va_list vaArgs; // Make a variable argument list va_start( vaArgs, pszText ); // Initialize variable argument list this->WriteMessage_( TIO_PRINT_DIRECT, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list if( pfile ) { this->outputs_.stdioOutput.SetStream( pstream ); } } //===========================================================================// // Method : WriteBanner // Purpose : Format and print a (program) banner message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::WriteBanner( FILE* pfile, size_t lenSpace ) { static char szSep[TIO_FORMAT_STRING_LEN_MAX]; static size_t lenSep = TIO_FORMAT_BANNER_LEN_DEF; TIO_SkinHandler_c& skinHandler = TIO_SkinHandler_c::GetInstance( ); const char* pszProgramTitle = skinHandler.GetProgramTitle( ); const char* pszCopyright = skinHandler.GetCopyright( ); TC_FormatStringFilled( '_', szSep, lenSep ); this->WriteCenter( pfile, lenSpace, szSep, lenSep ); this->WriteCenter( pfile, lenSpace, pszProgramTitle, lenSep ); this->WriteCenter( pfile, lenSpace, TIO_SZ_BUILD_VERSION, lenSep ); this->WriteCenter( pfile, lenSpace, pszCopyright, lenSep ); this->WriteCenter( pfile, lenSpace, szSep, lenSep ); } //===========================================================================// void TIO_PrintHandler_c::WriteBanner( void ) { FILE* pfile = 0; size_t spaceLen = 0; this->WriteBanner( pfile, spaceLen ); } //===========================================================================// // Method : WriteCenter // Purpose : Format and print a (user-specified) center message. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original // 08/10/12 jeffr : Replaced "(int)" cast with original "static_cast< int >" //===========================================================================// void TIO_PrintHandler_c::WriteCenter( FILE* pfile, size_t lenSpace, const char* pszText, size_t lenText, const char* pszPrefix, const char* pszPostfix ) { FILE* pstream = this->outputs_.stdioOutput.GetStream( ); if( pfile ) { this->outputs_.stdioOutput.SetStream( pfile ); } static char szText[TIO_FORMAT_STRING_LEN_MAX]; if( lenSpace > 0 ) { sprintf( szText, "%*s%s", static_cast< int >( lenSpace ), lenSpace ? " " : "", pszText ); pszText = szText; } static char szCenteredText[TIO_FORMAT_STRING_LEN_MAX]; TC_FormatStringCentered( pszText, lenText, szCenteredText, TIO_FORMAT_STRING_LEN_MAX ); if( pszPrefix ) { TC_AddStringPrefix( szCenteredText, pszPrefix ); } if( pszPostfix ) { TC_AddStringPostfix( szCenteredText, pszPostfix ); } pszText = szCenteredText; va_list vaArgs; // Make a variable argument list #if defined( SUN8 ) || defined( SUN10 ) || defined( WIN32 ) || defined( _WIN32 ) vaArgs = 0; #endif this->WriteMessage_( TIO_PRINT_RETURN, pszText, vaArgs ); va_end( vaArgs ); // Reset variable argument list if( pfile ) { this->outputs_.stdioOutput.SetStream( pstream ); } } //===========================================================================// // Method : WriteVersion // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::WriteVersion( void ) { TIO_SkinHandler_c& skinHandler = TIO_SkinHandler_c::GetInstance( ); const char* pszProgramName = skinHandler.GetProgramName( ); this->Write( "%s\n" \ "%s, built %s\n", TIO_PSZ_STR( pszProgramName ), TIO_SZ_BUILD_VERSION, TIO_SZ_BUILD_TIME_STAMP ); } //===========================================================================// // Method : WriteHelp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::WriteHelp( void ) { TIO_SkinHandler_c& skinHandler = TIO_SkinHandler_c::GetInstance( ); const char* pszBinaryName = skinHandler.GetBinaryName( ); this->Write( TIO_SZ_PROGRAM_HELP, pszBinaryName ); } //===========================================================================// // Method : SetStdioOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::SetStdioOutput( FILE* pstream ) { this->outputs_.stdioOutput.SetStream( pstream ); bool isEnabled = this->outputs_.stdioOutput.IsEnabled( ); this->outputs_.isStdioEnabled = isEnabled; } //===========================================================================// // Method : SetCustomOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::SetCustomOutput( TIO_PFX_CustomHandler_t pfxCustomHandler ) { this->outputs_.customOutput.SetHandler( pfxCustomHandler ); bool isEnabled = this->outputs_.customOutput.IsEnabled( ); this->outputs_.isCustomEnabled = isEnabled; } //===========================================================================// // Method : SetLogFileOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::SetLogFileOutput( const char* pszLogFileName, TIO_FileOpenMode_t fileOpenMode ) { if( pszLogFileName ) { this->outputs_.logFileOutput.Open( pszLogFileName, fileOpenMode ); } else { this->outputs_.logFileOutput.Close( ); } bool isEnabled = this->outputs_.logFileOutput.IsEnabled( ); this->outputs_.isLogFileEnabled = isEnabled; return( this->outputs_.logFileOutput.IsValid( )); } //===========================================================================// // Method : SetUserFileOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::SetUserFileOutput( const char* pszUserFileName, TIO_FileOpenMode_t fileOpenMode ) { if( pszUserFileName ) { this->outputs_.userFileOutput.Open( pszUserFileName, fileOpenMode ); } else { this->outputs_.userFileOutput.Close( ); } bool isEnabled = this->outputs_.userFileOutput.IsEnabled( ); this->outputs_.isUserFileEnabled = isEnabled; return( this->outputs_.userFileOutput.IsValid( )); } //===========================================================================// // Method : AddInfoAcceptRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddInfoAcceptRegExp( const char* pszRegExp ) { if( !this->display_.pinfoAcceptList ) { this->display_.pinfoAcceptList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_INFO_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* pinfoAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoAcceptList ); pinfoAcceptList->Add( pszRegExp ); } //===========================================================================// // Method : AddInfoRejectRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddInfoRejectRegExp( const char* pszRegExp ) { if( !this->display_.pinfoRejectList ) { this->display_.pinfoRejectList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_INFO_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* pinfoRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pinfoRejectList ); pinfoRejectList->Add( pszRegExp ); } //===========================================================================// // Method : AddWarningAcceptRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddWarningAcceptRegExp( const char* pszRegExp ) { if( !this->display_.pwarningAcceptList ) { this->display_.pwarningAcceptList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_WARNING_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* pwarningAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningAcceptList ); pwarningAcceptList->Add( pszRegExp ); } //===========================================================================// // Method : AddWarningRejectRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddWarningRejectRegExp( const char* pszRegExp ) { if( !this->display_.pwarningRejectList ) { this->display_.pwarningRejectList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_WARNING_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* pwarningRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.pwarningRejectList ); pwarningRejectList->Add( pszRegExp ); } //===========================================================================// // Method : AddErrorAcceptRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddErrorAcceptRegExp( const char* pszRegExp ) { if( !this->display_.perrorAcceptList ) { this->display_.perrorAcceptList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_ERROR_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* perrorAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorAcceptList ); perrorAcceptList->Add( pszRegExp ); } //===========================================================================// // Method : AddErrorRejectRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddErrorRejectRegExp( const char* pszRegExp ) { if( !this->display_.perrorRejectList ) { this->display_.perrorRejectList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_ERROR_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* perrorRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.perrorRejectList ); perrorRejectList->Add( pszRegExp ); } //===========================================================================// // Method : AddTraceAcceptRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddTraceAcceptRegExp( const char* pszRegExp ) { if( !this->display_.ptraceAcceptList ) { this->display_.ptraceAcceptList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_TRACE_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* ptraceAcceptList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceAcceptList ); ptraceAcceptList->Add( pszRegExp ); } //===========================================================================// // Method : AddTraceRejectRegExp // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::AddTraceRejectRegExp( const char* pszRegExp ) { if( !this->display_.ptraceRejectList ) { this->display_.ptraceRejectList = new TC_NOTHROW TCT_NameList_c< TC_Name_c >( TIO_DISPLAY_TRACE_LIST_DEF_CAPACITY ); } TCT_NameList_c< TC_Name_c >* ptraceRejectList = static_cast< TCT_NameList_c< TC_Name_c >* >( this->display_.ptraceRejectList ); ptraceRejectList->Add( pszRegExp ); } //===========================================================================// // Method : FindUserName // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::FindUserName( string* psrUserName ) const { const char* pszUserNameCmd = ""; #if defined( SUN8 ) || defined( SUN10 ) || defined( LINUX_I686 ) || defined( LINUX_X86_64 ) pszUserNameCmd = "whoami"; #elif defined( WIN32 ) || defined( _WIN32 ) pszUserNameCmd = "echo %USERNAME%"; #endif this->ApplySystemCommand_( pszUserNameCmd, TIO_COMMAND_USERNAME_LEN, psrUserName ); } //===========================================================================// // Method : FindHostName // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::FindHostName( string* psrHostName ) const { const char* pszHostNameCmd = ""; #if defined( SUN8 ) || defined( SUN10 ) || defined( LINUX_I686 ) || defined( LINUX_X86_64 ) pszHostNameCmd = "hostname", #elif defined( WIN32 ) || defined( _WIN32 ) pszHostNameCmd = "hostname", #endif this->ApplySystemCommand_( pszHostNameCmd, TIO_COMMAND_HOSTNAME_LEN, psrHostName ); } //===========================================================================// // Method : FindWorkingDir // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::FindWorkingDir( string* psrWorkingDir ) const { this->ApplySystemCommand_( "pwd", TIO_COMMAND_WORKINGDIR_LEN, psrWorkingDir ); } //===========================================================================// // Method : EnableOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::EnableOutput( int outputMask ) { if( outputMask & TIO_PRINT_OUTPUT_STDIO ) { this->EnableStdioOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_CUSTOM ) { this->EnableCustomOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_LOG_FILE ) { this->EnableLogFileOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_USER_FILE ) { this->EnableUserFileOutput( ); } } //===========================================================================// // Method : DisableOutput // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::DisableOutput( int outputMask ) { if( outputMask & TIO_PRINT_OUTPUT_STDIO ) { this->DisableStdioOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_CUSTOM ) { this->DisableCustomOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_LOG_FILE ) { this->DisableLogFileOutput( ); } if( outputMask & TIO_PRINT_OUTPUT_USER_FILE ) { this->DisableUserFileOutput( ); } } //===========================================================================// // Method : IsOutputEnabled // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsOutputEnabled( int outputMask ) { bool isOutputEnabled = false; if( outputMask & TIO_PRINT_OUTPUT_STDIO ) { isOutputEnabled = ( isOutputEnabled ? true : this->IsStdioOutputEnabled( )); } if( outputMask & TIO_PRINT_OUTPUT_CUSTOM ) { isOutputEnabled = ( isOutputEnabled ? true : this->IsCustomOutputEnabled( )); } if( outputMask & TIO_PRINT_OUTPUT_LOG_FILE ) { isOutputEnabled = ( isOutputEnabled ? true : this->IsLogFileOutputEnabled( )); } if( outputMask & TIO_PRINT_OUTPUT_USER_FILE ) { isOutputEnabled = ( isOutputEnabled ? true : this->IsUserFileOutputEnabled( )); } return( isOutputEnabled ); } //===========================================================================// // Method : IsWithinMaxWarningCount // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsWithinMaxWarningCount( void ) const { bool isWithin = true; if( this->counts_.isMaxWarningEnabled && this->counts_.maxWarningCount <= this->counts_.warningCount ) { isWithin = false; } return( isWithin ); } //===========================================================================// // Method : IsWithinMaxErrorCount // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsWithinMaxErrorCount( void ) const { bool isWithin = true; if( this->counts_.isMaxErrorEnabled && this->counts_.maxErrorCount <= this->counts_.errorCount ) { isWithin = false; } return( isWithin ); } //===========================================================================// // Method : IsWithinMaxCount // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsWithinMaxCount( void ) const { bool isWithin = true; if( !this->IsWithinMaxErrorCount( ) || !this->IsWithinMaxWarningCount( )) { isWithin = false; } return( isWithin ); } //===========================================================================// // Method : IsValidMaxWarningCount // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsValidMaxWarningCount( void ) { bool isValid = true; ++this->counts_.warningCount; if( !this->IsWithinMaxWarningCount( )) { this->counts_.isMaxErrorEnabled = false; this->Fatal( "Exceeded maximum warning count (%u).\n", this->counts_.maxWarningCount ); this->counts_.isMaxErrorEnabled = true; isValid = false; } return( isValid ); } //===========================================================================// // Method : IsValidMaxErrorCount // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsValidMaxErrorCount( void ) { bool isValid = true; ++this->counts_.errorCount; if( !this->IsWithinMaxErrorCount( )) { this->counts_.isMaxErrorEnabled = false; this->Fatal( "Exceeded maximum error count (%u).\n", this->counts_.maxErrorCount ); this->counts_.isMaxErrorEnabled = true; isValid = false; } return( isValid ); } //===========================================================================// // Method : IsValidNew // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::IsValidNew( const void* pvoid, size_t allocLen, const char* pszSource ) { if( !pvoid && pszSource ) { this->Internal( pszSource, "Failed to allocate %u bytes memory!\n", allocLen ); } return( pvoid ? true : false ); } //===========================================================================// // Method : WriteMessage_ // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::WriteMessage_( TIO_PrintMode_t mode, // Defines print severity level mode const char* pszText, // Ptr to message text string va_list vaArgs, // Define optional variable arguments const char* pszSource ) // Ptr to optional source string { static char szMessage[TIO_FORMAT_STRING_LEN_MAX]; // Extract and format message based on optional variable argument list bool isValid = this->FormatMessage_( pszText, vaArgs, szMessage ); // Write message to zero or more enabled output streams if( isValid ) { this->OutputMessage_( mode, szMessage, pszSource ); } return( isValid ); } //===========================================================================// // Method : FormatMessage_ // Purpose : Format and return a message string based on the given // message text string and optional variable argument list. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::FormatMessage_( const char* pszText, // Ptr to message text string va_list vaArgs, // Define optional variable arguments char* pszMessage ) // Ptr to returned message string { if( pszMessage ) { // Extract and format based on variable argument list vsprintf( pszMessage, pszText, vaArgs ); } return( pszMessage && *pszMessage ? true : false ); } //===========================================================================// // Method : PrefixMessage_ // Purpose : Prefix and return a message string based on the given // message text string and print severity level mode. // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// bool TIO_PrintHandler_c::PrefixMessage_( TIO_PrintMode_t mode, // Defines print severity level mode const char* pszText, // Ptr to message text string const char* pszSource, // Ptr to optional source string char* pszMessage ) // Ptr to returned message string { if( pszMessage ) { const char* pszPrefix = TIO_SR_STR( this->formats_.srPrefix ); pszText = TIO_PSZ_STR( pszText ); pszSource = TIO_PSZ_STR( pszSource ); unsigned long warningCount = this->counts_.warningCount + 1; unsigned long errorCount = this->counts_.errorCount + 1; unsigned long internalCount = this->counts_.internalCount + 1; switch( mode ) { case TIO_PRINT_INFO: if( this->formats_.timeStampsEnabled ) { static char szTimeStamp[TIO_FORMAT_STRING_LEN_DATE_TIME]; size_t lenTimeStamp = sizeof( szTimeStamp ); TC_FormatStringDateTimeStamp( szTimeStamp, lenTimeStamp, "[", "] " ); sprintf( pszMessage, "%s%s%s", szTimeStamp, pszPrefix, pszText ); } else { sprintf( pszMessage, "%s%s", pszPrefix, pszText ); } break; case TIO_PRINT_WARNING: sprintf( pszMessage, "%sWARNING(%lu): %s", pszPrefix, warningCount, pszText ); break; case TIO_PRINT_ERROR: sprintf( pszMessage, "%sERROR(%lu): %s", pszPrefix, errorCount, pszText ); break; case TIO_PRINT_FATAL: sprintf( pszMessage, "%sFATAL: %s", pszPrefix, pszText ); break; case TIO_PRINT_TRACE: if( this->formats_.timeStampsEnabled ) { static char szTimeStamp[TIO_FORMAT_STRING_LEN_DATE_TIME]; size_t lenTimeStamp = sizeof( szTimeStamp ); TC_FormatStringDateTimeStamp( szTimeStamp, lenTimeStamp, "[", "] " ); sprintf( pszMessage, "%sTRACE: %s%s", pszPrefix, szTimeStamp, pszText ); } else { sprintf( pszMessage, "%sTRACE: %s", pszPrefix, pszText ); } break; case TIO_PRINT_INTERNAL: sprintf( pszMessage, "INTERNAL(%lu) @ %s\n" " %s", internalCount, pszSource, pszText ); break; case TIO_PRINT_DIRECT: sprintf( pszMessage, "%s", pszText ); break; case TIO_PRINT_RETURN: sprintf( pszMessage, "%s\n", pszText ); break; default: sprintf( pszMessage, "%s", pszText ); break; } } return( pszMessage && *pszMessage ? true : false ); } //===========================================================================// // Method : OutputMessage_ // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::OutputMessage_( TIO_PrintMode_t mode, // Defines print severity level mode const char* pszText, // Ptr to message text string const char* pszSource ) // Ptr to optional source string { static char szMessage[TIO_FORMAT_STRING_LEN_MAX]; // Format and print message based on enabled output options if( this->outputs_.stdioOutput.IsEnabled( )) { this->PrefixMessage_( mode, pszText, pszSource, szMessage ); this->outputs_.stdioOutput.Write( szMessage ); this->outputs_.stdioOutput.Flush( ); } if( this->outputs_.customOutput.IsEnabled( )) { this->outputs_.customOutput.Write( mode, pszText, pszSource ); } if( this->outputs_.logFileOutput.IsEnabled( )) { this->PrefixMessage_( mode, pszText, pszSource, szMessage ); this->outputs_.logFileOutput.Write( szMessage ); this->outputs_.logFileOutput.Flush( ); } if( this->outputs_.userFileOutput.IsEnabled( )) { this->PrefixMessage_( mode, pszText, pszSource, szMessage ); this->outputs_.userFileOutput.Write( szMessage ); } } //===========================================================================// // Method : ApplySystemCommand_ // Author : Jeff Rudolph //---------------------------------------------------------------------------// // Version history // 05/01/12 jeffr : Original //===========================================================================// void TIO_PrintHandler_c::ApplySystemCommand_( const char* pszCommand, size_t lenCommandStdout, string* psrCommandStdout ) const { if( psrCommandStdout ) { *psrCommandStdout = ""; #if defined( SUN8 ) || defined( SUN10 ) || defined( LINUX_I686 ) || defined( LINUX_X86_64 ) || defined( WIN32 ) || defined( _WIN32 ) TIO_SkinHandler_c& skinHandler = TIO_SkinHandler_c::GetInstance( ); const char* pszBinaryName = skinHandler.GetBinaryName( ); string srCommandStdout; srCommandStdout += "./."; srCommandStdout += pszBinaryName; srCommandStdout += "."; srCommandStdout += pszCommand; string srCommand; srCommand += pszCommand; srCommand += " > "; srCommand += srCommandStdout; if( system( srCommand.data( )) >= 0 ) { TIO_FileHandler_c fileIO( srCommandStdout, TIO_FILE_OPEN_READ ); if( fileIO.IsValid( )) { char* pszCommandStdout = new TC_NOTHROW char[lenCommandStdout]; fileIO.Read( pszCommandStdout, lenCommandStdout-1 ); pszCommandStdout[strlen( pszCommandStdout )-1] = 0; *psrCommandStdout = pszCommandStdout; fileIO.Close( ); delete[] pszCommandStdout; } } #endif } }