#ifndef __BASE_TRACE_H__ #define __BASE_TRACE_H__ namespace Trace { class Scope; void initializeLog(const char*); void rolloverLog(); void logSection(const char*); void cleanupLog(void); void setFilter(const char*); void logPrint(const char*,...); void logString(const char*,const char*); void logBuffer(const char*,const char*,unsigned); void logText(const char*,const char*); const char* getFilter(); void assertAt(const char*,unsigned,const char*); } ; class Trace::Scope { public: Scope(const char*); Scope(const char*,const char*); Scope(const char*,const char*,const char*); ~Scope(); private: const char* m_sOuter; }; /* Logging calls always compiled into release. */ #define LOG_API_FN(FN) \ Trace::Scope _fn_(#FN) #define LOG_API_S(S) \ if (S) { Trace::logString("A " #S,(const char*)(S)); } #define LOG_API_X(X) \ /*if (X)*/ { Trace::logPrint("A " #X " : 0x%lx",(long)(X)); } #define LOG_API_N(N) \ /*if (N)*/ { Trace::logPrint("A " #N " : %lu",(long)(N)); } /* Trace calls only compiled into DEBUG version. */ #ifdef NDEBUG #define TRACE_API(FN) #define TRACE_FN(FN) #define TRACE_PRINT(L) #define TRACE_BUFFER(A,B,N) #define TRACE_HERE() #else #define TRACE_API(FN) Trace::logSection(#FN) #define TRACE_FN(FN) Trace::Scope _fn_(#FN) #define TRACE_PRINT(L) Trace::logPrint L #define TRACE_BUFFER(A,B,N) Trace::logBuffer(A,B,N) #define TRACE_TEXT(A,B) Trace::logText(A,B) #define TRACE_HERE() Trace::logPrint("* " __FILE__ "(%d)",__LINE__) #endif #define TRACE_S(S) \ if (S) { TRACE_PRINT(("a " #S " : \"%s\"",(S))); } #define TRACE_X(X) \ /*if (X)*/ { TRACE_PRINT(("a " #X " : 0x%lx",(long)(X))); } #define TRACE_N(N) \ /*if (N)*/ { TRACE_PRINT(("a " #N " : %lu",(long)(N))); } #endif