1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License. 6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at 7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * http://www.apache.org/licenses/LICENSE-2.0 9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software 11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS, 12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and 14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License. 15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picodbg.h 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Provides functions and macros to debug the Pico system and to trace 21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the execution of its code. 22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved. 25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History: 27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version 28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picodbg 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------\n 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico Debug Support </b>\n 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------\n 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * GENERAL REMARKS 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * --------------- 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * This module provides a set of macros to help debug the Pico system. 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * The usage of macros allows for completely removing debug code from 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the binaries delivered to customers. To enable diagnostic output 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the preprocessor symbol PICO_DEBUG has to be defined. 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By using global variables (to store the current log level etc.) 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * this module violates a basic Pico design principle! 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Justification:\n 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - going without global data would reduce the functionality 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * of this module considerably (e.g., log level could not be 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * changed at runtime etc.) 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - at the moment, the only known system interdicting global 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * variables is Symbian; but even there global variables are 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * possible by using thread-local storage 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - allocating global data on the heap would require to pass 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * a handle to this memory block to all routines of this 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * module which in turn implies that _every_ function in the 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Pico system would require a pointer to some global data; 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * obviously, this would be very awkward 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Furthermore, this module uses the non-standardized but handy 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * __FUNCTION__ macro. It expands to the name of the enclosing 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * function. For compilers not supporting this macro simply 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * define __FUNCTION__ as an empty string. 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * INITIALIZATION/TERMINATION\n 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * --------------------------\n 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Before using any debug macros, this module has to be initialized 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * by calling PICODBG_INITIALIZE(). If the routines are not needed 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * anymore, PICODBG_TERMINATE() has to be called to terminate the 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * module (e.g., to close the log file). 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * TRACING\n 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -------\n 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Each tracing message is associated with a log level which describes 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * its severity. The following levels are supported: 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Trace - Very detailed log messages, potentially of a high 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * frequency and volume 78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Debug - Less detailed and/or less frequent debugging messages 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Info - Informational messages 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Warn - Warnings which don't appear to the Pico user 81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - Error - Error messages 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Tracing messages can use the well-known printf format specification. 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * But because variadic macros (macros with a variable no. arguments) 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * are not commonly supported by compilers a little trick is used 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * which requires the format string and its arguments to be enclosed 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * in double parenthesis: 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - PICODBG_INFO(("hello, world!")); 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - PICODBG_TRACE(("argc=%d", argc)); 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ... 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Each tracing message is expected to be a single line of text. Some 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * contextual information (e.g., log level, time and date, source file 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * and line number) and a newline are automatically added. The output 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * format can be customized by a call to PICODBG_SET_OUTPUT_FORMAT(). 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Sample output: 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - *** info|2008-04-03|14:51:36|dbgdemo.c(15)|hello world 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - *** trace|2008-04-03|14:51:36|dbgdemo.c(16)|argc=2 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - ... 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * To compose a tracing message line consisting of, e.g. the elements 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * of an array, on the Info level two additional macros shown in the 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * following example are provided: 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICODBG_INFO_CTX();\n 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * for (i = 0; i < len; i++)\n 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ...some calc with arr and i\n 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICODBG_INFO_MSG((" %d", arr[i]));\n 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * }\n 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICODBG_INFO_MSG(("\n"));\n 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Colored output of tracing messages helps to capture severe problems 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * quickly. This feature is supported on the Windows platform and on 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * platforms supporting ANSI escape codes. PICODBG_ENABLE_COLORS() lets 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you turn on and off colored output. 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * FILTERING\n 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------\n 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By calling PICODBG_SET_LOG_LEVEL() the log level may be changed at 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * any time to increase/decrease the amount of debugging output. 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By calling PICODBG_SET_LOG_FILTERFN() the log filter may be changed 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * at any time to change the source file name being used as filter for 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * log messages (ie. only tracing info of the specified file will be 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * logged). To disable the file name based filter set the filter file 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * name to an empty string. 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Future version of this module might provide further filtering 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * possibilities (e.g., filtering based on function names * etc.). 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * LOGGING\n 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -------\n 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * By default, tracing messages are output to the console (stderr). 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * This allows for separating diagnostic output from other console 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * output to stdout. In addition, tracing messages may be saved to 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * a file by calling PICODBG_SET_LOG_FILE(). 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Currently, file output is the only additional output target; but 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * on embedded systems, more output targets may be required (e.g., 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * sending output to a serial port or over the network). 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ASSERTIONS\n 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ----------\n 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * To support the 'design/programming by contract' paradigm, this 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * module also provides assertions. PICODBG_ASSERT(expr) evualuates 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * an expression and, when the result is false, prints a diagnostic 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * message and aborts the program. 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * FUTURE EXTENSIONS\n 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * -----------------\n 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - advanced tracing functions to dump complex data 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - debug memory allocation that can be used to assist in 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * finding memory problems 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if !defined(__PICODBG_H__) 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define __PICODBG_H__ 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Not all compilers support the __FUNCTION__ macro */ 174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if !defined(__FUNCTION__) && !defined(__GNUC__) 175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define __FUNCTION__ "" 176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Log levels sorted by severity */ 180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_ERROR 1 181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_WARN 2 182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_INFO 3 183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_DEBUG 4 184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG_LEVEL_TRACE 5 185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Output format flags */ 187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_LEVEL 0x0001 188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_DATE 0x0002 189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_TIME 0x0004 190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCNAME 0x0008 191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCLINE 0x0010 192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_SRCALL (PICODBG_SHOW_SRCNAME | PICODBG_SHOW_SRCLINE) 193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_FUNCTION 0x0020 194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SHOW_POS (PICODBG_SHOW_SRCALL | PICODBG_SHOW_FUNCTION) 195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* definition of PICO_DEBUG enables debugging code */ 197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG) 198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INITIALIZE(level) \ 200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_initialize(level) 201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TERMINATE() \ 203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_terminate() 204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_LEVEL(level) \ 206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_setLogLevel(level) 207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILTERFN(name) \ 209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_setLogFilterFN(name) 210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILE(name) \ 212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_setLogFile(name) 213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ENABLE_COLORS(flag) \ 215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_enableColors(flag) 216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_OUTPUT_FORMAT(format) \ 218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_setOutputFormat(format) 219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT(expr) \ 222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (;!(expr);picodbg_assert(__FILE__, __LINE__, __FUNCTION__, #expr)) 223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT_RANGE(val, min, max) \ 225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ASSERT(((val) >= (min)) && ((val) <= (max))) 226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG(level, msg) \ 229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_log(level, 1, __FILE__, __LINE__, __FUNCTION__, picodbg_varargs msg) 230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ERROR(msg) \ 232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_LOG(PICODBG_LOG_LEVEL_ERROR, msg) 233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_WARN(msg) \ 235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_LOG(PICODBG_LOG_LEVEL_WARN, msg) 236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO(msg) \ 238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_LOG(PICODBG_LOG_LEVEL_INFO, msg) 239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_DEBUG(msg) \ 241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_LOG(PICODBG_LOG_LEVEL_DEBUG, msg) 242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TRACE(msg) \ 244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_LOG(PICODBG_LOG_LEVEL_TRACE, msg) 245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_CTX() \ 248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_log(PICODBG_LOG_LEVEL_INFO, 0, __FILE__, __LINE__, __FUNCTION__, "") 249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG(msg) \ 251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_log_msg(PICODBG_LOG_LEVEL_INFO, __FILE__, picodbg_varargs msg) 252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG_F(filterfn, msg) \ 254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodbg_log_msg(PICODBG_LOG_LEVEL_INFO, (const char *)filterfn, picodbg_varargs msg) 255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* helper routines; should NOT be used directly! */ 259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_initialize(int level); 261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_terminate(); 262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogLevel(int level); 264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogFilterFN(const char *name); 265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setLogFile(const char *name); 266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_enableColors(int flag); 267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_setOutputFormat(unsigned int format); 268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenconst char *picodbg_varargs(const char *format, ...); 270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_log(int level, int donewline, const char *file, int line, 272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const char *func, const char *msg); 273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_assert(const char *file, int line, const char *func, 274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const char *expr); 275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodbg_log_msg(int level, const char *file, const char *msg); 277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#else /* release version; omit debugging code */ 280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INITIALIZE(level) 282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TERMINATE() 283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_LEVEL(level) 284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILTERFN(name) 285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_LOG_FILE(name) 286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ENABLE_COLORS(flag) 287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_SET_OUTPUT_FORMAT(format) 288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT(expr) 290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ASSERT_RANGE(val, min, max) 291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_LOG(level, msg) 293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_ERROR(msg) 294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_WARN(msg) 295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO(msg) 296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_DEBUG(msg) 297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_TRACE(msg) 298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_CTX() 300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG(msg) 301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICODBG_INFO_MSG_F(filterfn, msg) 302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* defined(PICO_DEBUG) */ 305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* !defined(__PICODBG_H__) */ 312