diff --git a/common/trace_helpers.cpp b/common/trace_helpers.cpp index 71384bb96b..54c1b84a3e 100644 --- a/common/trace_helpers.cpp +++ b/common/trace_helpers.cpp @@ -29,6 +29,7 @@ #include +#include const wxChar* const traceFindReplace = wxT( "KICAD_FIND_REPLACE" ); const wxChar* const kicadTraceCoords = wxT( "KICAD_COORDS" ); @@ -275,3 +276,55 @@ wxString dump( const wxKeyEvent& aEvent ) return msg; } + + +TRACE_MANAGER& TRACE_MANAGER::Instance() +{ + static TRACE_MANAGER* self = nullptr; + + if( !self ) + { + self = new TRACE_MANAGER; + self->init(); + } + + return *self; +} + +void TRACE_MANAGER::traceV( const wxString& aWhat, const wxString& aFmt, va_list vargs ) +{ + if( !m_printAllTraces ) + { + if( !m_globalTraceEnabled ) + return; + + if( m_enabledTraces.find( aWhat ) == m_enabledTraces.end() ) + return; + } + + wxString str; + str.PrintfV( aFmt, vargs ); + +#ifdef __unix__ + fprintf( stderr, " %-30s | %s", aWhat.c_str().AsChar(), str.c_str().AsChar() ); +#endif +} + +void TRACE_MANAGER::init() +{ + wxString traceVars; + m_globalTraceEnabled = wxGetEnv( wxT( "KICAD_TRACE" ), &traceVars ); + m_printAllTraces = false; + + if( !m_globalTraceEnabled ) + return; + + wxStringTokenizer tokenizer( traceVars, wxT( "," ) ); + while( tokenizer.HasMoreTokens() ) + { + wxString token = tokenizer.GetNextToken(); + m_enabledTraces[token] = true; + if( token == wxT( "all" ) ) + m_printAllTraces = true; + } +} \ No newline at end of file diff --git a/include/trace_helpers.h b/include/trace_helpers.h index d05147a171..a0566ba0f9 100644 --- a/include/trace_helpers.h +++ b/include/trace_helpers.h @@ -34,6 +34,9 @@ #include #include +#include +#include + /** * @defgroup trace_env_vars Trace Environment Variables * @@ -213,4 +216,44 @@ extern wxString dump( const wxKeyEvent& aEvent ); */ extern wxString dump( const wxArrayString& aArray ); +class TRACE_MANAGER +{ +public: + TRACE_MANAGER(){}; + ~TRACE_MANAGER(){}; + + static TRACE_MANAGER& Instance(); + + WX_DEFINE_VARARG_FUNC_VOID( Trace, 2, (const wxString, const wxFormatString&), DoTrace, + DoTraceUtf8 ) + + void DoTrace( const wxString aWhat, const wxChar* aFmt, ... ) + { + va_list argptr; + va_start( argptr, aFmt ); + traceV( aWhat, aFmt, argptr ); + va_end( argptr ); + } + +#if wxUSE_UNICODE_UTF8 + void DoTraceUtf8( const wxString aWhat, const wxChar* aFmt, ... ) + { + va_list argptr; + va_start( argptr, format ); + traceV( aWhat, aFmt, argptr ); + va_end( argptr ); + } +#endif + +private: + void traceV( const wxString& aWhat, const wxString& aFmt, va_list vargs ); + void init(); + + std::map m_enabledTraces; + bool m_globalTraceEnabled; + bool m_printAllTraces; +}; + +#define KI_TRACE( ... ) TRACE_MANAGER::Instance().Trace( __VA_ARGS__ ) + #endif // _TRACE_HELPERS_H_