sl@0: /* Copyright (c) 2009 The Khronos Group Inc. sl@0: * Portions copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies) sl@0: * sl@0: * Permission is hereby granted, free of charge, to any person obtaining a sl@0: * copy of this software and/or associated documentation files (the sl@0: * "Materials"), to deal in the Materials without restriction, including sl@0: * without limitation the rights to use, copy, modify, merge, publish, sl@0: * distribute, sublicense, and/or sell copies of the Materials, and to sl@0: * permit persons to whom the Materials are furnished to do so, subject to sl@0: * the following conditions: sl@0: * sl@0: * The above copyright notice and this permission notice shall be included sl@0: * in all copies or substantial portions of the Materials. sl@0: * sl@0: * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, sl@0: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF sl@0: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. sl@0: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY sl@0: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, sl@0: * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE sl@0: * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. sl@0: */ sl@0: sl@0: sl@0: #include "owfdebug.h" sl@0: #ifdef DEBUG_LOG sl@0: sl@0: #include sl@0: sl@0: #include "owfdebug.h" sl@0: #include "owftypes.h" sl@0: #include "owfdebug.h" sl@0: sl@0: #ifdef __cplusplus sl@0: extern "C" { sl@0: #endif sl@0: sl@0: sl@0: #ifndef OWF_DEBUG_PREFIX sl@0: #define OWF_DEBUG_PREFIX "OWF: " sl@0: #endif sl@0: int xprintf(const char* aFormat, ...); sl@0: sl@0: /* This pair of macros are a standard trick sl@0: * to convert the content of a macro into a string after expansion sl@0: * TOSTR causes the macro to be expanded, then TOSTR2 applies quotes. sl@0: * This is used because .MMP MACRO does not consistantly process macro value quotes. sl@0: */ sl@0: #define TOSTR2(x) #x sl@0: #define TOSTR(x) TOSTR2(x) sl@0: sl@0: sl@0: /* Filters debug messages based on filename or function name. sl@0: * @param symbol the file or function name string generated by predefined macros sl@0: * @param symlen the length of the string (calculated at compile-time) sl@0: * Defining DEBUG_LOG enables all log file output. Do this in the make or .MMP file sl@0: * The file output can be filtered by filename or by function name: sl@0: * Defining DEBUG_FUNCTION=fnname will filter for all functions STARTING with the name fnname sl@0: * Defining DEBUG_FILE=filename will filter for all functions ending with the name filename sl@0: * sl@0: * These filters utilise the predefined macros __FILE__ and __FUNCTION__ which are defined in current standards, sl@0: * but may contain platform-specific features such as path names, or linkage decoration, sl@0: * so the filter-string may require some platform-specific tuning. sl@0: * sl@0: * Note that use of #pragma message may also be platform-specific, and is only present in order to sl@0: * print clues about the format of the __FILE__ and __FUNCTION__ macros. sl@0: */ sl@0: int OWF_Debug_DoLog(const char* symbol,int symlen) sl@0: { sl@0: #if defined(DEBUG_LOG_FILE) sl@0: #pragma message ("DEBUG filter DEBUG_FILE= '" TOSTR(DEBUG_FILE) "' eg= '" __FILE__ "'") sl@0: if (symlen>=(sizeof(TOSTR(DEBUG_FILE))-1)) sl@0: { sl@0: return strncmp( symbol+symlen-(sizeof(TOSTR(DEBUG_FILE))-1) , TOSTR(DEBUG_FILE) , sizeof(TOSTR(DEBUG_FILE))-1 )==0; sl@0: } sl@0: else sl@0: return 0; sl@0: #elif defined(DEBUG_LOG_FUNCTION) sl@0: #pragma message("DEBUG filter DEBUG_FUNCTION= '" TOSTR(DEBUG_FUNCTION) "' eg= '" __FUNCTION__ "'") sl@0: if (symlen>=(sizeof(TOSTR(DEBUG_FILE))-1)) sl@0: { sl@0: return(strncmp(TOSTR(DEBUG_FUNCTION),symbol,sizeof(TOSTR(DEBUG_FUNCTION))-1)==0); sl@0: } sl@0: else sl@0: return 0; sl@0: #else sl@0: (void)symbol; sl@0: (void)symlen; sl@0: return 1; sl@0: #endif sl@0: sl@0: } sl@0: sl@0: void OWF_Debug_Print(const char* format, ...) sl@0: { sl@0: va_list ap; sl@0: char __spager[512]; sl@0: sl@0: va_start(ap, format); sl@0: __spager[0] = 0; sl@0: vsnprintf(__spager, 511, format, ap); sl@0: xprintf("%s %s\n", OWF_DEBUG_PREFIX, __spager); sl@0: va_end(ap); sl@0: } sl@0: sl@0: sl@0: void OWF_Debug_Trace(const char* fmt, ...) sl@0: { sl@0: fmt = fmt; sl@0: } sl@0: sl@0: sl@0: sl@0: void OWF_Debug_TraceIndent() sl@0: { sl@0: } sl@0: sl@0: void OWF_Debug_TraceUndent() sl@0: { sl@0: } sl@0: sl@0: void OWF_Debug_TraceEnter(const char* func) sl@0: { sl@0: if (func) sl@0: { sl@0: OWF_Debug_Trace("ENTER %s", func); sl@0: } sl@0: OWF_Debug_TraceIndent(); sl@0: } sl@0: sl@0: void OWF_Debug_TraceExit(const char* func) sl@0: { sl@0: OWF_Debug_TraceUndent(); sl@0: if (func) sl@0: { sl@0: OWF_Debug_Trace("EXIT %s", func); sl@0: } sl@0: } sl@0: sl@0: sl@0: #ifdef __cplusplus sl@0: } sl@0: #endif sl@0: sl@0: #else sl@0: sl@0: sl@0: #endif /* DEBUG */