#ifndef _KVI_DEBUG_H_ #define _KVI_DEBUG_H_ //============================================================================= // // File : kvi_debug.h // Creation date : Fri Mar 19 1999 03:10:39 CEST by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution // Copyright (C) 1999-2010 Szymon Stefanek (pragma at kvirc dot net) // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include #include "kvi_sysconfig.h" /** * \file kvi_debug.h * \author Szymon Stefanek * \brief This file contains the definition of the debug macros; */ #include // abort #ifdef __GNUC__ #define kvi_debug(fmt, arg...) qDebug(fmt, ##arg) #define kvi_warning(fmt, arg...) qWarning(fmt, ##arg) #define kvi_fatal(fmt, arg...) \ do \ { \ qFatal(fmt, ##arg); \ abort(); \ } while(0) #define KVI_PRETTY_FUNCTION __PRETTY_FUNCTION__ #else //!__GNUC__ // assume MSVC #define kvi_debug(fmt, ...) qDebug(fmt, __VA_ARGS__) #define kvi_warning(fmt, ...) qWarning(fmt, __VA_ARGS__) #define kvi_fatal(fmt, ...) \ do \ { \ qFatal(fmt, __VA_ARGS__); \ abort(); \ } while(0) #define KVI_PRETTY_FUNCTION __FUNCTION__ #endif //!__GNUC__ #ifdef COMPILE_DEBUG_MODE #define KVI_ASSERT(condition) \ do \ { \ if(!(condition)) \ qFatal("[ASSERT FAILED] (" #condition ") in %s at %s:%u", KVI_PRETTY_FUNCTION, __FILE__, __LINE__); \ } while(0) #define KVI_ASSERT_MSG(condition, message) \ do \ { \ if(!(condition)) \ { \ qFatal("[ASSERT FAILED] (" #condition ") in %s at %s:%u", KVI_PRETTY_FUNCTION, __FILE__, __LINE__); \ qFatal("[ASSERT FAILED] " message); \ } \ } while(0) #include "KviDebugContext.h" // The following two macros are used to create unique variable names // by the means of the __LINE__ builtin macro. // The ## token paste operator must be called inside a macro and must // precede a macro parameter. This is why we can't use directly // // #define UNIQUEVARIABLE int name ## __LINE__ // // We need something like // // #define PASTE(x,y) x ## y // #define UNIQUEVARIABLE int PASTE(x,__LINE__) // // But this doesn't work since the specification of the token pasting operator is // // "If a formal parameter in a macro definition is preceded or followed by the token-pasting operator, // the formal parameter is immediately replaced by the __unexpanded__ actual argument. Macro expansion // is __not performed__ on the argument prior to replacement." // // So to actually have __LINE__ expanded we need another level of indirection // // #define PASTE(x,y) x ## y // #define EXPAND_Y_AND_THEN_PASTE(x,y) PASTE(x,y) // #define UNIQUEVARIABLE int EXPAND_Y_AND_THEN_PASTE(x,__LINE__) #define KVI_TRACE_HACK_TOKENPASTE_2(x, y) x##y #define KVI_TRACE_HACK_TOKENPASTE_1(x, y) KVI_TRACE_HACK_TOKENPASTE_2(x, y) #ifdef __GNUC__ #define KVI_TRACE_FUNCTION \ KviDebugContext KVI_TRACE_HACK_TOKENPASTE_1(ctx, __LINE__)(__PRETTY_FUNCTION__) #define KVI_TRACE_BLOCK(_szBlockDescription) \ KviDebugContext KVI_TRACE_HACK_TOKENPASTE_1(ctx, __LINE__)("%s - %s", __PRETTY_FUNCTION__, _szBlockDescription) #define KVI_TRACE(_szFmt, arg...) KviDebugContext::trace(_szFmt, ##arg) #else #define KVI_TRACE_FUNCTION \ KviDebugContext KVI_TRACE_HACK_TOKENPASTE_1(ctx, __LINE__)(__FUNCTION__) #define KVI_TRACE_BLOCK(_szBlockDescription) \ KviDebugContext KVI_TRACE_HACK_TOKENPASTE_1(ctx, __LINE__)("%s - %s", __FUNCTION__, _szBlockDescription) #define KVI_TRACE(_szFmt, ...) KviDebugContext::trace(_szFmt, __VA_ARGS__) #endif #else //!COMPILE_DEBUG_MODE #define KVI_ASSERT(condition) \ do \ { \ } while(0) #define KVI_ASSERT_MSG(condition, message) \ do \ { \ } while(0) #define KVI_TRACE_FUNCTION \ do \ { \ } while(0) #define KVI_TRACE_BLOCK(_szBlockDescription) \ do \ { \ } while(0) #ifdef __GNUC__ #define KVI_TRACE(_szFmt, arg...) \ do \ { \ } while(0) #else #define KVI_TRACE(_szFmt, ...) \ do \ { \ } while(0) #endif #endif //!COMPILE_DEBUG_MODE #endif //_KVI_DEBUG_H_