/* ------------------------------------------------------------------------------ | ERROR.CPP | | Author : Terry Leach | Revision: 11/11/01 Initial creation Purpose : General error handler, just for routing errors to file, screen, dialog whatever. Currently setup to send errors to the LOG file. */ #include #include #include #include "error.hpp" int ERR::m_Instances = 0; ERR::ERR() { if( !m_Instances ) { freopen( "nuller.log" ,"a" ,stderr ); Display( "===== Log File Opened =====" ); } m_Instances++; } ERR::~ERR() { if( !--m_Instances ) { Display( "===== Log File Closed =====" ); fclose( stderr ); } } void ERR::Display( char *pszResult ) { if( !pszResult || (pszResult && !strlen(pszResult)) ) { fprintf( stderr ,"ERR! (no description supplied)\n" ); // printf( "ERR! (no description supplied)\n" ); } else { fprintf( stderr ,"%s\n" ,pszResult ); // printf( "%s\n" ,pszResult ); } fflush( stderr ); } void ERR::Warn( char *pszMsg ) { Display( pszMsg ); } void ERR::Abort( char *pszMsg ) { Display( pszMsg ); fprintf( stderr ,"!! FATAL ERR !! aborting..." ); fflush( stderr ); exit( 1 ); } void ERR::Show( void *pMem ,char cType ,int Count ) { char szBlock[ 256 ]; char *pszBlk = szBlock; // -------------------------- switch( cType ) { case 'c': for( ; Count--; pszBlk += sprintf( pszBlk ,"%c" ,*((char *)pMem) ) ,pMem = ((char *)pMem)+1 ); Display( szBlock ); break; case 'n': for( ; Count--; pMem = ((int *)pMem)+1 ) { pszBlk += sprintf( pszBlk ," %X" ,*((int *)pMem) ); if( !(Count % 10) ) { Display( szBlock ); pszBlk = szBlock; } } if( pszBlk != szBlock ) Display( szBlock ); break; case 'l': for( ; Count--; pMem = ((long *)pMem)+1 ) { pszBlk += sprintf( pszBlk ," %lX" ,*((long *)pMem) ); if( !(Count % 10) ) { Display( szBlock ); pszBlk = szBlock; } } if( pszBlk != szBlock ) Display( szBlock ); break; case 'f': for( ; Count--; pMem = ((float *)pMem)+1 ) { pszBlk += sprintf( pszBlk ," %g" ,*((float *)pMem) ); if( !(Count % 10) ) { Display( szBlock ); pszBlk = szBlock; } } if( pszBlk != szBlock ) Display( szBlock ); break; } }