/* * Copyright (C) 2007-2011 Xagasoft, All rights reserved. * * This file is part of the libbu++ library and is released under the * terms of the license contained in the file LICENSE. */ #ifndef BU_TRACE_H #define BU_TRACE_H #include #include #include #include namespace Bu { /* template void __tracer_format( t &v ) { __tracer_format( *const_cast(&v) ); } */ template void __tracer_format( const t &v ); void __tracer( const char *pf ); #define looper( vv ) \ for( ; *n; n++ ) \ { \ if( bInBracket == true ) \ { \ if( *n == '>' ) \ bInBracket = false; \ } \ else if( *n == ',' || *n == ')' ) \ { \ fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, 1, stdout ); \ fwrite("=", 1, 1, stdout); \ __tracer_format( vv ); \ s = n; \ n++; \ break; \ } \ else if( *n == '<' ) \ { \ bInBracket = true; \ } \ } (void)0 template void __tracer( const char *pf, t1 &v1 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2, t3 &v3 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); looper( v3 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2, t3 &v3, t4 &v4 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); looper( v3 ); looper( v4 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2, t3 &v3, t4 &v4, t5 &v5 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); looper( v3 ); looper( v4 ); looper( v5 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2, t3 &v3, t4 &v4, t5 &v5, t6 &v6) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); looper( v3 ); looper( v4 ); looper( v5 ); looper( v6 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } template void __tracer( const char *pf, t1 &v1, t2 &v2, t3 &v3, t4 &v4, t5 &v5, t6 &v6, t7 &v7 ) { printf("trace: "); const char *s = pf; const char *n = pf; bool bInBracket = false; looper( v1 ); looper( v2 ); looper( v3 ); looper( v4 ); looper( v5 ); looper( v6 ); looper( v7 ); fwrite( s, (ptrdiff_t)n-(ptrdiff_t)s, strlen(s), stdout ); fwrite( "\n", 1, 1, stdout ); fflush( stdout ); } #undef looper template<> void __tracer_format( const int8_t &v ); template<> void __tracer_format( const uint8_t &v ); template<> void __tracer_format( const int16_t &v ); template<> void __tracer_format( const uint16_t &v ); template<> void __tracer_format( const int32_t &v ); template<> void __tracer_format( const uint32_t &v ); template<> void __tracer_format( const int64_t &v ); template<> void __tracer_format( const uint64_t &v ); template<> void __tracer_format( const bool &v ); template<> void __tracer_format( const char &v ); template<> void __tracer_format( const long &v ); template<> void __tracer_format( const unsigned long &v ); template<> void __tracer_format( const float &v ); template<> void __tracer_format( const double &v ); template<> void __tracer_format( void * const &v ); template<> void __tracer_format( char * const &v ); template<> void __tracer_format( char ** const &v ); template<> void __tracer_format( void const * const &v ); template<> void __tracer_format( char const * const &v ); template<> void __tracer_format( char const ** const &v ); } #ifdef BU_TRACE # define TRACE(args...) Bu::__tracer( __PRETTY_FUNCTION__, ##args ) #else # define TRACE(args...) (void)0 #endif #endif